使用jquery.load()
我正在从包含javascript函数的文件中将一些html加载到我的页面中。
稍后我尝试使用jquery.empty
删除html和javascript,但似乎一旦脚本被浏览器解析我无法摆脱它,所以我正在寻找有关如何做的建议此
以下是测试来源:
的index.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>
的test.html
<script>
$('#testButton').on('click',function(){
$('#output').append("<p>test</p>");
});
</script>
以下是上述操作的链接(由于XSS保护,我无法将其发布到jsfiddle)。
答案 0 :(得分:2)
正如评论中所提到的,一旦加载了javascript就无法摆脱它。
话虽如此,如果您想要撤消上面发布的脚本所做的更改,.off()
函数将取消绑定所有附加到处理程序的所有内容(因此,如果附加了任何其他事件,则点击它们将会被移除到)。
e.g。以下内容将解除$('#loadEmbScrpt')
和$('#remEmbScrpt')
上的点击事件中的功能:
$('#loadEmbScrpt').off('click');
$('#remEmbScrpt').off('click');
或者如果你想要一行:
$('#loadEmbScrpt,#remEmbScrpt').off('click');
如果能解决您的问题,请告诉我
答案 1 :(得分:2)
正如其他人所提到的,DOM和Javascript VM是浏览器中的两个独立系统。
DOM是要呈现的HTML文档的浏览器内部模型。它处理HTML元素,例如<script>
及其在HTML文档中的位置。
Javascript VM处理javascript代码 - 它处理在<script>
标记内运行任何Javascript代码或从外部js文件中提取。
似乎一旦脚本被浏览器解析我无法摆脱它
你当然可以从DOM中删除<script>
元素 - 但是在浏览器解析之后这对javascript VM没有任何影响 - 因为那时javascript代码里面的javascript代码标记它已被VM使用和执行。代码运行后,就无法取消运行。
在示例jsfiddle的情况下,这更清楚 - 删除包含函数的<script>
元素并不意味着一旦<script>
内的代码,您就不能再调用该函数了已经由VM执行。 VM有自己的内部函数模型,并且在执行后对DOM中原始代码的更改与它无关。
在这种情况下,使用javascript从DOM中删除包含<script>
元素实际上是没有意义的 - 它只是多余的。 DOM渲染引擎没有用它,因为它不是一个可视元素,并且javascript VM没有用它,因为它已经处理过了。
要执行您想要的操作,您应该删除#remEmbScrpt
按钮,而是使用以下命令撤消已加载脚本执行的绑定:
$('#testButton').off('click');