13

在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 中解决这种行为的简单方法?

4

7 回答 7

17

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"
于 2009-08-05T11:26:26.240 回答
5

啊,尝试在不支持 XHTML 的浏览器中使用 XHTML 的乐趣。

我只是接受您将从浏览器中获取 HTML 并在您的 XML 处理器前面放置一些东西,该处理器可以输入标签汤并输出 XHTML——例如HTML Tidy 。

于 2009-08-05T11:59:01.463 回答
3

一年多前我遇到了同样的问题,并使用InnerXHTML解决了它,这是一个由比我聪明得多的人编写的自定义脚本。它基本上是返回标准标记的 innerHTML 的自定义版本。

于 2009-08-05T08:03:29.767 回答
3

我可能晚了几年,但这里是。接受的答案可能会实现它的承诺,但已经是星期五下午了,我需要一些更简单的东西,也没有时间完成它。所以这是我的版本,它只引用不带引号的属性值,扩展它应该很简单。

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;
});
于 2011-10-07T13:27:44.000 回答
2

我已经对此进行了测试,它适用于大多数属性,但带有连字符的属性除外,例如 class=day-month-title。它忽略这些属性,并且不引用它们。

于 2009-09-17T03:40:29.193 回答
0

这个问题有一个快速而肮脏的解决方法。我在使用 jQuery 模板时使用它。只需在属性值中添加一个尾随空格。当然这对于示例中使用的 id 没有多大意义,所以这里是另一个涉及 jQuery 和 jQuery 模板的示例:

http://jsfiddle.net/amamaenko/dW7Wh/5/

注意没有它的行中的尾随空格<input value="${x} "/>,该示例不适用于 IE。

于 2011-03-15T14:21:52.190 回答
-6

你试过 jquery 吗?

alert($('#div1').html());
于 2009-08-05T08:06:44.147 回答