我很难确定在运行 iOS 6.0 的第三代 iPad 上的 Safari 浏览器上运行的 ASP.NET Web 应用程序中间歇性问题的根源。发生的情况是,有时,<a>
设置为通过 JavaScript 进行回发的超链接的标签会突然停止工作,并且如果您在屏幕上触摸它们似乎不会做任何事情。其中包括设置为注销链接的asp:LinkButton控件,以及设置为允许行排序的 GridView 的标题行。它背后似乎没有韵律或原因 - 它们会正常工作一段时间,然后停止,我稍后会注意到它们再次开始工作(主要是在关闭 Safari 并重新打开它之后,尽管这并不总是似乎工作)。
注销控件在 aspx 文件中如下所示:
<asp:LinkButton ID="LogoutButton" onclick="LogoutButton_Click" runat="server">[ Logout ]</asp:LinkButton>
并在生成的 HTML 中显示如下:
<a id="LogoutButton" href="javascript:__doPostBack('ctl00$LogoutButton','')">[ Logout ]</a>
在 iPad 上运行的 Safari 是否有什么特别之处可能会阻止此类链接偶尔中断,例如页面上或其他打开的浏览器选项卡中加载的数据过多,或者可能是 ViewState 在这种情况下起作用?即使在 iPad 上玩了一段时间的 web 应用程序后,我也找不到任何特定的方法来重现问题,所以我什至无法开始尝试修复它,这真的很令人沮丧,所以我正在寻找那些开发过 ASP.NET 应用程序并且非常了解 iPad 和/或 Safari 环境的人的指导。我从来没有在桌面浏览器上出现过这个问题。
更新:使用此页面上概述的有关如何在 iPad 上向 Safari 添加伪查看源选项的技巧,我现在已经能够看到回发链接正在工作的页面的生成 HTML 的差异,以及停止的页面。简而言之,ASP.NET 通常嵌入在页面中的__doPostBack JavaScript 函数......由于某种原因而停止嵌入。结果,绑定到链接的 JavaScript 只会出错。以下是 ASP.NET 通常添加到页面以使回发链接正常工作的内容:
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
这似乎与Apple 支持论坛和SO 上描述的问题相同。后者表明 ASP.NET 有时可能无法将 iPad 上的 Safari 识别为支持 JavaScript,因此无法将__doPostBack函数正确插入页面。不过,我页面上的其他 JavaScript 仍然可以正常工作,因此它并不能完全解释我的问题。