我想创建一个书签,下载一个定义了函数的远程javascript文件,然后使用硬编码到小书签中的参数执行该函数。
这是您的标准"下载并运行远程脚本"在最后一行中带有额外函数调用的bookmarklet:
javascript:( function () {
var new_script = document.createElement("script");
new_script.src = "http://mydomain.com/myscript.js";
document.body.appendChild(new_script);
do_stuff('Hello World!');
} ) ();
以下是myscript.js的内容:
function do_stuff(input_variable) {
alert(input_variable);
}
如上所述,这并没有做任何事情。为什么不?我该怎么办?
答案 0 :(得分:1)
脚本以异步方式加载。这意味着在您尝试运行该函数之前,脚本无法完成加载。
解决方案1.)bookmarklet中的myvar = 'Hello World!'
和myscript.js中的do_stuff(myvar)
。
解决方案2.)对您创建的脚本元素使用onload事件。更强大,但更复杂。
答案 1 :(得分:0)
以下按照IE 10.0,9,Firefox 28和Chrome 35.0.1916.114的要求工作:
javascript:(function () {
new_script = document.createElement("script");
new_script.setAttribute('src','http://www.mydomain.com/myscript.js');
if(new_script.addEventListener) {
new_script.addEventListener("load", function() { do_stuff('Hello World!'); }, false);
}else if(new_script.readyState) {
new_script.onreadystatechange = function() { do_stuff('Hello World!'); };
}else {
new_script.onload = function() { do_stuff('Hello World!'); };
}
document.body.appendChild(new_script);
})();
我根据此处提出的建议添加了前2个“if”块:http://msdn.microsoft.com/en-us/library/ie/hh180173%28v=vs.85%29.aspx。这是不完整的,因为Firefox没有最后的阻止。请注意,“do_stuff”必须包含在匿名函数中。否则,IE说它不知道“do_stuff”是什么。我还没有测试过Opera和Safari。对于那些对DG的答案有所了解的人,Matthew Lock提供的这个链接也是一个有用的参考:http://secretdiaryofhan.wordpress.com/2008/02/02/including-remote-javascript-in-a-bookmarklet/。