加载外部javascript文档后执行javascript
我想包含一个远程js文件,然后在完成执行后调用一个函数。我想我可以这样做:加载外部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); 事实证明,警报(“测试”)会被清除,不管文件中有什么。还有其他方
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并将其附加到脚本节点可能更安全。