【问题标题】:JQuery rebinding on vs bind after AJAX queryAJAX查询后JQuery重新绑定vs绑定
【发布时间】:2013-10-14 11:05:25
【问题描述】:

我想知道为什么 Jquery 的 .on 在 AJAX 调用后从未被调用来重新绑定我的提交按钮,因为 on 应该替换 .bind 我无法理解这是问题所在。但我尝试了各种方法,唯一有效的方法是使用.bind 而不是.on

我的表单附加到一个下拉列表,该下拉列表将在单击时将新数据生成到表单中。这是在 AJAX Get 调用上完成的,成功后我选择了表单并使用:

$('#formname').on('submit',function(){})

然后我尝试了

$('#formname').on('submit','form', function(){})

诚然,我从一个从未回答过的问题中得到了上述信息。 jquery-ajax-form-using-onsubmit

我还尝试将 on submit 附加到 body 元素,因为它不会随此处建议的 AJAX 函数 $('.container').on('submit','#formname', function(){}) 改变: jquery bind functions and triggers after ajax call

但这也被忽略了。然后我尝试将“提交”的类型替换为“按钮”,然后分配.on('click', etc...,以防在表单到达 DOM 后您无法重新绑定提交按钮。

但唯一有效的是调用.bind,因为我想使用正确的标准,所以我迷路了。我完成的代码看起来像这样,请注意任何有 .bind 的地方,它以前是一个未被调用的 .on

<script type="text/javascript">
(function ($){
    $('select#<?php echo $dropdown; ?>').on('click', function(){
        var value = $(this).val();
        var form = 'form#<?php echo $gridName; ?>' 
        $.ajax({
            type: "GET",
            url: $(form).prop('action') ,
            data: { gg:value },
            dataType: "html",
            cache: false,
            success: function(htmlResponse){
                var src = $(form , htmlResponse);
                $('.page_1col_col1').html( src );
                //replace the submit with a input buton to tesk on click
                //$('#<?php echo $gridName; ?> input[type="submit"]').prop('type','button');
                $('#<?php echo $gridName; ?>').bind('submit',function (){
                    rowBinding();
                    //replace the submit with a input btn
                    $.ajax({
                        type:"POST",
                        url: $(form).prop('action'),
                        dataType: "html",
                        cache: false
                    });

                });
            }

        });
    });
}(jQuery));

$(document).ready(function(){
    $('#<?php echo $gridName; ?>').bind('submit',rowBinding);
});


function rowBinding(){ //stuff}</script>

【问题讨论】:

  • 注意,您可以直接将 .bind 替换为 .on,因为 .bind 使用的语法完全适用于 .on。 $('#&lt;?php echo $gridName; ?&gt;').on('submit',function (){ 在动态元素上使用直接绑定没有任何问题,尤其是当它们只有一个时。
  • 在我的情况下它没有,我用 bind 和心爱的替换它应该可以工作,因此我在询问为什么它没有。当我在 Ajax 调用后提交表单时,客户端没有生成任何内容。

标签: javascript jquery ajax


【解决方案1】:

看起来您非常接近正确的解决方案,但被一个小细节绊倒了。

你的第三个例子应该有效,

$('container').on('submit','#formname', function(){})

container 可能应该是'.container''#container',或者甚至只是 document,因为 'container' 会选择容器类型的 HTML 元素。

对名为 container 的类试试这个:

$('.container').on('submit','#formname', function(){})

或者这个作为容器的 id:

$('#container').on('submit','#formname', function(){})

或者只使用文档对象(不是选择器,因此没有引号)

$(document).on('submit','#formname', function(){})

或者使用body元素:

$('body').on('submit','#formname', function(){})

基本上on 的延迟语法绑定到一个元素,该元素将在页面的整个生命周期内一直存在,监听所选事件,然后然后通过提供的选择器选择目标元素第二个参数。

更新:由于与在委托事件中使用 'body' 的样式相关的错误是一个坏主意。如果没有其他更接近/方便的方法,您的默认值应该是 document。该问题源于一个可能的样式问题,其中body 元素的计算高度为0,并且没有收到任何鼠标事件。 'body' 可能会在这种情况下与 submit 事件一起使用,但 document 对于所有情况来说是更安全的“默认值”:)

【讨论】:

  • 我的“容器”对于我使用 $('.page_1col_col1') 的问题只是通用的,因为它从未改变,但没有尝试只在文档上我会试一试。它在 doc.ready 上被调用时确实有效,但是当我试图重新绑定我的提交时它总是在 Ajax 之后我没有得到任何地方。
  • 明白。我只能按照显示的内容进行:) on 的延迟版本绝对可以像宣传的那样工作,所以请坚持下去。
  • 使用 $(document) 永远不会失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多