使书签执行下载功能

时间:2014-06-09 18:22:47

标签: javascript bookmarklet

我想创建一个书签,下载一个定义了函数的远程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);
}

如上所述,这并没有做任何事情。为什么不?我该怎么办?

2 个答案:

答案 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/