![]() |
#1 |
Участник
|
axforum blogs: Кросбраузерный CRM. Последняя капля
Источник: http://axforum.info/forums/blog.php?b=6402
============== Вчера пролилась последняя капля моей крови в борьбе за кросбраузерность моего решения на CRM… В одном из своих прошлых постов этой серии Кросбраузерный CRM. Первая кровь... я писал о врожденных изъянах InternetExplorer при работе с XPath. Выяснилось, что объект 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) {} } Возвращенный MSXML документ, действительно реализует старые добрые функции, однако это есть еще один сюрприз. Выясняется, что в новой редакции эти методы внезапно прониклись поддержкой XML нейспейсов, в чем не были замечены раньше. В итоге, обрабатывать результат теперь тоже приходится по-другому: 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"); } } } Мораль: будь проклят тот день, когда я связался с XPath. Удачного кодинга Полезные ссылки: http://stackoverflow.com/questions/1...plorer-10-gone http://blogs.msdn.com/b/ie/archive/2...e-preview.aspx Источник: http://axforum.info/forums/blog.php?b=6402
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
|