Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入并执行javascript_Javascript_Html - Fatal编程技术网

插入并执行javascript

插入并执行javascript,javascript,html,Javascript,Html,我有一个javascript变量: var foo='<script type="text/javascript">alert("Hello World");<\/script>' var foo='alert(“Hello World”);' 变量与元素一起插入。innerHTML=foo;页面上发生事件后,页面加载后约10秒 有没有一种方法可以在插入后立即执行“警报”功能?如果您必须绝对、肯定地获取字符串中的JavaScript代码并执行它,那么基本上必须使用

我有一个javascript变量:

var foo='<script type="text/javascript">alert("Hello World");<\/script>'  
var foo='alert(“Hello World”);'
变量与元素一起插入。innerHTML=foo;页面上发生事件后,页面加载后约10秒


有没有一种方法可以在插入后立即执行“警报”功能?

如果您必须绝对、肯定地获取字符串中的JavaScript代码并执行它,那么基本上必须使用
eval
或类似
eval
的机制。在一些年的JavaScript编程中,我从未使用过它,我建议您看看是否有其他方法可以实现实际的总体目标

因此,在这里,您可以去掉脚本标记内容,只需
eval
代码,例如:

var script = foo.replace(/^<script[^>]*>/, "").replace(/<\/script>$/, "");
eval(script);
// Or window.evalInGlobalScope(script); // -- See below

您不需要做很多更改,只需要一个小更改

现在您有这样一行代码:

oDiv.innerHTML = foo;
只需将其改为这三行:

var oScript = document.createElement("script");
oScript.innerHTML = foo;
oDiv.appendChild(oScript);
并且have
foo
只包含原始JS,不包含
标记


.

是的,但是它很麻烦,因为您必须
eval()
脚本部分。jQuery有一些现成的函数来实现这一点——使用它是一种选项吗?插入标记的方式不是代码被设置,而是没有被调用,根本没有被计算。(如果是的话,
警报将立即发生。)如果你给我们更多的上下文,几乎可以肯定有更好的方法来做你想做的事情。佩卡:如果你的问题是“我能使用jQuery吗”,那么是的,但如果可以用其他方式做,那会更好。我恐怕这是我唯一能做的方法(通过插入变量),因为“foo”通常是一个对象。@Anonymouse:
innerHTML
正在创建中,并且跨浏览器工作比其他许多东西都好——只是不适用于此(脚本注入)。如果您试图用它创建无效的DOM结构,可靠性会显著下降(例如,将
div
innerHTML
设置为“Hi there”),但除了脚本、无效结构和旧浏览器中表单字段的一些有趣之处之外,它非常可靠。在
script
元素上设置
innerHTML
不能跨浏览器可靠地工作。例如,它在IE的所有版本中都失败。因此,使用各种机制来查找正确的
evalInGlobalScope
我的答案中的函数。@T.J它适用于最新版本的Chrome、Firefox和IE。IE9处于兼容模式(因此据我所知IE8)确实失败了-知道其他浏览器吗?
@Shadow
:IE9、IE8、IE7、IE6(已经死了!)所有这些都失败了,但这没关系,因为它们提供了
execScript
。Firefox和其他一些浏览器提供了
window.eval
(与
eval
)不同)。在几乎所有其他方面,创建一个文本节点(而不是设置
innerHTML
)有效。同样,请参考我答案中的
evalInGlobalScope
。它测试了浏览器支持的机制(一次)。几年前我对此做了大量研究。好吧,我只是希望有更简单的东西,但我想你和往常一样是对的。:)
var oScript = document.createElement("script");
oScript.innerHTML = foo;
oDiv.appendChild(oScript);