<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script language="javascript" type="text/javascript">
function c()
{
        var str=document.getElementById("d1").innerHTML;
alert(str);
}
</script>
</head><body>
<div id="d1">
<table>
<tr bgcolor="#00CC33">
<td>!!!!</td>
<td>456</td>
</tr>
<tr>
<td>456</td>
<td>456</td>
</tr>
</table>
</div>
<input type="button" onclick="c()" />
</body>
</html>代码很简单,在alert对话框中,bgcolor="#00CC33" 被显示为bgcolor=#00CC33,引号没有了,导致将innerHTML中的内容转为xml节点出错。如何在输出innerHTML时保留引号呢???

解决方案 »

  1.   

    对,我换Opera调试了下,没有问题,ff没有试,估计就是IE的问题
      

  2.   

    我觉得生成XML的工作不可以在客户端做吧,既然生成工作都在服务器端了,能不能取HTML的工作也在服务器端做呢?
    不知道你用什么做服务器端?
      

  3.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script language="javascript" type="text/javascript">
    function c()
    {
            var str="'"+document.getElementById("d1").innerHTML+"'";
        alert(str);
    }
    </script>
    </head><body>
    <div id="d1">
    <table>
    <tr bgcolor="#00CC33">
    <td>!!!!</td>
    <td>456</td>
    </tr>
    <tr>
    <td>456</td>
    <td>456</td>
    </tr>
    </table>
    </div>
    <input type="button" onclick="c()" />
    </body>
    </html>
      

  4.   

    回复#3
    生成XML可以在客户端做,但是一般很少这么做,除非项目有什么特殊要求估计针对IE没办法解决,当你调用JS时,页面已经被IE给解析过了,属性中所有的""估计都被转化没了,除非你在重新对得到的那些没有引号的字符串进行分析。
    我测试了一下通过创建range的方法,结果还是一样的。
    function c()
    {
        var str=document.getElementById("d1");
    var range = document.body.createTextRange();
    range.moveToElementText(str);
        alert(range.htmlText);
    }
      

  5.   

    还真没注意过!innerHTML我一般只是写操作(用的也很少)!读内容我都是用nodeValue
      

  6.   

    那我能想到的办法就只能是一层一层地遍历DOM,每个node去遍历所有attribute,最后自己生成一个字符串。是不是很麻烦?我想想都觉得麻烦,打死我也不这么做
      

  7.   

    如果涉及的范围很大(也就是dom的树很深)!不建议这么作!一般常用的都是这样!很少会有哪个操作会要遍历整个document!这样DOM的速度不如SAX理想.DOM会消耗很大的内存
      

  8.   

    写了一个不是很完善,属性的内容只能是#、数字、字母、中文,其他的都不可以,期待高手的解答<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script language="javascript" type="text/javascript">
    function c(){
        var str=document.getElementById("d1").innerHTML;
    var oReg=/(\s+\w+=)('|")?([#\w\u4e00-\u9fa5]+)('|")?/gi;
    alert("原始串:\n"+str);
    alert(str.match(oReg));
    alert("替换后:\n"+str.replace(oReg,"$1\"$3\""));
    }
    </script>
    </head><body>
    <div id="d1">
    <table>
    <tr bgcolor="#00CC33" name="123" def="24">
    <td>!!!!</td>
    <td>456<input title='我是谁'/></td>
    </tr>
    <tr>
    <td id=6>456</td>
    <td id=123>456</td>
    </tr>
    </table>
    </div>
    <input type="button" onclick="c()"  value="显示"/>
    </body>
    </html>
      

  9.   

    document.getElementById.innerHTML  这本身就是个 字符串类型的变量。
    你声明var str =document.getElementById.innerHTML;
    当然不用加引号了。 
    javascript 只是个弱脚本语言
      

  10.   

    style="bgcolor:#00CC33"
    属性应该写在style里面的
      

  11.   

    顺便问句,javascript有SAX一说么……或者你是指的某个ActiveXObject?
      

  12.   

    少了引号并不影响DOM解析,一个网页代码中引号非常多,如果把能去掉的引号都去掉,可以节省一部分带宽流量,对于流量超级巨大的网站来说,一个引号的流量也是宝贵的。所以你看百度首页的代码中,换行回车只有六七个,没有缩进,引号很少,能省的尽量省了。浏览器将HTML原始码解析为DOM,而innerHTML则是浏览器根据DOM翻译成新的HTML码,所以肯定有差异,差异如何取决于浏览器。如果你并不是为了DOM解析,而是要获取原始HTML码,js中应当使用xmlhttp来获取。
      

  13.   

    不知道你在哪出现-的,是在=后面吗?那可以改成
    /(\s+\w+=)('|")?([#\w\u4e00-\u9fa5\-]+)('|")?/gi话说回来想用正则来做这个事情的话其实挺麻烦的,像这个正则其实不严谨。我没去试过,不过我觉得如果正文中出现了=的话就会被误操作。LZ不妨试一下诸如下面这样的HTML
    <div>a=b</div>
      

  14.   

    回楼上,比如说style属性里出现了如background-color这样的子属性中就出现了“-”
      

  15.   

    我试了试,确实有问题。比如,出现style="background-color:#00CC33",替换后成了style="background-color“:#00CC33",冒号前多了个引号。我现在要解决的问题是属性值前后没有被引号的加上引号,其他的不要动,比如,style="background-color:#00CC33"
    就不用处理,但是align=center就要处理成align="center"。btw,ie真是烂啊
      

  16.   

    楼主应该想想为什么有这种需求,建议绕开。
    即使你加上引号了,也不能插入到xml中,因为innerHTML、outerHTML不仅仅是引号少了的问题,还有标签关闭问题。input元素后面的空格和斜线也会丢的。<div onclick="alert(innerHTML)">
    <input type="button" value="显示" />
    </div><input type="button" onclick="alert(outerHTML)"  value="显示" />
      

  17.   

    PS:用正则来做这个确实很难,像onclick="window.open(\"...\");"这样的语句就能玩死你。别往这上面走的好。
      

  18.   

    是这样的,我现在要实现一个在线编辑展示ppt功能,把编辑区域内所展现的所有html元素保存到一个xml节点中,下次查看的时候直接将节点内的内容作为innerHTML展现出来。而且现在的情况不会出现元素中调用function的情况,
      

  19.   

    那就用<![CDATA[.....内容内容内容内容内容内容内容内容....]]>保存整个HTML内容
      

  20.   

    可以通过遍历DOM树,自己来实现。
      

  21.   

    23楼这样的话,还是牵扯到取HTML的问题,那取出来的HTML还是没有引号的。虽然不一定出错,但是总感觉不好。下次再拿出来用的时候它并不是一段符合规范的HTML。
    24楼跟我7楼大概是一个意思吧,会有点麻烦,不过比较严谨。如果我做的话我想我还是会选择两者结合,自己遍历DOM,然后把得到的代码字符串放进CDATA里面。
      

  22.   

    用了下正则中的前瞻,初步解决了这个问题,有什么bug大家请指正
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script language="javascript" type="text/javascript">
    function c(){
        var str=document.getElementById("d1").innerHTML;
    var oReg2=/(\s+\w+=)('|")?(.*?)('|")?(?=\s+\w+=|\s*>|\s*\/>)/gi;

        alert("原始串:\n"+str);
        alert("替换后:\n"+str.replace(oReg2,"$1\"$3\""));
    }
    </script>
    </head><body>
    <div id="d1">
    <table>
    <tr bgcolor="#00CC33" name="123" def="id=6" style=" background-color:#cccccc;border:1px solid red;">
    <td>!!!!</td>
    <td>456<input title='我是谁'/></td>
    </tr>
    <tr>
    <td id=6>456</td>
    <td id=123>456</td>
    </tr>
    </table>
    </div>
    <input type="button" onclick="c()"  value="显示"/>
    </body>
    </html>
      

  23.   

    那你自己写一个HTML解析器好了
    不用自己再造一个轮子吧
    这个HTML绝对是规范的。但不是XHTML,这个应用也不需要XHTML。
      

  24.   

    回26楼,这次的正则表达式初步实现了功能,用了几个例子试了试,没发现什么bug,非常感谢
    正则表达式太复杂了,看了很久进展都不是很大,还要下功夫啊