使用jquery和动态内容处理事件

时间:2014-03-30 08:33:33

标签: javascript php jquery html ajax

我有一个带复选框的表,允许编辑所选行中的列。每当我单击复选框时,就会弹出一个对话框。 当我使用Ajax动态更改页面内容时(当我更改表的页面时),问题就开始了。每当我点击“下一步”按钮(以获取表格的下一行)时,内容会动态更改,当我单击编辑复选框时,对话框不会弹出。我尝试了各种方法来处理这种变化,但在我看来,我无法做到这一点。

这是Next按钮代码:

    $('#Next').click(function(){
        if(Number($('#Next').attr('n'))+1 >= Number($('#Next').attr('tn'))){
            $('#Next').removeAttr('class');
            $('#Next').attr('class','next disabled');
        }
        var tmp = Number($('#Next').attr('n'));
        $('#Next').removeAttr('n');
        $('#Next').attr('n',(tmp+1).toString());
        $.get("receive.php",{Page: $('#Next').attr('n')}).done(function(data){
            $('tbody').html(data);
            $('#Previous').removeAttr('class');
            $('#Previous').attr('class','previous');
            $.PutRating();
        });

    });

我从php函数收到的数据是新的表格内容,但是,我不能使用编辑复选框。这是代码:

    $('input.cb').on('change',function(){
        $('input.cb').not(this).prop('checked',false);
        BootstrapDialog.show({
            title: 'Choose Option',
            message: 'Select an option for: <strong>'+$(this).attr('n')+'</strong>. Be careful!',
            draggable: true,
            type: 'type-warning',
            data:{
                'name': $(this).attr('n')
            },
            buttons: [{
                label: 'Edit',
                icon: 'glyphicon glyphicon-pencil',
                cssClass: 'btn-warning',
                action: function(dialogItself){
                    dialogItself.close();
                    $('#ShowForm').trigger('click');
                    $('#ShowForm').hide();
                    $('#Add').text('Save');
                    $('#Add').attr('class','btn btn-success pull-right');
                    $('#Close').show();
                    $.post('receive.php',{GetRow: 'true',Name: dialogItself.getData('name')}).done(function(data){
                        var values = data.split(':');
                        $('#Type').val(values[0]);
                        $('#Name').val(values[1]);
                        $('#Hobby').val(values[2]);
                        $('#Favorite_color').val(values[3]);
                        $('#Favorite_food').val(values[4]);
                        $('#Notes').val(values[5]);
                    });
                }
            }, {
                icon: 'glyphicon glyphicon-trash',
                label: 'Delete',
                cssClass: 'btn-danger',
                action: function(){

                }
            }]
        });
    });

input.cb是复选框输入。 我尝试了.on函数,但它没有用,我想我不理解它。

1 个答案:

答案 0 :(得分:1)

是的,因为元素是动态添加的。你必须做事件委托
如果所有动态内容都添加到静态容器div中,则说它有id #container也许就像这样

 <div id="container">  
    // all your dynamic content gets added inside here 
 </div>

然后你必须使用这个语法 - &gt;

  $('#container').on('change','input.cb',function(){ 
   // your code 
  });

首先是父div,然后是事件,然后是你想要侦听的元素。正常的语言翻译将是“在#container 中监听input.cb的更改事件”
通过使用它,它将被触发,即使你正在侦听的元素是动态添加的,因为我们在这里进行了事件委托,并且在我们的情况下引用了静态父div #container (总是尝试引用最接近的静态父级,它只是为了性能而包装整个动态部分)

您可以替换触发事件,例如点击,相应地更改..

注意:确保容器div不是动态来自ajax,它必须是静态的。