如何将参数传递给服务器端书签?

时间:2011-10-26 13:30:47

标签: javascript bookmarklet

我有这个书签,它遵循this topic中提出的内容:

javascript: (function () {  
    var jsCode = document.createElement('script');  
    jsCode.setAttribute('src', 'http://path/to/external/file.js');  
  document.body.appendChild(jsCode);  
 }());

我的问题是,如何为服务器脚本提供一些参数(例如页面标题)? 服务器脚本如下(到目前为止只是一些PoC):

(function(message){
    alert(message + " " + Math.random()*100);
})();

1 个答案:

答案 0 :(得分:4)

要将参数传递给服务器端脚本,请扩展查询字符串:

    jsCode.setAttribute('src', 'http://path/to/external/file.js?parameter=' + document.title);

如果您打算将参数传递给返回的脚本,请在脚本元素中添加onload处理程序:

javascript:(function() {
    var jsCode = document.createElement('script');  
    var parameter = document.title; //Define parameter
    jsCode.onload = function() {
        // If the function exists, use:
        if(typeof special_func == "function") special_func(parameter);
    };
    jsCode.setAttribute('src', 'http://path/to/external/file.js');
    document.body.appendChild(jsCode);
})();

响应脚本(file.js):

function special_func(param){
    alert(param);
}

更新/示例

如果要将(多个)变量传递给响应脚本,请使用以下代码:

javascript:(function() {
    var jsCode = document.createElement('script');  
    var params = ["test", document.title]; //Define parameter(s)
    var thisObject = {}; // `this` inside the callback function will point to
                         // the object as defined here.
    jsCode.onload = function() {
        // If the function exists, call it:
        if (typeof special_func == "function") {
            special_func.apply(thisObject, params);
        }
    };
    jsCode.setAttribute('src', 'http://path/to/external/file.js');
    document.body.appendChild(jsCode);
})();

http://path/to/external/file.js

// Declare / Define special_func
var special_func = (function(){
    var local_variable = "password";
    var another_local_title = "Expected title";

    //Return a function, which will be stored in the `special_func` variable
    return function(string, title){ //Public function
        if (title == another_local_title) return local_variable;
    }
})();