微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – jQuery:在不执行脚本的情况下解析/操作HTML

我正在使用以下格式通过Ajax加载一些HTML

<div id="div1">
  ... some content ...
</div>
<div id="div2">
  ...some content...
</div>
... etc.

我需要迭代响应中的每个div并单独处理它.具有映射到id的每个div的HTML内容的单独字符串将满足我的要求.但是,div可能包含脚本标记,我需要保留但不执行(当我将HTML粘贴到文档中时它们会稍后执行,因此在解析期间执行会很糟糕).我的第一个想法是做这样的事情:

// data being the result from $.get
var clean = data.replace(/<script.*?</script>/,function() {
    // insert some unique token, save the tag, put it back while I'm processing
}); 

$('<div/>').html(clean).children().each( /* ... process here ... */);

但是我担心一些愚蠢的开发者会出现并在其中一个div中添加这样的东西:

<script> var foo = '</script>'; // ... </script>

哪个会搞砸了.更不用说,整个事情感觉就像一个黑客入手.有谁知道更好的方法

编辑:这是我提出的解决方案:

var divSplitRegex = /(?:^|<\/div>)\s*<div\s+id="prefix-(.+?)">/g,
    idReplacement = preDelimeter+'$1'+postDelimeter;
var r = data.replace(<\/div>\s*$/,'').
    replace(divSplitRegex,idReplacement).split(preDelimeter);
$.each(r,function() {
    var content;
    if(this) {
        callback.apply(null,this.split(postDelimeter));
    }
});

preDelimiter和postDelimeter只是像“###这样的独特字符串,我必须是一个白痴才能将这个字符串嵌入到我的内容中,因为它会破坏所有内容###”,而回调是一个期望div id和div内容.这只能起作用,因为我知道div只有一个id属性,id会有一个特殊的前缀.我想有人可以在他们的内容加上一个带有相同前缀的id的div,它会搞乱也是.

所以,我仍然不喜欢这个解决方案.谁有更好的?

解决方法:

仅供参考,在任何JavaScript脚本中使用未转义都会在浏览器中导致此问题.开发人员无论如何都要逃避它,所以没有任何借口.所以你可以“信任”在任何情况下都会破裂.

<body>
 <div>
   <script>
     alert('<script> tags </script> are not '+
         'valid in regular old HTML without being escaped.');
   </script>
</body>

看到

http://jsbin.com/itevu

看到它破裂.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐