我从书签加载这个 JS 代码:
function in_array(a, b)
{
for (i in b)
if (b[i] == a)
return true;
return false;
}
function include_dom(script_filename) {
var html_doc = document.getElementsByTagName('head').item(0);
var js = document.createElement('script');
js.setAttribute('language', 'javascript');
js.setAttribute('type', 'text/javascript');
js.setAttribute('src', script_filename);
html_doc.appendChild(js);
return false;
}
var itemname = '';
var currency = '';
var price = '';
var supported = new Array('www.amazon.com');
var domain = document.domain;
if (in_array(domain, supported))
{
include_dom('http://localhost/bklts/parse/'+domain+'.js');
alert(getName());
}
[...]
请注意,“getName()”函数位于 http://localhost/bklts/parse/www.amazon.com/js 中.此代码仅在我第二次单击小书签时起作用(该功能似乎直到 alert() 之后才加载)。
奇怪的是,如果我将代码更改为:
if (in_array(domain, supported))
{
include_dom('http://localhost/bklts/parse/'+domain+'.js');
alert('hello there');
alert(getName());
}
我在第一次点击时收到了两个警报,其余的脚本功能正常。如何使脚本在第一次单击小书签时运行而不会出现虚假警报?
谢谢! -马拉
最佳答案
通过 DHTML 添加 <script> 标记会使脚本异步加载,这意味着浏览器将开始加载它,但不会等待它运行脚本的其余部分。
您可以处理标记对象上的事件以查明何时加载脚本。这是我使用的一段示例代码,它似乎在所有浏览器中都能正常工作,尽管我确信有更好的方法来实现这一点,但我希望这会为您指明正确的方向:
不要忘记将 tag 更改为包含 <script> 元素的对象,将 fnLoader 更改为加载脚本时调用的函数,将 fnError 更改为加载脚本失败时调用的函数。
请记住,这些函数将在稍后调用,因此它们(如标签)必须可用(闭包通常会处理)。
tag.onload = fnLoader;
tag.onerror = fnError;
tag.onreadystatechange = function() {
if (!window.opera && typeof tag.readyState == "string"){
/* Disgusting IE fix */
if (tag.readyState == "complete" || tag.readyState == "loaded") {
fnLoader();
} else if (tag.readyState != "loading") {
fnError();
};
} else if (tag.readyState == 4) {
if (tag.status != 200) {
fnLoader();
}
else {
fnError();
};
};
});
关于javascript - 从 JS 中的另一个脚本获取函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1281809/