我有一个javascript变量:
var foo='<script type="text/javascript">alert("Hello World");<\/script>'
Run Code Online (Sandbox Code Playgroud)
该变量与element.innerHTML = foo一起插入; 在页面上发生事件后,加载页面大约10秒钟.
有没有办法在插入后立即执行'警报'功能?
如果你绝对必须使用字符串中的JavaScript代码并执行它,你基本上必须使用eval或eval类似机制.在JavaScript编程的某些年里,我从来没有采用它,我建议你看看是否有另一种方法来实现你的实际总体目标.
所以在这里,您将剥离脚本标记的东西,只删除eval代码,例如:
var script = foo.replace(/^<script[^>]*>/, "").replace(/<\/script>$/, "");
eval(script);
// Or window.evalInGlobalScope(script); // -- See below
Run Code Online (Sandbox Code Playgroud)
显然你必须确保你信任字符串的来源,因为你在其中执行代码.
eval是一个滑溜溜的野兽,玩具有背景和范围的非常奇怪的游戏.如果你需要的东西看起来更像是你在页面上添加了一个脚本标签,那么这是一个跨浏览器的功能(从我在Stack Overflow上对这个问题的回答):
window.evalInGlobalScope = (function() {
var fname, scr;
// Get a unique function name
do {
fname = "__eval_in_global_test_" + Math.floor(Math.random() * 100000);
}
while (typeof window[fname] !== 'undefined');
// Create test script
scr = "function " + fname + "() { }";
// Return the first function that works:
return test(evalInGlobalScope_execScript) ||
test(evalInGlobalScope_windowEval) ||
test(evalInGlobalScope_theHardWay) ||
evalInGlobalScope_fail;
function test(f) {
try {
f(scr);
if (typeof window[fname] === 'function') {
return f;
}
}
catch (e) {
return false;
}
finally {
try { delete window[fname]; } catch (e) { window[fname] = undefined; }
}
}
function evalInGlobalScope_execScript(str) {
window.execScript(str);
}
function evalInGlobalScope_windowEval(str) {
window.eval(str);
}
function evalInGlobalScope_theHardWay(str) {
var parent, script, d = document;
parent = d.body || d.documentElement || d.getElementsByTagName('head')[0];
if (parent) {
script = d.createElement('script');
script.appendChild(d.createTextNode(str));
parent.appendChild(script);
}
}
function evalInGlobalScope_fail() {
throw "evalInGlobalScope: Unable to determine how to do global eval in this environment";
}
})();
Run Code Online (Sandbox Code Playgroud)