2011-04-04 115 views
3

我有一个ajax日历,它会在单击某些箭头时更改月份。出于某种原因,click事件在live()方法中不起作用。它曾经工作,但现在它并没有出于某种原因。jQuery .live()与单击事件不起作用

如果我用click()替换live(),它可以工作,但我需要live()方法。

假设

  • 我使用的是最新版本的jQuery。
  • 没有JS错误引发。
  • HTML是有效
  • 的a.x-BTN选择被找到(长度= 2)
  • 的console.log( '得到这个远!')被正确触发。
  • console.log('Sidebar Cal Clicked')不是开火。
  • 在Wordpress环境中运行。
  • DOCTYPE设置为HTML5

//ajax calendars 
jQuery(document).ready(function($) { 

    //sidebar 
    $(function() { 
     var s = $('#s-calendar'), p = s.closest('.widget'); 
     console.log('Got this far!'); 

     //prevent collapse 
     p.css('min-height', p.height()); 

     s.find('a.x-btn').live('click', function(e) { 
      console.log('Sidebar Cal Clicked'); 
      var d = $(this).attr('data-cal-date'), n = $(this).attr('data-nonce'); 
      var url = $(this).attr('data-ajaxurl'); 
      $.ajax({ 
       url:url, 
       type:'POST', 
       data:'action=wpcal&sidebar=true&_wpcal_nonce='+n+'&date='+d, 
       success:function(data) { 
        s.fadeOut(500, function() { 
         s.html(data).fadeIn(500); 
        }); 

       } 
      }); 
      return false; 
     }); 

    }); 
}); 

ANSWER

原来另一块JS的是造成现场无法工作。 live()方法需要事件传播才能正常工作。我在我的代码的顶部有一小段JS,有时我觉得它很有用。

$('body a[href=#]').click(function(event) { event.preventDefault(); }); 

我使用该代码来防止单击无用链接时页面跳跃。这会在所有'A'标签被href =“#”点击时结束传播。我删除它,一切正常。

另外,尽管jQuery Docs说了什么,使用jQuery 1.5.2,live()方法在DOM遍历之后工作。我继续改变它,只是为了与文档保持一致。但它确实有用!谢谢你们的帮助!

回答

3

我认为这源于s.find的预评估。使用这段代码会给你不同的结果吗?

$('#s-calendar a.x-btn').live('click', function(e) { 
+0

在我的编辑中查看答案。 – Chris 2011-04-04 19:22:12

0

我认为这个问题是在这里:

s.find('a.x-btn') 

它不返回正确的元素。

1

我怀疑有mibht这里

s.find('a.x-btn') 

一些问题,不应该有与现场点击任何问题。

1

见警告直播:http://api.jquery.com/live/#caveats

具体来说:
“DOM遍历方法不支持寻找元素发送给.live()相反,.live()方法应该总是被直接调用在选择器之后...“

0

这可能是由于您准备好了嵌套文档引起的吗?你能删除第二个吗?

//ajax calendars 
jQuery(document).ready(function($) { 

    //sidebar 
    $(function() { // remove this one 
0

对于jQuery版本> 1.9,live()函数已被删除。 试着这么做, $( '#button_id')。在( '点击', 'button_tag_type',功能) 或 $( '身体')。在( '点击',” .Button_class',函数)

+0

这是正确的,如果你仍然需要在jQuery 1.9之前支持代码,我建议使用.delegate函数:'$(document).delegate('#button_id','click',function);' - 移除绑定有'.undelegate'可用(使用与之前的.delegate相同的参数调用它)。 – Matt 2017-08-25 15:57:03