2013-07-17 8 views
13

voglio fare un ulteriore gestore di clic (pagina del cliente, non mi posso modificare la sua js/html) e dovrebbe funzionare come questo nel mio script:stopPropagation e startPropagation

1) event.stopPropagation (pausa cliente click propagazione)
2) la mia funzione (fare la mia funzione, quando tutto è fatto fare dopo)
3) event.startPropagation (continua azione client standard)

In questo momento, il primo e il secondo lavoro. Il terzo è il problema.
Lo so event.startPropagation non esiste, ma voglio qualcosa del genere. Qualche suggerimento?

risposta

4

Non interrompere la propagazione in primo luogo.

Verificare se my function fa ciò che si desidera che faccia e quindi decidere se interrompere la propagazione o meno.

+1

Quando clicco per ancorare, la mia funzione (GET a DB) non ha il tempo per l'esecuzione. Penso che sia necessario interrompere la propagazione all'avvio –

+0

È necessario prendere in considerazione la possibile esperienza utente in questo caso: l'utente fa clic su qualcosa e non accade nulla finché non viene completata una chiamata al database. La cosa peggiore, potrebbe essere un lungo periodo di tempo per non rispondere. – ehdv

+0

Questa è una cattiva risposta perché interrompere la propagazione è spesso necessaria quando si verificano diversi eventi sullo stesso elemento. È l'intera ragione per cui esiste il metodo. – kjdion84

0

Aggiungere e rimuovere il gestore di clic se si desidera abilitare/disabilitare rispettivamente l'evento click. Perché event.stopPropagation() interromperà la propagazione degli eventi sul dom tree.

Aggiornamento:

Se si utilizza jQuery, utilizzare la funzione .trigger().

http://api.jquery.com/trigger/

9

È possibile riattivare lo stesso oggetto evento sul nodo padre, f.ex (jQuery). Sarà necessario copiare l'oggetto evento prima e passarlo nel grilletto al fine di catturare le stesse proprietà di evento nella bolla (f.ex e.pageX):

var copy = $.extend(true, {}, e); 
setTimeout(function() { 
    $(copy.target.parentNode).trigger(copy); 
},500); 
e.stopPropagation(); 

Demo: http://jsfiddle.net/GKkth/

EDIT

sulla base di un commento, penso che tu sia alla ricerca di qualcosa di simile a:

$.fn.bindFirst = function(type, handler) { 
    return this.each(function() { 
     var elm = this; 
     var evs = $._data(this).events; 
     if (type in evs) { 
      var handlers = evs[type].map(function(ev) { 
       return ev.handler; 
      }); 
      $(elm).unbind(type).on(type, function(e) { 
       handler.call(elm, e, function() { 
        handlers.forEach(function(fn) { 
         fn.call(elm); 
        }); 
       }); 
      }); 
     } 
    }); 
}; 

Questo prototipo consente di associare un "gestore premium" che contiene una funzione next che eseguirà tutti i gestori precedenti sullo stesso elemento quando lo si desidera. Usalo come:

$('button').click(function() { 
    console.log('first'); 
}).click(function() { 
    console.log('second'); 
}).bindFirst('click', function(e, next) { 
    console.log('do something first'); 
    setTimeout(next, 1000); // holds the other handlers for 1sec 
}); 

DEMO: http://jsfiddle.net/BGuU3/1/

+0

Ok, l'ho provato in molti modi senza risultati positivi. Forse faccio qualcosa di sbagliato. Ad esempio: // lato client, il proprio gestore di clic $ ('p').fare clic (funzione (e) { document.location = 'http://www.onet.pl'; }); . // mio script $ ('p') clicca (function (e) { e.stopPropagation(); e.preventDefault(); $ .get ( ...., ... ., function() { // se ok, quindi fare qualcosa come startPropagation } ) }); –

+2

@ PiotrWójcik sembra che tu stia cercando 'stopImmediatePropagation()' dato che il gestore è collegato allo stesso elemento: http://api.jquery.com/event.stopImmediatePropagation/. Ricorda solo che non fermerà i gestori precedentemente vincolati all'esecuzione. O forse hai solo bisogno di trovare i gestori che sono già legati, salvarli ed eseguirli più tardi nel tuo trigger. – David

+2

@ PiotrWójcik Ho modificato la mia risposta con una possibile soluzione, è quello che ti serve? – David

Problemi correlati