2014-01-07 77 views
1

我的笨框架內工作,使Ajax請求的邏輯,像這樣返回的元素...找不到阿賈克斯

$.ajax({ 
      type: "POST", 
      url: "/ci/ajaxCustom/createTimePicker", 
      data: '', 
      success: function(html) { 
       $('#nav').show().html(html);  
      } 
     }); 

PHP函數在我ajaxCustom文件返回HTML。 ..

function createTimePicker() { 
$ampm = array("am","pm"); 
$hours = array("1","2","3","4","5","6","7","8","9","10","11","12"); 
$minutes = array("00","15","30","45"); 
     foreach($ampm as $amkey): 
      $timemenu .= '<li><a href="javascript:void(0)" id="ampm" class="menulink">'.$amkey.'</a>'; 
      $timemenu .= '<ul class="time_menu">'; 
       foreach($hours as $hour): 
        $timemenu .= '<li><a href="javascript:void(0)" id="hour" class="menulink">'.$hour.$amkey.'</a>'; 
        $timemenu .= '<ul>'; 
         foreach($minutes as $minute): 
         $timemenu .= '<li><a href="javascript:void(0)" id="minute" class="menulink">'.$hour.':'.$minute.' '.$amkey.'</a></li>'; 
         endforeach; 
        $timemenu .= '</ul>'; 
        endforeach; 
      $timemenu .= '</ul>'; 
      $timemenu .= '</li>'; 
     endforeach; 

     echo $timemenu; 
} 

我試圖使用YUI庫設置事件偵聽器和一個用於這個看起來像這樣...

this._setTimeButton = document.getElementsByClassName("menulink"); 
YAHOO.util.Event.addListener(this._setTimeButton, "click", this._setTime, null, this); 

而_setTime功能被點擊菜單項時執行......

_setTime: function() { 
    alert("here"); 
} 

這裏的問題,我已經遇到了這個在過去,但圍繞它的工作。我爲這個項目設置的所有點擊監聽器都能正常工作,它只是試圖監聽由Ajax返回的元素的點擊。我假設DOM已經設置好了,所以YAHOO事件監聽器無法找到Ajax請求返回的新近添加的HTML。有什麼我可以做的重建DOM或其​​他解決方案?

我通常不會使用Ajax返回HTML,但在這種情況下我需要,但似乎無法解決此問題。謝謝您的幫助!

回答

1

看起來這裏的問題是您分配事件處理程序,然後再添加元素。代表團將解決這個問題。

使用jQuery事件處理函數分配是這樣的...

$("#nav").on("click", ".menulink", function() { 
    _setTime(); // or just put the contents of _setTime here, if you don't run it anywhere else 
}); 

這將事件處理程序分配給#nav元素,用類.menulink每一個子元素,無論它們在存在分配的時間與否。

+0

謝謝!這工作。我必須稍微編輯一下你的解決方案才能正確地引用這個函數,因爲我在原型中工作,但是這樣做了。我對jQuery有點新鮮,所以我從你的答案中也學到了一些東西。再次感謝你。 – user3169564

+0

沒問題 - 很高興幫助:) – Archer

0

我假設有多個元素的類名稱爲menulink。所以,我會改變你這樣的代碼,這樣你只能得到與類名的第一個元素:

this._setTimeButton = document.getElementsByClassName("menulink")[0]; 

或者你可以去通過與類名的每個元素,並添加一個事件偵聽器:

for(var i = 0; i < this._setTimeButton.length; i++) 
{ 
    YAHOO.util.Event.addListener(this._setTimeButton[i], "click", this._setTime, null, this); 
} 
+0

雖然你的答案不起作用,但它確實幫助我理解了需要完成的工作並驗證YAHOO.util.Event.addListener找不到新添加的元素。你的回答也讓我意識到我可以通過元素循環來設置事件監聽器。我不知道我能做到這一點。謝謝。 – user3169564

+0

@ user3169564很高興幫助 –