粘贴HTML代码后执行Javascript脚本

时间:2014-05-29 21:59:58

标签: javascript jquery html browser tags

我正在做一些实验,我发现当你在任何网页上执行该代码时:

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脚本吗?或者做任何更好的方式做我正在做的事情?

谢谢!

2 个答案:

答案 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,然后自动在头部创建一个脚本标记。它非常漂亮。看看它是否适合你。

From the docs:

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.