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