当AJAX操作完成时,Javascript回调不会触发

时间:2010-03-23 20:57:35

标签: javascript jquery asp.net-mvc

在ASP.NET MVC View上给出以下代码:

<% using (Ajax.BeginForm("AddCommunity", 
    new AjaxOptions { UpdateTargetId = "community-list", 
    OnSuccess = "BindCommunityHover" }))
   { %>
    Add Community: <input type="text" id="communityName" name="communityName" /> 
    <input type="submit" value="Add" />
<% } %>

文件中的以下JavaScript方法:

function BindCommunityHover() {
    $(".community-item-li").hover(
            function () { $(this).addClass("communityHover"); },
            function () { $(this).removeClass("communityHover"); }
        );
};

当AJAX结果回来时,有没有理由不调用BindCommunityHover?

社区列表div已正确更新(操作返回部分视图)。我也试过设置OnComplete(而不是OnSuccess)无济于事。

在$(function(){...})中调用BindCommunityHover方法;当页面首次加载时阻塞,对于所有现有的.community-item-li元素,它都有效。

我的控制器的部分结果会将该div中的所有项目替换为更多相同的类。应该在文档更新后触发OnSuccess方法。

更新:k ......这很奇怪。我在BindCommunityHover方法中添加了以下内容:

alert($(".community-item-li").size());

当页面加载和回调触发时,我在警报中得到240。因此,回调是触发,jQuery匹配元素但不应用样式......

2 个答案:

答案 0 :(得分:2)

那是因为你的函数基本上是为所有这些项添加一个悬停事件,因为它们存在于调用函数的时间点。

如果您随后添加新元素,则不会自动绑定它们。 JQuery中有一个名为Live Events的新功能。我没有挖到他们,但我认为他们可能会帮助他们。否则,当您添加新元素时,请务必绑定悬停函数。

答案 1 :(得分:0)

好的,这个解决方案有两个部分。

第一个罪魁祸首是一些讨厌的缓存,我在Cassini / IE中无法弄清楚。我尝试重新启动,停止卡西尼,重新启动VS2010 ......没有任何效果。

此计算机上的代码仍无法在我帐户上的IE上运行。部署到IIS的版本适用于所有浏览器。如果我更改文件名,它也适用于IE。但是那里有东西被塞进去了。如果我用Cassini / IE运行该项目,然后打开FireFox并转到该站点,它可以工作。我试图重新发出错误来提交错误,但我无法让它去。我离题了。为了解决这个问题,我更改了.js文件的名称,并将引用移动到母版页中的其他位置。

另一件事是我确实必须使用OnSuccess。当我试图找出问题时,我转而使用OnComplete。在我弄清楚文件/浏览器/服务器问题后,我意识到OnComplete(根据文档)在文档更新之前触发;元素正在更新,但随后被抛弃。

OnSuccess / OnComplete可能有助于为某人排序,不确定文件/浏览器/服务器问题......可能是环境问题。