【问题标题】:Identify the caller (or how pass parameter) of a callback (JSON) function in JavaScript识别 JavaScript 中回调 (JSON) 函数的调用者(或如何传递参数)
【发布时间】:2014-03-24 05:51:57
【问题描述】:

当我请求时

BASE_URL + 'json/valueone?callback=fnCallBack0'

来自服务器的响应在回调函数中处理。该函数接收(ASYNCHRONOUS)数据(JSON格式)但不包含初始参数“valueone”

var BASE_URL = ...
function fnCallBack(data){
    if (data != null) {
    // HERE...I NEED ID <====================
    // arguments.callee.caller <==================== dont work
        console.log('information', data);
    }
}

// onclick callback function.
function OnClick(info, tab) {
    var arrH = ['valueone', 'valuetwo'];
    arrH.forEach(function(value) {
        var scrCallBack = document.createElement('script');
        scrCallBack.src = BASE_URL + 'json/' + value + '?callback=fnCallBack';
        //BASE_URL + 'json/one?callback=fnCallBack0';
        document.body.appendChild(scrCallBack);
    });

我的解决方案是创建一个中间函数相关名称(fnCallBack0、fnCallBack1、...)、一个全局数组和一个计数器。工作正常,但这不是 OOP,是一种软糖。

var BASE_URL = ...
//global array
var arrH = [];

var fnCallBack0 = function(data){
    fnCallBack(data, '0');
}
var fnCallBack1 = function(data){
    fnCallBack(data, '1');
}

function fnCallBack(data, id){
    if (data != null) {
        console.log('information', data + arrH[id]);
    }
}

// onclick callback function.
function OnClick(info, tab) {
    var i = 0;
    arrH = ['valueone', 'valuetwo'];
    arrH.forEach(function(value) {
        var scrCallBack = document.createElement('script');
        scrCallBack.src = BASE_URL + 'json/' + value + '?callback=fnCallBack' + (i++).toString();
        //BASE_URL + 'json/one?callback=fnCallBack0';
        document.body.appendChild(scrCallBack);
    });
chrome.contextMenus.create({
    title: '%s',
    contexts: ["selection"],
    onclick: function(info) {console.log(info.selectionText)}
});

var idConsole = chrome.contextMenus.create({
    title: 'console',
    contexts: ["selection"],
    onclick: OnClick
});

我尝试在 html 页面中使用注入函数作为代码,但我收到“内联安全错误”,以及很多类似的问题。

请不要使用 AJAX,也不要使用 jQuery。

这是我的第一篇文章,也是我的第一个 chrome 扩展 提前致谢。

【问题讨论】:

    标签: javascript google-chrome-extension jsonp


    【解决方案1】:

    我看不出这与 OOP 有什么关系,但解决方案是动态创建回调函数,以便您可以使用闭包来传递正确的数据:

    function fnCallBack(data, value){
        if (data != null) {
            console.log('information', data + value);
        }
    }
    
    // onclick callback function.
    function OnClick(info, tab) {
        ['valueone', 'valuetwo'].forEach(function(value, index) {
            // unique function name
            var functionName = 'fnCallback' + index + Date.now(); 
    
            window[functionName] = function(data) {
                fnCallBack(data, value);
                delete window[functionName]; // clean up
            };
    
            var scrCallBack = document.createElement('script');
            scrCallBack.src = BASE_URL + 'json/' + value + '?callback=' + functionName;
            document.body.appendChild(scrCallBack);
        });
    }
    

    【讨论】:

    • 感谢您的回复 ERROR : Uncaught ReferenceError: fnCallBackfnCallback01395614491126 is not defined callback=fnCallBackfnCallback01395614491126 (anonymous function) Maybe "window[functionName] = function(data) {fnCallBack(data, value);"跨度>
    • 好像您使用的是'?callback=fnCallBack' + functionName 而不是'?callback=' + functionName
    • 真的很抱歉……我再试一次
    • 似乎运作良好!! THX
    • 不客气!不要忘记通过单击旁边的复选标记来接受答案。这样您就可以将问题标记为已解决。
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2011-10-05
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多