Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery preventDefault() not triggered

I have the following code:

$(document).ready(function(){      $("div.subtab_left li.notebook a").click(function(event) {     event.preventDefault();     return false;        });  }); 

but when I click the element .. it doesn't prevent the default action .. Why?

and when modifying the code to:

$(document).ready(function(){      $("div.subtab_left li.notebook a").click(function() {     e.preventDefault();     alert("asdasdad");     return false;        });  }); 

it stops the default action but does not alert .. I couldn't find any answer on jQuery docs.

The full code goes like this:

$(document).ready(function(){  $('#tabs div.tab').hide(); $('#tabs div.tab:first').show(); $('#tabs ul li:first').addClass('active');  $('#tabs ul li a').click(function(){ $('#tabs ul li').removeClass('active'); $(this).parent().addClass('active'); var currentTab = $(this).attr('href'); $('#tabs div.tab').hide(); $(currentTab).show(); return false; });      $("div.subtab_left li.notebook a").click(function(e) {     e.preventDefault();     e.stopPropagation();     e.stopImmediatePropagation();      alert("asdasdad");     return false;      });  }); 

and the HTML structure is:

<div id="tabs"> <ul id="nav"> <li><a id="tab1" href="#tab-1"></a></li> <li><a id="tab2" href="#tab-2"></a></li> <li><a id="tab3" href="#tab-3"></a></li> <li><a id="tab4" href="#tab-4"></a></li> </ul>  <div class="tab" id="tab-1">         <script type="text/javascript">$(document).ready(function(){$("ul.produse li").hover(function () {         $("ul.produse li").removeClass('active');$(this).addClass('active');}, function () {$(this).removeClass('active');});});     </script>      <div class="subtab_left">          <ul>             <li class="notebook"><a href="#">1</a></li>             <li class="netbook"><a href="#">2</a></li>                   <li class="allinone"><a href="#">2</a></li>              <li class="desktop"><a href="#">2</a></li>              <li class="procesoare"><a href="#">2</a></li>              <li class="placi_video"><a href="#">2</a></li>                 <li class="hdd_desktop"><a href="#">2</a></li>             <li class="tv_plasma"><a href="#">2</a></li>             <li class="tv_lcd"><a href="#">2</a></li>             <li class="telefoane_mobile last_item"><a href="#">2</a></li>         </ul>     </div> 
like image 312
pufos Avatar asked Apr 10 '11 19:04

pufos


People also ask

Why is e preventDefault not working?

My problem was simply that another click event was being binded to the element at a later point in the script, overwriting the existing click event and causing e. preventDefault() to fail. Hope that helps someone else that runs into this problem.

What is e preventDefault() in jQuery?

preventDefault() method stops the default action of an element from happening. For example: Prevent a submit button from submitting a form. Prevent a link from following the URL.

How preventDefault works?

The preventDefault() method cancels the event if it is cancelable, meaning that the default action that belongs to the event will not occur. For example, this can be useful when: Clicking on a "Submit" button, prevent it from submitting a form. Clicking on a link, prevent the link from following the URL.

Why stopPropagation?

stopPropagation() The stopPropagation() method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases. It does not, however, prevent any default behaviors from occurring; for instance, clicks on links are still processed.


1 Answers

Update

And there's your problem - you do have to click event handlers for some a elements. In this case, the order in which you attach the handlers matters since they'll be fired in that order.

Here's a working fiddle that shows the behaviour you want.

This should be your code:

$(document).ready(function(){       $('#tabs div.tab').hide();     $('#tabs div.tab:first').show();     $('#tabs ul li:first').addClass('active');      $("div.subtab_left li.notebook a").click(function(e) {         e.stopImmediatePropagation();         alert("asdasdad");         return false;     });      $('#tabs ul li a').click(function(){         alert("Handling link click");         $('#tabs ul li').removeClass('active');         $(this).parent().addClass('active');         var currentTab = $(this).attr('href');         $('#tabs div.tab').hide();         $(currentTab).show();         return false;     });  }); 

Note that the order of attaching the handlers has been exchanged and e.stopImmediatePropagation() is used to stop the other click handler from firing while return false is used to stop the default behaviour of following the link (as well as stopping the bubbling of the event. You may find that you need to use only e.stopPropagation).

Play around with this, if you remove the e.stopImmediatePropagation() you'll find that the second click handler's alert will fire after the first alert. Removing the return false will have no effect on this behaviour but will cause links to be followed by the browser.

Note

A better fix might be to ensure that the selectors return completely different sets of elements so there is no overlap but this might not always be possible in which case the solution described above might be one way to consider.


  1. I don't see why your first code snippet would not work. What's the default action that you're seeing that you want to stop?

    If you've attached other event handlers to the link, you should look into event.stopPropagation() and event.stopImmediatePropagation() instead. Note that return false is equivalent to calling both event.preventDefault and event.stopPropagation()ref

  2. In your second code snippet, e is not defined. So an error would thrown at e.preventDefault() and the next lines never execute. In other words

    $("div.subtab_left li.notebook a").click(function() {     e.preventDefault();     alert("asdasdad");     return false;    }); 

    should be

    //note the e declared in the function parameters now $("div.subtab_left li.notebook a").click(function(e) {     e.preventDefault();     alert("asdasdad");     return false;    }); 

Here's a working example showing that this code indeed does work and that return false is not really required if you only want to stop the following of a link.

like image 99
no.good.at.coding Avatar answered Oct 05 '22 17:10

no.good.at.coding