Mélanger mes événements de clic jQuery avec l'attribut onclick de l'objet existant

J'utilise jQuery mais traite des balises produites à partir des pages JSF. Beaucoup d'éléments ont des attributs onclick fournis par le code JSF (ce qui n'est pas mon domaine).

Exemple:

<div onclick="[jsf js to submit form and go to next page]">submit</div> 

J'essaie d'ajouter une validation côté client avec jQuery. J'ai besoin de quelque chose comme ce pseudo code:

 $('div').click(function(e){ if(myValidation==true){ // do nothing and let the JS in the onlick attribute do its thing } else { $error.show(); // somehow stop the onclick attribute JS from firing } }) 

Existe-t-il une meilleure pratique pour gérer cela?

Une pensée que j'avais était que sur le chargement de la page, saisir la valeur de l'attribut onclick, supprimer l'attribut onclick de l'objet, alors … eh bien, c'est là que je me perde. Je pourrais mettre en cache le JS en tant que texte dans un attribut de données, mais je ne suis pas sûr de détruire plus tard.

Utilisez simplement eval pour exécuter le code d'attribut onclick dans votre événement de clic jQuery si vous le souhaitez. Vous devez supprimer l'attribut onclick

 <div onclick="alert('hi');">submit</div> 

 $(document).ready(function() { var divClick = $('#theDiv').attr('onclick'); $('#theDiv').removeAttr('onclick'); }); $('#theDiv').bind('click', function(e) { if (myValidation == true) { // do nothing and let the JS in the onclick attribute do its thing eval(divClick); } else { $error.show(); // somehow stop the onclick attribute JS from firing e.preventDefault(); } }); 

Soit renvoyer faux ou utiliser:

 e.stopPropagation() 

ou

 e.preventDefault() 

Selon vos besoins.

MODIFIER

Vous pouvez enregistrer un événement original:

 var originalEvent = $('div').attr("onclick"); $('div').attr("onclick", false); $('div').click(function(e) { if (false) { // do nothing and let the JS in the onlick attribute do its thing eval(originalEvent); } else { alert("error"); // somehow stop the onclick attribute JS from firing } }); 

Jetez un oeil à ceci http://jsfiddle.net/j4jsU/

Changer si (faux) à si (vrai) pour voir ce qui se cache lorsque le formulaire est valide.

J'aime e.stopProgation () et e.preventDefault (), mais si vous ne préférez pas cette stratégie, vous pouvez également supprimer manuellement l'attribut onclick () et appeler manuellement la fonction utilisée lors d'une validation réussie.

Différents traits ..

Pourquoi ne pouvez-vous pas faire quelque chose comme:

 div=document.getElementById('test'); oldClick=div.onclick; bol=false; div.onclick=function(){ if(bol){ oldClick(); } else { alert('YOU SHALL NOT RUN INLINE JAVASCRIPT'); } }