为什么html()会执行JavaScript而innerHTML不会?

8
为什么会执行这个 <script> 标签呢?
$('#jq_script').html("<script>$('#test').text('test');<\/script>");

但这个不行吗?
document.getElementById('js_script').innerHTML = "<script>$('#test').text('test');<\/script>";

你可以在此处查看其效果
以下是jQuery关于.html()的文档:

该方法使用浏览器的innerHTML属性。某些浏览器可能无法返回完全复制原始文档中HTML源的HTML。例如,如果属性值仅包含字母数字字符,则Internet Explorer有时会省略属性值周围的引号。


也许您打错了 '#jq_script' | getElementById('js_script') - Eternal1
因为一个jQuery开发者编写了它使其工作。 - epascarello
1个回答

11

html是jQuery的一个函数。innerHTML是一个非标准(但得到了很好的支持)属性。

如果你查看代码,你会发现.html()会解析脚本并执行eval函数。


在源码中找到它:

找到html声明:https://github.com/jquery/jquery/blob/1.11.0/src/manipulation.js#L564-604

可以看到,它调用了.append函数。而append函数又调用了DomManip[ulate]函数,该函数将解析和执行脚本。

DomManip[ulate]函数中的相关部分:https://github.com/jquery/jquery/blob/1.11.0/src/manipulation.js#L684-709


@Linuxios 看起来在这里:https://github.com/jquery/jquery/blob/1.9-stable/src/manipulation.js#L217 - 但我没有立即看到任何关于执行脚本的内容。我猜它可能在某个函数调用中。 - Ian
1
我在SO上通常很严肃,因为它不是论坛,但我必须对Frits说——你的头像.... 太酷了!So Doge. Much Lulz. - Reinstate Monica Cellio
@Linuxios 另一个可以看的地方可能是:https://github.com/jquery/jquery/blob/1.9-stable/src/manipulation.js#L346(实际的`domManip`方法代码似乎会评估脚本) - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接