加载外部javascript文档后执行javascript

加载外部javascript文档后执行javascript,javascript,dom,Javascript,Dom,我想包含一个远程js文件,然后在完成执行后调用一个函数。我想我可以这样做: var sc = document.createElement('script'); sc.setAttribute('type', 'text/javascript'); sc.setAttribute('src', src); sc.innerHTML = "alert('testing');" parentNode.appendChild(sc); 事实证明,警报(“测试”)会被清除,不管文件中有什么。还有其他方

我想包含一个远程js文件,然后在完成执行后调用一个函数。我想我可以这样做:

var sc = document.createElement('script');
sc.setAttribute('type', 'text/javascript');
sc.setAttribute('src', src);
sc.innerHTML = "alert('testing');"
parentNode.appendChild(sc);
事实证明,警报(“测试”)会被清除,不管文件中有什么。还有其他方法吗?

添加另一个

<script></script> 

第一节之后应该是第一节。好吧,你不能在一个标签中混合使用外部和内联JS


然而,我不确定将代码放入“innerHTML”是否会像预期的那样工作。我很想知道它是否会运行。

您是否尝试过创建第二个脚本元素,其中包含要运行的代码,并在添加需要下载的代码后添加该元素?

您可能可以使用sc load事件来确定该脚本何时加载,然后执行一些操作


示例

我昨天为自己创建了这个脚本。它使用jQuery通过AJAX加载JavaScript文件,并将它们添加到一个脚本标记中,然后调用一个回调函数传递给它

对我来说一直都很好

/**
 * Fetches and executes JavaScript files from the server.
 * @param files A list of files to load, or a single filename as a string.
 * @param callback The function to call when the process is done. Passes a boolean success value as the only parameter.
 * @param thisObject The calling object for the callback.
 */
window.include = function(files, callback, thisObject) {
    var current_location = null;
    var recursive = false;

    if(!(thisObject instanceof Object)) {
        thisObject = window;
    }

    if(files instanceof Array || files instanceof Object) {
        if(files.length > 0) {
            current_location = files.shift();
            recursive = true;
        }
        else {
            callback.apply(thisObject, [true]);
            return;
        }
    }
    else if(typeof files == 'string') {
        current_location = files;
    }
    else {
        callback.apply(thisObject, [false]);
        return;
    }

    if((current_location instanceof String || typeof current_location == 'string') && current_location != '')
    {
        $.ajax({
            type : 'GET',
            url  : current_location,
            timeout : 5000,
            success : function(data) {
                var scriptTag = $(document.createElement('script'));
                scriptTag.attr('type', 'text/javascript');
                scriptTag.html(data);
                $('head').append(scriptTag);

                if(recursive) {
                    window.adlib.include(files, callback, thisObject);
                }
                else {
                    callback.apply(thisObject, [true]);
                }
            },
            error : function() {
                callback.apply(thisObject, [false]);
            }
        });
    }
}

首先,忘记在同一个脚本标记上使用
src
和内部内容。虽然John Resig对此进行了一些思考,但它在任何一般情况下都不起作用

第二件事是,决定是同步还是异步加载脚本。如果脚本很大或运行时间很长,您可以异步执行,也可以在页面底部同步执行,以免阻止渲染

您的方法(动态附加脚本标记)将异步加载和运行它,这意味着应该在脚本完成后运行的代码需要进入回调中,该回调在脚本完成时触发。设置它不是很简单,所以我建议要么使用jQuery及其函数,要么直接从jQuery源代码中复制getScript功能(jQuery 1.3.2的第3473-3505行)

如果您想避免所有这些,只需同步加载即可。这是通过使用
document.write
完成的。您提供的示例如下所示:

document.write("<scr" + "ipt src='" + src + "' type='text/javascript'></script>");
// The script is guaranteed to have executed at this point
alert('testing');
document.write(“”);
//脚本保证已在此时执行
警报(“测试”);

请确保将“脚本”像这样分开,我不知道为什么,但这是JavaScript的一个怪癖。

此函数将从scriptPath加载库,并在加载脚本后执行传递的处理程序函数:

loadExternalScript : function(scriptPath, handler) {

    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = scriptPath;
    script.charset = 'utf-8';

    script.onload = handler;

    head.appendChild(script);

}

很好,使用CreateTextNode并将其附加到脚本节点可能更安全。