如何将事件绑定到ajax生成的元素

时间:2012-06-08 12:02:25

标签: ajax yii jquery

我正在使用RenderPartial生成CListView并且正确生成了所有内容,并且良好的分页也正常工作。但是当我将自定义JS添加到CListview生成的元素时,它适用于第一页内容,但是当我使用分页并单击第2页时,JS绑定失败。

有没有其他方法可以将自定义事件绑定到YII中生成的元素CListview我曾尝试过使用直播,而对我来说没有任何工作,这里是我的js文件。

我想我必须在每个ajax加载中调用我的函数但是如何在yii中实现

这是我用来通过按钮点击来更新服务器上的评级的脚本,这个定义了这些表单和按钮的元素由CListview在yii中生成

$(document).ready(function(){
    $('form[id^="rating_formup_"]').each(function() {
        $(this).live('click', function() {
            alert("hi");
            var profileid=  $(this).find('#profile_id').attr('value');
            var userid=  $(this).find('#user_id').attr('value');  
            console.log(userid);
            var data = new Object();
            data.profile_id=profileid;
            data.user_id=userid;
            data.liked="Liked";
            $.post('profile_rating_ajax.php', data, handleAjaxResponse);
            return false;     
       });
    });
});

3 个答案:

答案 0 :(得分:1)

您还可以尝试CGridView.afterAjaxUpdate

'afterAjaxUpdate' => 'js:applyEventHandlers'

答案 1 :(得分:0)

这个问题可以通过两种方式解决:

  1. 对将要接收该事件的每个项使用'onclick'html定义,并在生成元素时,将$ data的id传递给js函数。例如,在“视图”页面内:

    echo CHtml::htmlButton('click me', array('onclick'=>'myFunction('.$data->id.')');
    
  2. 将事件处理程序绑定到“body”,就像框架一样。他们将在ajax更新后继续存在:

    $('body').on('click','#myUniqueId',funcion(){...});
    

答案 2 :(得分:0)

$ .each方法仅在现有元素上循环,因此实时绑定器永远不会看到ajax生成的内容。

你为什么不这样试试呢?

$(document).ready(function(){
  $('form[id^="rating_formup_"]').live('click', function() {
      alert("hi");
      var profileid=  $(this).find('#profile_id').attr('value');
      var userid=  $(this).find('#user_id').attr('value');  
      console.log(userid);
      var data = new Object();
      data.profile_id=profileid;
      data.user_id=userid;
      data.liked="Liked";
      $.post('profile_rating_ajax.php', data, handleAjaxResponse);
      return false;     
   });
});