2011-04-04 58 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