1

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

编辑:更多描述:

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

PS:基本上我正在使用他们的 JS SDK 将 Facebook 登录集成到我的 web 应用程序中。所以 FB.login 函数只有在 SDK 已经加载后才能工作,但我不想拒绝用户点击登录按钮。因此,如果 SDK 尚未加载,调用将被存储,然后我可以在 SDK 加载后手动执行它。

4

4 回答 4

0

根据您的解释,我尝试使用 jQuery .queue(),但是这样,在 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);

这是一个演示:http: //jsfiddle.net/wared/PKTus/

于 2013-11-13T08:44:39.837 回答
0

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

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);

还有一个现场演示:http: //jsfiddle.net/wared/DH6DU/

于 2013-11-13T09:07:54.333 回答
0

尝试这样的事情 -

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 登录)。

于 2013-11-13T07:31:16.973 回答
0

也许这样的事情就足够了?

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变量,它会继续检查直到该变量可用。这很丑陋,但有效。

于 2013-11-13T08:28:47.817 回答