当前位置: 首页 > 面试题库 >

ajax调用后不会触发jQuery事件

东门新立
2023-03-14
问题内容

对于jQuery,这是一个非常奇怪的问题。我正在加载一个div

<div id="container">

页面加载。每条记录都是表格数据,并带有与之关联的“删除”
ajax函数。当页面加载并单击“删除”链接时,ajax调用会触发。但是,一旦触发事件,就会从ajax调用返回数据,并且div中会填充数据(但页面不会刷新或重新加载)。当我再次单击链接时,ajax脚本将不会触发。这是我的代码:

$(document).ready(function() {
    $("button.done").button({
    }).click(function() {
        var BatchID = $("input#BatchID").val();
        var Amount = $("input#Amount").val();
        var Name = $("input#CheckName").val();
        var Check_Number = $("input#Check_Number").val();
        var Company = $("select#Company").val();
        var Department = $("select#Department").val();
        $.ajax({
            type: 'GET',
            url: '/app/usagCheckEntryWS.html',
            data: {
                "BatchID" : BatchID,
                "Amount" : Amount,
                "Name" : Name,
                "Check_Number" : Check_Number,
                "Company" : Company,
                "Department" : Department
            },
            success: function (data) {
                    var ang = '';
                    var obj = $.parseJSON(data);
                    $.each(obj, function() {
                       ang += '<table><tr><td width="45">' + this["RefID"] + '</td><td width="140">' + this["Name"] + '</td><td width="95">' + this["CheckNumber"] + '</td><td align="right" width="70">$' + this["Amount"] + '</td><td width="220" style="padding-left: 15px;">' + this["Description"] + '</td><td><div class="delete" rel="' + this["RefID"] + '"><span>Delete</span></div></td></tr></table>';
                    });
                    $('#container').html(ang);
                    $("input#Amount").val('');
                    $("input#CheckName").val('');
                    $("input#Check_Number").val('');
                    $("select#Company").val('MMS');
                    $("th#dept").hide();
                    $('input#CheckName').focus();
            }
        });
    });
});

问题答案:

当您删除元素然后通过javascript替换它时,它会丢失页面加载时添加到该元素的所有事件绑定。

(这也适用于页面加载后添加到页面的内容,即ajax加载的内容)

有几种可能的解决方案。

1)封装您的“绑定”代码,并在页面加载时以及在有问题的元素添加回页面后立即调用它。例如:

$(document).ready(function(){
    // bind event handlers when the page loads.
    bindButtonClick();
});

function bindButtonClick(){
    $('.myClickableElement').click(function(){
        ... event handler code ...
    });
}

function updateContent(){
    $.ajax({
        url : '/ajax-endpoint.php',
        data : {'onMyWay' : 'toServer'},
        dataType : 'html',
        type : 'post',
        success : function(responseHtml){
            // .myClickableElement is replaced with new (unbound) html element(s)
            $('#container').html(responseHtml);

            // re-bind event handlers to '.myClickableElement'
            bindButtonClick();  
        }
    });
}

2) 更优雅的处理方式
使用jQuery的.on()方法。有了它,您就可以将事件处理程序绑定到事件目标以外的元素上,即永远不会从页面中删除的元素。

$(document).ready(function(){
    $('body').on('click','.myClickableElement',function(){
        ... event handler code ....
    });
});

一些进一步的解释:

.on()方法使用事件委托
来告诉父元素保留事件处理程序代码(第3个参数),并在事件目标(第2个参数)执行某种类型的事件(第一个参数)时将其触发。

如果您使用的是1.7之前的jQuery版本,请使用现在不建议使用的委托方法,该方法实际上执行相同的操作。

另外,值得注意的是,由于事件在dom树中“冒泡”的方式,事件目标(.on()方法的第二个参数)必须是委托元素(jQuery对象的选择器)的后代。

以下将不起作用

<div id="container-1">
    <div>
        <div id="another-div">
            Some Stuff
        </div>
    </div>
</div>

<div id="container-2">
    <a id="click-me">Event Target!!!</a>
</div>

<script type="text/javascript">
    $('#container-1').on('click','#click-me',function(){
        ... event handler code ....
        // This will never execute, should've used '#container-2', or 'body', or 'document' instead of '#container-1'
    });
</script>

bodydocument元素通常是安全的选择,因为通常每个页面上的元素的后裔。



 类似资料:
  • 问题内容: 我正在研究一个脚本,以使用jQuery异步加载一些图像。 这是加载图像的函数的代码片段- 我已经在Firefox,Webkit(Safari,Chrome)中对此进行了测试,并且可以正常工作。 图像位于服务器上的文件夹中,而我使用的是jQuery 1.3。 有任何想法吗? 问题答案: 解决此问题的简单方法是提供jQuery设置或或或任何其他可用的响应类型。 我遇到了同样的问题,但是在.

  • 问题内容: 为了添加一些基本的错误处理,我想重写一段代码,该代码使用jQuery的$ .getJSON从Flickr中提取一些照片。这样做的原因是$ .getJSON不提供错误处理或不处理超时。 由于$ .getJSON只是$ .ajax的包装,因此我决定重写该内容并感到惊讶,它可以完美地工作。 现在,乐趣开始了。当我故意导致404(通过更改URL)或导致网络超时(由于未连接到互连网)时,错误事件

  • 问题内容: 我的页面上有几个链接(位于内),可用于更改CSS样式表: 现在,在更改页面上的样式之后,我想使用以下代码(在调用之后放入)获得新的背景色: 我认为问题是浏览器需要花费一些时间来下载新的样式表,并且有时我的警报消息中还会出现旧的背景色。我可以绑定一些事件,该事件仅在页面上所有样式表加载后才会提醒我吗? 目前,我所能想到的只是使用了a ,效果并不理想,因为如果要花费更长或更短的时间来加载页

  • 小心使用“set”而不是其他内置方法,因为它不会在更改值后触发事件,正如这里的评论中指出的:如何在水豚中使用fill_in与查找(如果可能) 例如。 <代码>查找(:css,“输入[id$='捐赠\u质押\u数百']”)。设置(“10”) 我正在使用ruby、capybara和site prism。据我所知,site prism的使用方法是获取capybara节点元素,然后对其调用方法,例如单击

  • 问题内容: 可以说我有一个简单的函数,像这样。 http://jsfiddle.net/AT5vt/ 是否可以使全局ajaxSuccess()函数在本地成功回调之前被调用?因为我想对结果进行全局检查,然后再由局部函数进行进一步处理。 问题答案: 使用默认的ajax发布而不是使用自定义发布处理程序: http://jsfiddle.net/AT5vt/1/ 并未将其放在jsfiddle中,因为从那里

  • 问题内容: 我有3个文件: js_json.js->用于我的json代码 javascript.js->用于我的javascript函数 index.php 这里的代码为: 这是我的代码: 这里的代码: 我的问题是: 当我单击链接“ Hola Test 1”时,它将起作用并显示消息。问题是,在单击选择选项之后,出现了链接“ Hola Test”,然后单击该链接(“ Hola Test”),该消息没