AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
  • Консалтинг
  • Проектирование
  • Разработка
  • Обучение


MVP 2010, 2011
Оценить эту запись

Кросбраузерный CRM. Последняя капля

Запись от Артем Enot Грунин размещена 28.11.2013 в 12:22
Обновил(-а) Артем Enot Грунин 02.12.2013 в 14:57

Вчера пролилась последняя капля моей крови в борьбе за кросбраузерность моего решения на 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
Размещено в CRM
Просмотров 19008 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:27.