2017-02-13 5 views
0

У меня возникли трудности с управлением порядком прослушивателей событий при установке флажка.Как выполнить функцию перед изменением флажка?

Например, если у меня есть эти входы:

<input type='checkbox' class='multi' name='product' id='type1'> 
<input type='checkbox' class='multi' name='product' id='type2'> 
<input type='checkbox'    name='product' id='type3'> 

Я хочу слушать всякий раз, когда кто-то нажимает на вход с классом = .multi, а затем выполнять две функции в последовательности.

В частности, я хочу, чтобы function(a) выполнил, до изменение статуса флажка зарегистрировано (то есть перед выполнением проверки).

Прямо сейчас у меня есть следующая система, которая не работает, потому что при запуске диалогового окна запускается событие change. Я не могу показаться, чтобы приостановить change событие ждать до:

$('.multi').on('mousedown', function(a){ // open a jqueryUi dialog box and wait to complete function(a) 
//do function(a) ... 
$('.dialog').dialog('close'); 

then, once the dialog is closed... 

$(input:checkbox).on('change', function(b){ //do function b only after function a has completed 
+1

Что делать, если вы просто вызываете функцию (b) из функции (a) и избавляетесь от обработчика события изменения? т. е. создать именованную функцию, содержащую код, который у вас есть внутри функции (b), а затем вызвать его, как только вы сделали то, что вы сейчас делаете в функции (a). – Chris

+0

@Chris Мне следовало бы уточнить, что ваш вариант не будет работать для меня, поскольку функция (б) делает другие вещи, которые требуют, чтобы она была автономной (насколько я могу разобраться с моими ограничениями опыт кодирования!) – user1837608

+0

Я предполагаю, что вам нужно только изменение, а затем внутри, что вы проверяете, присутствует ли класс .multi, и если вы начинаете делать то, что будет делать function_a, а затем продолжить с остальной функцией function_b , единственное неудобство, о котором я могу думать, это то, что значение флажка, вероятно, будет противоположным, что вы хотите – ajax333221

ответ

0

Может быть, это не то, что вы ищете: (не проверял еще, но это то, что на моей голове)

$('.multi').on('click',function(e) { 
    e.preventDefault(); 
    function(a); // your function 
    $(this).trigger('click'); 
}); 

удачи ^^

Update:

К сожалению, это, кажется, приведенный выше код будет делать бесконечную рекурсию, попробуйте следующее:

$('.multi').on('click',function(e) { 
    e.preventDefault(); 
    function(a); // your function 
    if ($(this).is(':checked')) { 
     $(this).prop('checked',false); 
    } else { 
     $(this).prop('checked',true); 
    } 
}); 
+0

Я думаю, вы хотели вызвать событие изменения! –

+0

Я думаю, что если исходное событие является «щелчком», я приостановил его, чтобы вызвать предпочтительную функцию, после чего я продолжу «щелчок», вызывая событие «щелчок». Если исходное событие равно $ ('. Multi'). On ('change' ... Но проблема в том, что событие «change» для флажков не всегда будет работать во всех браузерах. (CMIIW) –

+0

Ваш код будет создайте бесконечную рекурсию. Нажмите, чтобы триггер нажал на эту кнопку ... –

0

Я думаю, что вы поток должен быть чем-то вроде этого:

  1. изменения Флажок событий
  2. Открыть диалоговое окно (модальное)
  3. диалог (открытый вызов) вызова функции а) диалог
  4. (близко обратный вызов) вызова функции б)

например

Определить диалог

var dlgOptions={ 
    title:'My dialog', 
    modal:true, 
    buttons:{..}, 
    open:function(event, ui){ 
     //invoke function a 
    }, 
    close:function(event, ui){ 
     //invoke function b 
    } 
    } 

Тогда

$('.multi').on('change',function(e) { 
    $("#dlgSelector").dialog(dlgOptions) 
}); 
0

Это то, что я хотел бы сделать.

function functionB() { 
    // Whatever you want to do here 
} 

// Initialise the dialog, specifying functionB as your callback function 
// which will run automatically when the dialog closes. 
$('.dialog').dialog({ 
    close: functionB 
}); 

// Handle mousedown for any checkbox with 'multi' class 
$('.multi').on('mousedown', function(a){ 
    // Do stuff... 
    $('.dialog').dialog('close'); 
}); 

// Handle the 'change' event for any checkbox that DOESN'T have the 'multi' class 
$(input:checkbox).not('.multi').on('change', functionB); 

Этот способ, когда вы устанавливаете флажок с классом «multi», выполняет свою функцию, затем закрывает диалоговое окно. Затем, поскольку мы говорили в диалоговом окне о вызове функции B всякий раз, когда он закрывается, будет выполняться функция B.

И другой флажок БЕЗ класса 'multi' может по-прежнему вызывать функцию B независимо от события 'change'.