2013-11-13 1 views
1

Я хочу добавить обработчик события onclick на кнопку. Но я не хочу, чтобы он вызывался, если переменная js не установлена, вместо этого вызов функции должен быть сохранен, а затем выполнен, когда я захочу. Можно ли сделать что-то вроде этого?Возможно ли сохранить вызов функции javascript и выполнить его, когда установлена ​​какая-либо переменная?

Edit: Подробнее Описание:

Так в основном, так как SDK еще не загружен, обработчик OnClick событие должно еще быть вызван, но вызов не будет выполняться, а вместо этого будет храниться где-то (в очередь может быть). Затем в другом фрагменте кода я проверю, загружен ли sdk, и как только он будет загружен, я проверю, есть ли ожидающие вызовы в очереди и выполняйте их. Это, очевидно, не будет блокировки браузера.

PS: В принципе, я интегрирую вход в facebook с помощью JS SDK в свой webapp. Таким образом, функция FB.login будет работать только в том случае, если SDK загружен, но я не хочу отказывать пользователю в нажатии кнопки входа. Поэтому, если SDK не загружен, вызов будет сохранен, а затем я могу выполнить его вручную после загрузки SDK.

+1

Не можете ли вы иметь флаг внутри обработчика событий? – Lix

+0

Можете ли вы подробнее рассказать? Обратите внимание, что я не хочу, чтобы пользователь нажимал кнопку несколько раз только потому, что первый раз SDK не был загружен. – dotgc

+0

Что вы пробовали? Вы можете вернуться из вызова функции после проверки того, есть ли typeof (the_other_variable) == 'unknown' или что-то еще, что требуется, и в противном случае выполнять вашу обычную функцию. –

ответ

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/.

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 до этого).

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

В основном то, что он делает это создает цикл и проверьте бла переменная, она продолжается проверка, пока эта переменная не станет доступным. Это уродливо, но работает.

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/.

Смежные вопросы