2014-09-21 2 views
2

Есть ли какой-либо способ в JavaScript или jQuery обнаружить, когда событие закончено, распространяя DOM? У меня есть обработчик jQuery click, который привязывается (с целевым «html») на клик, а сам клик, который добавляет его, запускает его, когда он пузырится до цели. Я хочу отложить привязку обработчика до тех пор, пока не будет выполнено распространение. Я слышал event.stopPropagation() - это рискованный бизнес, поэтому я бы предпочел не использовать его.Может ли JavaScript или jQuery обнаруживать, когда распространение события завершено?

Вот мой код. # title-editable является привязным тегом. vclick - это событие, определенное jQuery Mobile. Я получаю оба консольных журнала одним щелчком мыши на # title-editable.

$("#title-editable").on("vclick", function(event){ 
    event.preventDefault(); 
    console.log("First handler fired."); 
    /* Would like to detect completion of event propagation here 
     and only execute the next statement after that. */ 
    $("html").one("vclick",function(){ 
     console.log("Second handler fired."); 
    }); 
    }); 

Редактировать: Я думаю, у меня есть обходное решение. Вместо .one для внутреннего события, я использую. Так что событие не отсоединяется при первом запуске. Я проверяю цель события click и выполняю только изменения для внутреннего события и отделяю внутреннее событие, если цель не является # прав на редактирование.

$("#title-editable").on("vclick", function(event){ 
    event.preventDefault(); 
    console.log("First handler fired."); 
    $("html").on("vclick",function(event2){ 
     console.log("Second handler fired."); 
     if(!$(event2.target).closest("#title-editable").length){ 
     console.log("Execute changes here."); 
     $("html").off("vclick"); 
     } 
    }); 
+0

Это не имеет никакого смысла вообще? Скорее всего, это проблема X/Y, если кто-нибудь может это понять? – adeneo

+0

Обычно «тело» является пунктом назначения пузырька события. Но если вы обрабатываете событие там, что, если какой-то код вызывает 'stopPropagation()' где-то под деревом? –

+0

Можете ли вы указать на то, что не имеет смысла? Основная вещь, которую я пытаюсь сделать, - это щелкнуть событие, прикрепленное к документу, но не уволиться, когда щелкнуто редактирование # title-editable. Есть лучший способ сделать это? –

ответ

0

на основе вашего последнего комментария, самый простой логики было бы что-то вроде этого:

var changed=false; 
$('#title-editable').on('vclick',function(event){ 
    event.preventDefault(); 
    console.log("First handler fired."); 
    changed=true; 
}); 
$(document).on("vclick",function(){ 
    if(changed){ 
     console.log("Second handler fired."); 
     //here you can revert your actions and then the next line 
     changed=false; 
    } 
}); 

UPDATE:

Вторая теория:

вы сказали, что ancestor получает класс по клику #title-editable, поэтому вы можете попробовать код ниже:

$(document).on("vclick",function(event){ 
    if($('#title-editable').parent().hasClass('givenClass')){ //assuming the class is called "givenClass" and the ancestor is the parent of "#title-editable" (you need to sort that out) 
     console.log("Second handler fired."); 
     //here you can revert your actions and then the next line 
    } 
    else{ 
     event.preventDefault(); 
     console.log("First handler fired."); 
    } 
}); 

Третья теория:

$(document).on("vclick",function(event){ 
    if(!$('#title-editable').is(':visible')){ 
     console.log("Second handler fired."); 
     //here you can revert your actions and then the next line 
    } 
    else{ 
     event.preventDefault(); 
     console.log("First handler fired."); 
    } 
}); 

Четвертая теория:

$(document).on("vclick",function(event){ 
    if(!$('#title-editable').is(event.target) || !$('#title-editable').has(event.target)){ 
     console.log("Second handler fired."); 
     //here you can revert your actions and then the next line 
    } 
    else{ 
     event.preventDefault(); 
     console.log("First handler fired."); 
    } 
}); 
+0

Спасибо за предложение, но похоже, что у него такая же проблема. Я попробовал это, и оба консольных журнала активировали один клик. Я думаю, что происходит, что изменилось = true; выполняется до того, как событие запустится до корня документа. –

+0

проверить обновление, пожалуйста, –

+0

Вторая теория, похоже, имеет те же проблемы - время добавления класса и проверки класса зеркалирует выборку булевой переменной в первой теории. –