当你在IE浏览器的DOM节点的innerHTML,如果没有空格的属性值,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?
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"
Ah, the joy of trying to use XHTML in a browser that doesn't support it.
I'd just accept that you are going to get HTML back from the browser and put something in front of your XML processor that can input tag soup and output XHTML — HTML Tidy for example.
我就遇到了这个完全相同的问题只是在一年前,并使用解决它InnerXHTML ,被人远远比我聪明写了一个自定义脚本。 它基本上的innerHTML的定制版本,返回标准加价。
我测试过这一点,它适用于大多数的属性,除了那些复姓,如class =日 - 月 - 标题。 它忽略这些属性,不说出来了。
我可能是夫妻一年为时已晚,但在这里不用。 接受的答案可能会做什么承诺,但它已经星期五下午,我需要更简单的东西,也没有我有时间去它通过。 因此,这里是我的版本,这将只是引用属性值W / O引号,它应该是非常容易的把它扩大。
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;
});
有一个快速和肮脏的办法解决这个问题。 我使用jQuery模板工作时使用它。 只需添加一个尾随的空间属性的值。 当然,这不会使与在本例中使用ID多大意义,所以这里涉及的jQuery和jQuery模板另一个例子:
http://jsfiddle.net/amamaenko/dW7Wh/5/
注意在该行结尾间隔<input value="${x} "/>
没有它,例如不会在IE工作。
你使用jQuery试过吗?
alert($('#div1').html());