javascript - How to call an event handler on body tag only when all other event handlers fail? -
i have jquery script have written few event handlers on elements. if these 2 events not called, want event call. somehow i'm not able figure out way. used boolean variable doesn't seem work. here's sample code:
$(function(){ var flag = false; $("input[type=text]").blur(function () { //some code flag = true; }); $("input[type=password]").blur(function () { //some code flag = true; }); if(flag!= true) $('body').click(function(event){ alert(event.target.tagname); }); } }); i want click event on body tag execute when first 2 event handlers not executed. know wrong. please suggest better way check. in advance.
in first handlers, accept event argument , call event.stoppropagation() prevent event bubbling document. along these lines (you mixing click , blur; i've used click consistently in below):
$(function() { $("input[type=text]").click(function(event) { event.stoppropagation(); //some code }); $("input[type=password]").click(function(event) { event.stoppropagation(); //some code }); $('body').click(function(event) { alert(event.target.tagname); }); }); your flag approach work provided nothing ever stops propagation (which assumption wouldn't make), need reset flag, and code @ end putting if outside final event handler rather inside it. here's fix (again click consistently):
// works if nothing ever stops propagation $(function() { var flag = false; $("input[type=text]").click(function() { //some code flag = true; }); $("input[type=password]").click(function() { //some code flag = true; }); $('body').click(function(event) { if (flag) { // check goes inside handler flag = false; // reset flag, otherwise don't } else { alert(event.target.tagname); } }); }); i don't think i'd way because seems fragile. here's example of working, though:
// works if nothing ever stops propagation $(function() { var flag = false; $("input[type=text]").click(function() { snippet.log("click on field " + this.name); flag = true; }); $("input[type=password]").click(function() { snippet.log("click on field " + this.name); flag = true; }); $('body').click(function(event) { if (flag) { // check goes inside handler flag = false; // reset flag, otherwise don't } else { snippet.log( "click on body, target tagname: " + event.target.tagname ); } }); }); <div> <form> <input type="text" name="text1"> <input type="text" name="text2"> <input type="password" name="password1"> <input type="password" name="password2"> </form> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <!-- script provides `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> actually, can use flag on actual event, solve problem of not having means of resetting if stops propagation:
$(function() { $("input[type=text]").click(function(event) { snippet.log("click on field " + this.name); event.originalevent.handled = true; }); $("input[type=password]").click(function(event) { snippet.log("click on field " + this.name); event.originalevent.handled = true; }); $('body').click(function(event) { if (!event.originalevent.handled) { snippet.log( "click on body, target tagname: " + event.target.tagname ); } }); }); $(function() { $("input[type=text]").click(function(event) { snippet.log("click on field " + this.name); event.originalevent.handled = true; }); $("input[type=password]").click(function(event) { snippet.log("click on field " + this.name); event.originalevent.handled = true; }); $('body').click(function(event) { if (!event.originalevent.handled) { snippet.log( "click on body, target tagname: " + event.target.tagname ); } }); }); <div> <form> <input type="text" name="text1"> <input type="text" name="text2"> <input type="password" name="password1"> <input type="password" name="password2"> </form> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <!-- script provides `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Comments
Post a Comment