Может ли IE манипулировать XML с помощью jQuery? - PullRequest
12 голосов
/ 22 февраля 2011

Что я не пытаюсь сделать:

  • Просто "читайте" XML в IE, используя jQuery. Был там, сделал это. Работает по большей части.
  • Загрузка XML через AJAX. Это устаревшая система, использующая XML в скрытом поле (о да, детка!) Между постбеками для хранения структуры данных мастера. Переписать это было бы отстой.

Что я пытаюсь сделать:

  • Манипулирование XML-документом с использованием jQuery в IE
  • Используйте один и тот же код во всех браузерах, используя встроенную функциональность jQuery

С чем бы я был в порядке:

  • Переопределение / перегрузка одних и тех же методов jquery, чтобы заставить их работать в IE при манипулировании XML DOM.

Это просто не работает, и я чувствую, что это невозможно в 100% -ном кросс-браузерном использовании старых методов jQuery.

Показательный пример:

<code><!DOCTYPE html>
<html>
<head>
    <title>IE Sucks</title>
    <script src="Scripts/jquery-1.5.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        var xml =
            '<Browsers>' +
                '<CoolBrowsers>' +
                    '<Browser name="Opera"></Browser>' +
                    '<Browser name="Chrome"></Browser>' +
                    '<Browser name="Firefox"></Browser>' +
                '</CoolBrowsers>' +
                '<BadBrowsers>' +
                    '<Browser name="IE6"></Browser>' +
                '</BadBrowsers>' +
            '</Browsers>';

        $(function () {

            $("#xml").text(xml);

            var uncoolBrowser = $("<Browser />").attr("name", "IE7");

            // In 1.5, using this...
            var $xml = $($.parseXML(xml));

            // Nope. Works everywhere else, though!
            // var $xml = $(xml);     


            // Throws a "Type mismatch"
            // Works everywhere except IE
            // This is case sensitive (??? WTF ???)
            // Lowercase "badbrowsers" nothing happens
            // Uppercase "BADBROWSERS" nothing happens
            // Best part? $xml.find("BadBrowsers").length === 1
            $xml.find("BadBrowsers").append(uncoolBrowser);

            // Only way to output XML in IE
            $("#result").text($xml[0].xml);

            // Fuggetaboutit
            // Technically, it does work in IE but not when using $.parseXML()
            // $("#result").text($("<div></div>").append($xml.clone()).html());
        });
    </script>
</head>
<body>
    <pre id="xml">
 

Возможно ли это? Может ли этот простой сценарий быть реализован или IE просто оставил нас всех? $(xml).everything и т. Д. Работает в FF, Opera, Chrome и Safari.

Обновление

Можно использовать магию вуду.

Я создал плагин jQuery , который заботится о согласовании различий между различными браузерами, обрабатывающими XML. Я также сделал функцию .xml(), основанную на аналогичном коде в другом месте, хотя мой исправляет проблему только с IE. Это работает во всех браузерах, IE7 и IE8 точно, не может протестировать IE6.

Я разместил это на своем github. Если у кого-то есть предложения или улучшения, дайте мне знать. Есть несколько вещей, с которыми я уже столкнулся, но я исправлял их, сталкиваясь с ними.

1 Ответ

0 голосов
/ 22 февраля 2011

Это скорее предположение, так как я не знаю, что делает .parseXml, но IE требует createElement для неизвестных имен узлов. Можете ли вы попробовать document.createElement('BadBrowsers') для каждого нового узла, которым вы собираетесь манипулировать?

Так обстоит дело с HTML5, и поэтому есть сценарии Shiv. Вы можете попробовать просто взять это:

http://html5shiv.googlecode.com/svn/trunk/html5.js

Копируя его, добавьте новые имена узлов к var z, а затем:

<!--[if lt IE 9]>
<script src="file.js"></script>
<![endif]-->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...