e.preventDefault()行为不正确

时间:2011-09-25 22:33:01

标签: jquery html

我有一个下拉菜单,即使我正在调用e.preventDefault(),它仍然会触发href更改。这就是我配置jquery地址更改的方式:

$(document).ready(function() {

    // Setup jQuery address on some elements
    $('a').address();

    // Run some code on initial load
    $.address.init(function(e) {
        // Address details can be found in the event object
    });

    // Handle handle change events
    $.address.change(function(e) {

        var urlAux = e.value.split('=');
        var page   = urlAux[0];
        var arg  = urlAux[1];

        ....
     });
});

我的下拉ID看起来像这样:

<li id="search"><a href="#" class="drop" >Search</a>

下拉列表的事件处理程序如下:

      $('#search').click(function(e) {
          e.preventDefault();
          $(this).children(menuItemChildren).slideDown(0);
          $(this).hover(function() {
          }, function(){    
              $(this).children(menuItemChildren).slideUp(0);
          });
      });

即使我在我的#search元素上调用e.preventDefault(),它仍会触发地址更改。任何想法都错了吗?

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

这应该有效

<li id="search"><a href="javascript:void(0)" class="drop" >Search</a>

答案 2 :(得分:0)

您应该在a元素上添加一个点击处理程序,并调用e.preventDefault()

$('#search a.drop').click(function(e) {
      e.preventDefault();
  });

答案 3 :(得分:0)

从孩子到父母,事件泡沫向上。您试图通过调用父<a>上的e.preventDefault();来阻止<li>上的默认操作。问题是,与<a>相关的所有操作都将在连接到<li>的操作之前触发,因为我在第一句中描述了事件冒泡顺序。换句话说,直到孩子已经触发事件之后才会调用e.preventDefault();

您应该将click个事件绑定到<a>元素,然后从那里调用e.preventDefault();

答案 4 :(得分:0)

问题很可能是MouseEvent e没有引用a标记,因为您将click事件绑定到list元素。您可以使用console.log(e.target)进行检查。您可能会看到e.target是一个列表元素。您可以通过将另一个事件绑定到

来解决此问题
$('#search a').click(function (e) {
  e.preventDefault();
});

但是为什么只要删除href属性就可以使用e.preventDefault()?这样做,点击后就不会采取任何行动。