InnerHTML удаляет кавычки атрибутов в Internet Explorer
Когда вы получите innerHTML DOM node в IE, если в значении атрибута нет пробелов, IE удалит кавычки вокруг него, как показано ниже:
<html>
<head>
<title></title>
</head>
<body>
<div id="div1"><div id="div2"></div></div>
<script type="text/javascript">
alert(document.getElementById("div1").innerHTML);
</script>
</body>
</html>
В IE предупреждение будет читать:
<DIV id=div2></DIV>
Это проблема, потому что я передаю это процессору, который требует действительного XHTML, и все значения атрибутов должны быть указаны. Кто-нибудь знает простой способ обойти это поведение в IE?
Ответы
Ответ 1
IE innerHTML очень раздражает. Я написал эту функцию для нее, что может быть полезно? Он цитирует атрибуты и устанавливает тэги в нижний регистр. Кстати, чтобы сделать его еще более раздражающим, IE innerHTML не удаляет кавычки из нестандартных атрибутов.
Изменить на основе комментариев
Теперь функция обрабатывает больше символов в значениях атрибутов и, возможно, преобразует значения атрибутов в нижний регистр. Теперь функция выглядит еще более уродливой: ~). Если вы хотите добавить или удалить символы в уравнение, отредактируйте часть [a-zA-Z\.\:\[\]_\(\)\&\$\%#\@\!0-9]+[?\s+|?>]
регулярных выражений.
function ieInnerHTML(obj, convertToLowerCase) {
var zz = obj.innerHTML ? String(obj.innerHTML) : obj
,z = zz.match(/(<.+[^>])/g);
if (z) {
for ( var i=0;i<z.length;(i=i+1) ){
var y
,zSaved = z[i]
,attrRE = /\=[a-zA-Z\.\:\[\]_\(\)\&\$\%#\@\!0-9\/]+[?\s+|?>]/g
;
z[i] = z[i]
.replace(/([<|<\/].+?\w+).+[^>]/,
function(a){return a.toLowerCase();
});
y = z[i].match(attrRE);
if (y){
var j = 0
,len = y.length
while(j<len){
var replaceRE =
/(\=)([a-zA-Z\.\:\[\]_\(\)\&\$\%#\@\!0-9\/]+)?([\s+|?>])/g
,replacer = function(){
var args = Array.prototype.slice.call(arguments);
return '="'+(convertToLowerCase
? args[2].toLowerCase()
: args[2])+'"'+args[3];
};
z[i] = z[i].replace(y[j],y[j].replace(replaceRE,replacer));
j+=1;
}
}
zz = zz.replace(zSaved,z[i]);
}
}
return zz;
}
Примеры пар ключ-значение, которые должны работать
data-mydata=return[somevalue] => data-mydata="return[somevalue]"
id=DEBUGGED:true => id="DEBUGGED:true" (or id="debugged:true" if you use the convertToLowerCase parameter)
someAttribute=Any.Thing.Goes => someAttribute="Any.Thing.Goes"
Ответ 2
А, радость от попыток использовать XHTML в браузере, который его не поддерживает.
Я бы просто согласился с тем, что вы вернете HTML из браузера и поместите что-то перед своим XML-процессором, который может вводить суп-суп и выводить XHTML - HTML Tidy, например.
Ответ 3
Я столкнулся с этой же проблемой чуть более года назад и решил ее с помощью InnerXHTML, пользовательский script написан кем-то гораздо умнее меня. В основном это пользовательская версия innerHTML, которая возвращает стандартную разметку.
Ответ 4
Я тестировал это, и он работает для большинства атрибутов, кроме тех, которые переносятся с дефисами, например class= day-month-title. Он игнорирует эти атрибуты и не цитирует их.
Ответ 5
Я мог бы быть на пару лет слишком поздно, но здесь. Принятый ответ мог бы сделать то, что он promises, но уже в пятницу днем, и мне нужно что-то более простое, и у меня нет времени пройти. Итак, здесь моя версия, которая будет просто указывать значения атрибутов без кавычек, и это должно быть довольно тривиально, чтобы расширить ее.
var t = "<svg id=foobar height=\"200\" width=\"746\"><g class=rules>";
t.replace(/([\w-]+)=([\w-]+)([ >])/g, function(str, $n, $v, $e, offset, s) {
return $n + '="' + $v + '"' + $e;
});
Ответ 6
Существует быстрое и грязное решение этой проблемы. Я использовал его при работе с шаблонами jQuery. Просто добавьте конечное пространство к значению атрибута.
Конечно, это не имеет большого смысла с идентификатором, который используется в примере, так что вот еще один пример с участием jQuery и шаблонов jQuery:
http://jsfiddle.net/amamaenko/dW7Wh/5/
Обратите внимание на конечное пространство в строке <input value="${x} "/>
без него, пример не будет работать в IE.
Ответ 7
Вы пытались с jquery?
alert($('#div1').html());