2014-01-07 78 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很高兴帮助 –