1

随着jquery.load()我从一个文件中将一些 html 加载到我的页面中,该文件还包含 javascript 函数。

后来我尝试使用删除html和javascript,jquery.empty但似乎一旦浏览器解析了脚本,我就无法摆脱它,所以我正在寻找有关如何执行此操作的建议。

下面是测试源码:

索引.html

<head>
<script src="//code.jquery.com/jquery-1.9.1.js" type="text/javascript"></script>
<script>
$(function(){
  $('#loadEmbScrpt').click(function(){
       $('#embDiv').load('http://maccyd10.hostoi.com/test.html');      
     });
   $('#remEmbScrpt').click(function(){
      $('#embDiv').empty();
   });
 });

<body>
<div id="embDiv"></div>
<div id="output"></div>
<input type="button" id="loadEmbScrpt" value="embed script into page"/>
<input type="button" id="remEmbScrpt" value="remove embedded script from page"/>
<input type="button" id="testButton" value="run embedded script test function"/>
</body>

测试.html

<script>
$('#testButton').on('click',function(){
 $('#output').append("<p>test</p>");
});
</script>

这里是上述操作的链接(由于 XSS 保护,我无法将其发布到 jsfiddle)。

http://maccyd10.hostoi.com

4

2 回答 2

3

玩这个http://jsfiddle.net/6eWRQ/

正如其他人所暗示的那样,DOM 和 Javascript VM 是浏览器中的两个独立系统。

DOM 是要呈现的 HTML 文档的浏览器内部模型。它处理 HTML 元素,例如<script>它们在 HTML 文档中的位置。

Javascript VM 处理 javascript 代码 - 它处理在标签内运行任何 Javascript 代码<script>或从外部 js 文件中提取。

似乎一旦脚本被浏览器解析,我就无法摆脱它

您当然可以从 DOM中删除<script>元素 - 但是在浏览器解析它之后,这将对 javascript VM 产生零影响 - 因为标签内的 javascript 代码已经被 VM 使用和执行。代码一旦运行,就不能取消运行。

在示例 jsfiddle 的情况下,这更加清楚 - 删除<script>包含函数的元素并不意味着您不能再调用该函数,一旦<script>VM 中的代码已经执行。VM 有自己的函数内部模型,执行后对 DOM 中原始代码的更改与它无关。

在这种情况下,使用 javascript 从 DOM 中删除包含<script>元素实际上是没有意义的——这只是多余的。DOM 渲染引擎对它没有用处,因为它不是可视元素,而 javascript VM 对它没有用处,因为它是已经处理过的输入。

要执行您想要的操作,您应该删除该#remEmbScrpt按钮,而是使用以下命令撤消加载的脚本执行的绑定:

$('#testButton').off('click');
于 2013-09-07T01:03:58.077 回答
2

正如评论中提到的,一旦加载了javascript,就无法摆脱它。

话虽如此,如果您希望撤消上面发布的脚本所做的更改,该.off()函数将解除所有附加到处理程序的绑定(因此,如果任何其他事件附加到单击,它们将被删除)。

例如,以下将取消与点击事件的功能$('#loadEmbScrpt')$('#remEmbScrpt')

$('#loadEmbScrpt').off('click');
$('#remEmbScrpt').off('click');

或者,如果您希望将所有内容集中在一行中:

$('#loadEmbScrpt,#remEmbScrpt').off('click');

让我知道这是否能解决您的问题

于 2013-09-06T23:42:13.827 回答