【问题标题】:How can I strip down JavaScript code while building HTML?如何在构建 HTML 时去除 JavaScript 代码?
【发布时间】:2011-07-17 17:02:48
【问题描述】:

我正在尝试解析一些 HTML 以在其中查找图像。

例如,我创建了一个动态的div 并像这样解析标签:

var tmpDiv = document.createElement("DIV");
tmpDiv.innerHTML = html;

HTML 应该是无脚本的,但也有例外,一个代码段在图像标签下具有以下代码:

<img src=\"path" onload=\"NcodeImageResizer.createOn(this);\" /> 

通过创建一个临时的div,“onload”函数调用了自身并产生了一个 JavaScript 错误。

有没有办法告诉浏览器在构建 HTML 元素时忽略 JavaScript 代码?

编辑:
我忘了提到,稍后我想在我的文档中的div 中显示这个 HTML,所以我正在寻找一种忽略脚本而不使用字符串操作的方法。

谢谢!

【问题讨论】:

  • 如果onload还是一样,可以使用tmpDiv.innerHtml = html.replace('onload="NcodeImageResizer.createOn(this);',"")
  • 这将解决这个特定情况,但我正在寻找一个涵盖所有其他情况的通用解决方案。
  • 其他情况是什么?所有的加载处理程序?什么?
  • 所有其他从 HTML 隐式调用的脚本(不是 java script 标签内的脚本)

标签: javascript jquery html security


【解决方案1】:

这样做的一种方法是循环遍历 div 的子项并删除所需的事件处理程序。

考虑以下几点:

我们有一个包含一些 HTML 的变量,该变量又内嵌了一个 onload 事件处理程序:

var html = "<img src=\"http://www.puppiesden.com/pics/1/doberman-puppy5.jpg\" 
alt=\"\" onload=\"alert('hello')\" />"

我们创建一个容器来放入这个 HTML,我们可以遍历子元素并删除相关的事件处理程序:

var newDiv = document.createElement("div");
$(newDiv).html(html);
$(newDiv).children().each(function(){this.onload = null});

这是一个工作示例:http://jsfiddle.net/XWrP3/

更新

OP 要求同时删除其他事件。据我所知,无法自动删除所有事件,但是您可以根据需要将每个事件简单地设置为 null

$(newDiv).children().each(function(){
    this.onload = null;
    this.onchange = null;
    this.onclick = null;
});

【讨论】:

  • 谢谢,正如我在给 ilia 的最新评论中所写,我正在寻找一种方法来删除所有事件,因为我的最终目标是显示此 HTML,并且脚本可以在各种事件中触发。
  • 您可以通过这种方式删除尽可能多的事件。没有删除所有事件的通用方法。您只需将您关心的每个事件都设置为 null。
  • 哦,太糟糕了,好吧,我猜我必须手动编写它们。再次感谢。
【解决方案2】:

你可以像这样使用 jquery 轻松地做到这一点:

编辑:

html

<div id="content" style="display:none">
    <!-- dynamic -->
</div>

js

$("#content").append(
    $(html_string).find('img').each(function(){
        $(this).removeAttr("onload");
        console.log($(this).attr("src"));
    })
);

【讨论】:

  • 谢谢,但它对我不起作用,它与创建 div 的作用相同,我忘了提到我想稍后显示这个 HTML,所以我正在寻找不同的解决方案。 (你得到了我的投票)
  • 已更新。我很确定 jquery 在解析时会去除 &lt;script&gt; 标签
  • 可能,但问题出在这里,在我的代码中根本没有任何脚本标签。
  • 感谢您的帮助好友,这可能会解决问题,但是当我显示 HTML 时,可能会有大量其他可能触发脚本的事件有没有办法删除所有事件来自一个对象?
  • $(html_string).children().die().unbind().removeAttr("onclick").removeAttr("onload") 等...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多