Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript innerHTML删除Internet Explorer中的属性引号_Javascript_Internet Explorer_Xhtml_Innerhtml - Fatal编程技术网

Javascript innerHTML删除Internet Explorer中的属性引号

Javascript innerHTML删除Internet Explorer中的属性引号,javascript,internet-explorer,xhtml,innerhtml,Javascript,Internet Explorer,Xhtml,Innerhtml,在IE中获取DOM节点的innerHTML时,如果属性值中没有空格,IE将删除其周围的引号,如下所示: <html> <head> <title></title> </head> <body> <div id="div1"><div id="div2"></div></div> <script typ

在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>

警报(document.getElementById(“div1”).innerHTML);
在IE中,警报将显示:

<DIV id=div2></DIV>


这是一个问题,因为我要将其传递给需要有效XHTML的处理器,并且必须引用所有属性值。有人知道一种简单的方法来解决IE中的这种行为吗?

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

您尝试过jquery吗

alert($('#div1').html());

IE innerHTML确实很烦人。我为它写了这个函数,这可能有用吗?它引用属性并将标记名设置为小写。顺便说一句,IE的innerHTML并没有从非标准属性中删除引号,这让它更烦人

根据评论进行编辑 该函数现在处理属性值中的更多字符,并可以选择将属性值转换为小写。函数现在看起来更难看;~)。如果要向表达式中添加或删除字符,请编辑正则表达式的
[a-zA-Z\.\:\[\]\u\(\)\&\$\%\\\@!0-9]+[?\s+\124;?>]
部分

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;
}

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


我只想接受这样一个事实,即您将从浏览器中获取HTML,并在XML处理器前放置一些可以输入标记soup和输出XHTML的东西—例如。

我已经测试过这个,它适用于大多数属性,除了那些连字符的属性,例如class=day-month-title。它忽略这些属性,不引用它们。

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


请注意,
行中的尾随空格如果没有它,示例将无法在IE上运行。

我可能会晚几年,但现在开始。接受的答案可能会实现它的承诺,但现在已经是周五下午了,我需要一些更简单的东西,我也没有时间去做。这是我的版本,它只引用属性值,不加引号,扩展它应该很简单

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;
});
var t=”“;
t、 替换(/([\w-]+)=([\w-]+)([>])/g,函数(str,$n,$v,$e,offset,s){
返回$n+'=“+$v+'”“+$e;
});

是的。jQuery使用innerHTML返回其值,但他们尚未解决此问题。我使用jQuery只是为了更清楚地说明问题所在。是的,我看过这个库,但我不想使用它,因为它是根据CreativeCommons Attributement Share Alike 3.0许可证授权的。这很公平。我使用它时,我的雇主对它很满意,但我明白情况并非总是如此。嘿,我感谢信任投票,但OP已经声明图书馆的许可条款不符合他的需要。这实际上是我最终采用的解决方案。我选择使用lxml Python库。我还没有测试过这个,但我还是会选择它作为公认的答案,因为它最接近于这个问题的自包含解决方案。好的,thanx。在我的测试中,它工作了,但没有测试它。出于好奇:谁认为这个答案应该得-1分?为什么?我记得当我不得不使用一个巨大的遗留应用程序时,所有的逻辑都使用innerHTML。我记得在其中一个示例中出现的问题,在tbody标记中使用innerHTML是只读的(与其他一些元素一样)。+1做得很好。更妙的是,还可以使用小写的样式属性,例如
style=“DISPLAY:none”
。顺便说一句,尽管一切都是这样的(参见示例),但据我所知,并非所有字符都可以作为所有属性的属性值,因此,如果您想要的是有效的xhtml,您应该小心地使用这些值。此外,我必须将正则表达式更改为:/
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;
});