То, что я не пытаюсь сделать:
- Просто "прочитайте" XML в IE, используя jQuery. Был там, сделал это. Работает по большей части.
- Загрузите XML через AJAX. Это устаревшая система, использующая XML в скрытом поле (oh yah, baby!) Между postbacks для хранения структуры данных мастера. Переписывать его было бы сосать.
То, что я пытаюсь сделать:
- Манипулировать XML-документ с помощью jQuery в IE
- Использовать тот же код во всех браузерах, используя встроенную функциональность jQuery
Что мне было бы хорошо:
- Переопределение/перегрузка тех же методов jquery, чтобы заставить их работать в IE при манипулировании XML DOM.
Это просто не работает, и я чувствую, что это просто невозможно в 100% -ном перекрестном браузере, используя простые старые методы jQuery.
Пример:
<!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"></pre>
<pre id="result"></pre>
</body>
</html>
Возможно ли это? Может ли этот простой сценарий быть выполнен или IE просто оставил нас всех? $(xml).everything
и т.д. работает в FF, Opera, Chrome и Safari.
Обновление
Можно использовать магию вуду.
Я создал плагин jQuery, который заботится о согласовании различий между различными обработками браузера XML. Я также создал функцию .xml()
, основанную на аналогичном коде в другом месте, хотя моя проблема устраняет только IE. Это работает во всех браузерах, IE7 и IE8, конечно, не может проверить IE6.
Я разместил это на своем github. Если у кого есть предложения или улучшения, дайте мне знать. Есть несколько вещей, с которыми я уже сталкивался, но я исправлял их, когда сталкивался с ними.