Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以存储javascript函数调用并在设置某个变量时执行它?_Javascript_Jquery_Facebook Javascript Sdk - Fatal编程技术网

是否可以存储javascript函数调用并在设置某个变量时执行它?

是否可以存储javascript函数调用并在设置某个变量时执行它?,javascript,jquery,facebook-javascript-sdk,Javascript,Jquery,Facebook Javascript Sdk,我想在按钮上附加onclick事件处理程序。但是如果没有设置js变量,我不希望调用它,相反,应该存储函数调用,然后在需要时执行。 有可能这样做吗 编辑: 更多说明: 因此,基本上,由于sdk尚未加载,因此仍应调用onclick事件处理程序,但不会执行调用,而是将其存储在某个位置(可能在队列中)。然后在另一段代码中,我将检查sdk是否已加载,一旦加载,我将检查队列中是否有任何挂起的调用并执行它们。这显然不会锁定浏览器 PS:基本上,我正在使用他们的JSSDK将facebook登录集成到我的weba

我想在按钮上附加onclick事件处理程序。但是如果没有设置js变量,我不希望调用它,相反,应该存储函数调用,然后在需要时执行。 有可能这样做吗

编辑: 更多说明:

因此,基本上,由于sdk尚未加载,因此仍应调用onclick事件处理程序,但不会执行调用,而是将其存储在某个位置(可能在队列中)。然后在另一段代码中,我将检查sdk是否已加载,一旦加载,我将检查队列中是否有任何挂起的调用并执行它们。这显然不会锁定浏览器


PS:基本上,我正在使用他们的JSSDK将facebook登录集成到我的webapp中。因此,FB.login函数只有在SDK已加载的情况下才能工作,但我不想拒绝用户单击登录按钮。因此,如果SDK没有加载,调用将被存储,然后我可以在加载SDK后手动执行它。

尝试类似的方法-

if (!FB.login) {
  // fastest in my testing.
  var fileref = document.createElement('script');
  // Some prefer "application/javascript".
  fileref.setAttribute("type", "text/javascript");
  fileref.setAttribute("src", **WHERE_TO_GET_IT**);
  if (typeof fileref!="undefined") {
    $("head").append(fileref);
  }
}

或者您转到另一个方向,仅在SDK准备就绪时显示登录按钮(因为在此之前他们无法使用FB API登录)。

也许这样就足够了

function onClickHandler(callback)
{
    // Initialize queue array on the first usage
    if (!this.queue)
        this.queue = [];

    //checking blah variable
    if (typeof(blah) == "undefined")
    {
        //blah doesn't exit, store callback in queue
        if (callback)
            this.queue.push(callback)
    }
    else
    {
        //execute all stored callback functions first
        if (this.queue.length)
        {
            this.queue.slice().forEach(function(callback) callback());
            this.queue.length = 0;
        }

        if (callback)
            callback()
    }
}

(function loop()
{
    if (typeof(blah) == "undefined")
        setTimeout(loop, 100);
    else
    {
        /*
            blah variable exists
            execute all stored (if any) callback functions
        */
        onClickHandler();
    }
})()
基本上,它所做的是创建一个循环并检查blah变量,它将继续检查,直到该变量可用为止。
这很难看,但很有效。

根据您的解释,我尝试了使用jQuery,但这样,在加载SDK后,单击处理程序将被多次触发。这真的是你想要的吗

var loaded = false;

$('button').click(function handler() {
    if (!loaded) {
        $(this).queue('demo', jQuery.proxy.apply(
            jQuery, [handler, this].concat(arguments)
        ));
        return;
    }
    // do something when loaded === true
});

setTimeout(function () {
    var button, queue;
    loaded = true;
    button = $('button');
    queue = button.queue('demo');
    while (queue.length) { 
        button.dequeue('demo');
    }
}, 3000);

下面是一个演示:。

另一个带有单个触发器的建议:

var loaded = false, clicked = false;

$('button').one('click', function handler() {
    if (clicked = !loaded) {
        $(this).one('click', handler);
        return;
    }
    // do something when loaded === true
});

setTimeout(function () {
    loaded = true;
    if (clicked) $('button').trigger('click');
}, 3000);

还有一个现场演示:。

你不能在事件处理程序中有一个标志吗?你能详细说明一下吗?请注意,我不想让用户因为第一次没有加载SDK而多次单击该按钮。您尝试了什么?您可以在检查typeof(the_other_variable)=“unknown”或其他任何必需的参数后返回函数调用,然后执行正常的函数。为了进一步澄清,您可以始终检查他们的SDK命名空间是否有原型。@ElliottFrisch:我不想返回函数,我想存储变量设置后要执行的函数调用。