插入并执行javascript

lvi*_*vil 3 html javascript

我有一个javascript变量:

var foo='<script type="text/javascript">alert("Hello World");<\/script>'  
Run Code Online (Sandbox Code Playgroud)

该变量与element.innerHTML = foo一起插入; 在页面上发生事件后,加载页面大约10秒钟.

有没有办法在插入后立即执行'警报'功能?

T.J*_*der 5

如果你绝对必须使用字符串中的JavaScript代码并执行它,你基本上必须使用evaleval类似机制.在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)

使用上面的实例