我正在做一些实验,我发现当你在任何网页上执行该代码时:
document.documentElement.innerHTML = document.documentElement.innerHTML;
Javascript脚本刚刚被禁用'。所以这里是我编写的一个小脚本,它使用jQuery重新执行这些脚本(所以你需要在某些网站上注入jQuery(我使用的是Firebug + FireQuery)):
// Disabling all javascript scripts
document.documentElement.innerHTML = document.documentElement.innerHTML;
// Saving scripts tags and his parent
var scripts = [];
jQuery('html').find('script').each(function(){
scripts.push([jQuery(this),jQuery(this).parent()]);
}).remove(); // REMOVING ALL SCRIPT TAGS
// Re-appending those deleted script tags in the right place
for (var i in scripts) {
scripts[i][1].append(scripts[i][0]);
}
所以这个脚本适用于我尝试的大多数网站,除了一个:Google(在Firefox中)
我实际上要做的就是存储Google HTML,然后将其粘贴到iframe中(通过Firefox扩展程序)。所以一切都运行良好,除了我无法使Javascript脚本工作(没有自动完成,按钮不起作用......)。以下是我得到的错误:
gapi.loaded_0不是函数
window.google.pmc未定义
我在想,这可能是由于执行订单问题或其他原因造成的。但是我该如何解决这个问题呢。还有其他方法可以重新运行Javascript脚本吗?或者做任何更好的方式做我正在做的事情?
谢谢!
答案 0 :(得分:0)
是的!有一种更好的方法可以做你正在做的事情。
首先,发生了什么:
当您使用innerHTML
从DOM中删除的现有元素时。不是在“燃烧和盐化地球”,因为其他参考可能存活,但它们不在DOM。
幸运的是,有一种简单的方法可以解决这个问题:
这是对Event Delegation的精彩讨论,描述了你需要做什么。在幕后了解它是值得阅读的。
有了这个,请查看jQuery的Event Delgation,它为您做了很多工作:
由于您没有显示任何HTML,我会发明一些:
<div id="contents-will-be-replaced">
<button>Click me</button>
</div>
// Attach to the DIV
// But listen for buttons
$( "#contents-will-be-replaced" ).on( "click", "button", function() {
alert("Button pushed");
});
答案 1 :(得分:0)
你可以简单地使用Jquery的.html()
在dom中动态加载脚本。基本上,jquery会在添加到DOM时检查你的html,然后自动在头部创建一个脚本标记。它非常漂亮。看看它是否适合你。
By design, any jQuery constructor or method that accepts an HTML string — jQuery(), .append(), .after(), etc. — can potentially execute code. This can occur by injection of script tags or use of HTML attributes that execute code (for example, <img onload="">). Do not use these methods to insert strings obtained from untrusted sources such as URL query parameters, cookies, or form inputs. Doing so can introduce cross-site-scripting (XSS) vulnerabilities. Remove or escape any user input before adding content to the document.