Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Кросбраузерный CRM. Последняя капля
Запись от Артем Enot Грунин размещена 28.11.2013 в 12:22
Обновил(-а) Артем Enot Грунин 02.12.2013 в 14:57
Обновил(-а) Артем Enot Грунин 02.12.2013 в 14:57
Теги crossbrowser, firefox, ie10, java script
Вчера пролилась последняя капля моей крови в борьбе за кросбраузерность моего решения на CRM… В одном из своих прошлых постов этой серии Кросбраузерный CRM. Первая кровь... я писал о врожденных изъянах InternetExplorer при работе с XPath.
Выяснилось, что объект XMLHttpRequest в IE10+ стал возвращать наивный XML вместо, MSXML как это было ранее. В результате у него отпали MS методы selectNodes, но почему-то так и не вырос стандартный метод evaluate. Различные рекомендуемые альтернативы, такие как Wicked Good XPath не принесли желаемого результата. Мне так не удалось заставить работать с этой библиотекой существующий код под FireFox - XPath запрос не возвращает результаты.
К счастью, выяснилось, что все же существует включаемая обратная совместимость, позволяющая вернуть selectSingleNode на его историческую родину. Для этого, объекту XMLHttpRequest необходимо задать свойство responseType = "msxml-document". Интересный нюанс заключается в том, что XMLHttpRequest готов сожрать этот параметр не в любой момент, а только в некоторых из состояний. Более того, в разных версиях реализации, он может попытаться сблевать некорректно заданный responseType. В итоге, ваш код должен выглядеть как-то так:
Возвращенный MSXML документ, действительно реализует старые добрые функции, однако, есть еще один сюрприз. Выяснилось, что в новой редакции, старые методы внезапно прониклись поддержкой XML нейспейсов, в чем не были замечены раньше. В итоге, обрабатывать результат теперь тоже приходится по-другому:
Мораль: будь проклят тот день, когда я связался с XPath. Удачного кодинга
Полезные ссылки:
http://stackoverflow.com/questions/1...plorer-10-gone
http://blogs.msdn.com/b/ie/archive/2...e-preview.aspx
Выяснилось, что объект XMLHttpRequest в IE10+ стал возвращать наивный XML вместо, MSXML как это было ранее. В результате у него отпали MS методы selectNodes, но почему-то так и не вырос стандартный метод evaluate. Различные рекомендуемые альтернативы, такие как Wicked Good XPath не принесли желаемого результата. Мне так не удалось заставить работать с этой библиотекой существующий код под FireFox - XPath запрос не возвращает результаты.
К счастью, выяснилось, что все же существует включаемая обратная совместимость, позволяющая вернуть selectSingleNode на его историческую родину. Для этого, объекту XMLHttpRequest необходимо задать свойство responseType = "msxml-document". Интересный нюанс заключается в том, что XMLHttpRequest готов сожрать этот параметр не в любой момент, а только в некоторых из состояний. Более того, в разных версиях реализации, он может попытаться сблевать некорректно заданный responseType. В итоге, ваш код должен выглядеть как-то так:
X++:
var req = new XMLHttpRequest(); req.open("POST", this._SoapPath(), true) // Затычка для IE10+ if (typeof (document.evaluate) == "undefined") { try { req.responseType = "msxml-document"; } catch (e) {} }
X++:
function selectSingleNode(xmlDoc, elementPath, node) { if (xmlDoc.evaluate) { function nsResolver(prefix) { var ns = { "s": "http://schemas.xmlsoap.org/soap/envelope/", "i": "http://www.w3.org/2001/XMLSchema-instance", "a": "http://schemas.microsoft.com/xrm/2011/Contracts", "b": "http://schemas.microsoft.com/xrm/2011/Contracts", "c": "http://schemas.datacontract.org/2004/07/System.Collections.Generic", "d": "http://www.w3.org/2001/XMLSchema" }; return ns[prefix] || null; } var nodes = xmlDoc.evaluate(elementPath, node || xmlDoc, nsResolver, XPathResult.ANY_TYPE, null); var results = nodes.iterateNext(); return results; } else { try { var ns = "xmlns:s='http://schemas.xmlsoap.org/soap/envelope/' "; ns += "xmlns:i='http://www.w3.org/2001/XMLSchema-instance' "; ns += "xmlns:a='http://schemas.microsoft.com/xrm/2011/Contracts' "; ns += "xmlns:b='http://schemas.microsoft.com/xrm/2011/Contracts' "; ns += "xmlns:c='http://schemas.datacontract.org/2004/07/System.Collections.Generic' "; ns += "xmlns:d='http://www.w3.org/2001/XMLSchema' "; xmlDoc.setProperty("SelectionNamespaces", ns); return (node || xmlDoc).selectSingleNode(elementPath); } catch (e) { throw new Error("No XPath Support"); } } }
Полезные ссылки:
http://stackoverflow.com/questions/1...plorer-10-gone
http://blogs.msdn.com/b/ie/archive/2...e-preview.aspx
Всего комментариев 0