【发布时间】:2012-02-18 17:11:59
【问题描述】:
我是 jQuery 的新手,但我的页面上有一些链接应该在单击时切换表单的可见部分,或者如果禁用了 javascript,它会执行完整的回发以切换这些部分
它在我的测试环境中运行良好,PostBack 发生在 jQuery 脚本之后,但是一旦我部署它,PostBack 就会发生在 jQuery 单击事件之前。它部署在运行 IIS 6.0 的 Windows 2003 服务器上,而我的测试环境是 Windows XP / IIS 5.1 / VS2010
这是我正在使用的代码。如果我将脚本放在.ready() 而不是.click() 但在.click() 我什至没有收到警报,则脚本在生产中运行,所以我假设问题是在 jQuery 脚本有机会之前发生的 PostBack执行。
jQuery:
$(document).ready(function () {
// Toggle Details
$('.toggleDetailsButton').click(function () {
alert('test');
$(this).parentsUntil(".parentRow").parent().next().toggleClass("hidden");
return false;
});
});
代码隐藏:
Protected Sub rpData_ItemCommand(ByVal sender As Object, ByVal e As RepeaterCommandEventArgs) Handles rpData.ItemCommand
// Manually toggle rows here
End Sub
平均售价:
<asp:Repeater ID="rpData" runat="server">
<ItemTemplate>
<tr class="parentRow">
...
<asp:Button runat="server" ID="cmdViewDetails"
CommandName="ToggleDetails" Text="details"
CssClass="buttonAsLink toggleDetailsButton" />
...
</tr>
<tr id="rpData_DetailsRow" class="detailsRow hidden" runat="server">
</tr>
</ItemTemplate>
</asp:Repeater>
编辑
根据下面 cmets 中的建议,在onClientClick 中运行 jQuery 函数会使页面按应有的方式运行,但是我仍然想知道为什么 PostBack 在我的测试环境中的 jQuery 事件之后发生,但在 jQuery 之前生产中的事件。
我还注意到两者之间的其他差异。例如,我还有一个按钮可以打开/关闭搜索 div,该按钮在测试中可以正常工作,但在生产中却不行。它使用$('.toggleSearchButton').next() 来获取搜索按钮下的 div 并切换它的类名。在生产中,此对象返回[object Object],但调用.attr('class') 会返回undefined(.attr('id')、.attr('tag') 和.nodeName 也是如此)。在我的测试环境中,它会为我的搜索 div 返回正确的值。
我已经在 IE、FF 和 Chrome 中测试了这种行为。在我的测试机器上,它在所有 3 上都可以正常工作。在我的生产机器上,只有 IE 可以正常工作。
【问题讨论】:
-
看看你的点击功能中的api.jquery.com/event.stopPropagation是否没有清除问题。
-
@asawyer
alert不会弹出,所以我假设 PostBack 发生在点击事件之前。这意味着stopPropagation也不会运行(只是测试过它并没有帮助) -
好点。这里还早。试试这个 - 将你的匿名点击函数更改为一个普通的命名函数,并在 html 中设置一个 onclick='return xxx',看看它现在是否不能进入该函数。
-
@asawyer 当我将 javascript 放入
onClientClick时它运行(onClick尝试执行 PostBack,因为这是一个 asp 按钮)。我仍然想知道为什么我不能使用我所拥有的语法,因为如果可能的话,我宁愿将我的 javascript 保留在我的 asp 文件之外。 -
@Becuzz 如果托管在我的测试环境中,它在 IE、FF 和 Chrome 中运行良好,但我注意到 Chrome 的生产副本中存在问题。我刚刚测试了IE和FF,FF也有同样的问题,但是IE运行正常。
标签: jquery asp.net iis-6 asp.net-2.0 iis-5