0

我有一个带有按钮和标签的简单 ASP.NET 网络表单页面。在 Windows 上使用 Safari 5.1.7 时,单击按钮会导致回发,但实际上不会因为某些奇怪的原因触发按钮单击事件。

没有 javascript 错误。没有任何类型的 UpdatePanel 或 AJAX。这实际上是我正在测试的页面:

<!doctype html>
<html lang="en">
<head runat="server">
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </form>
</body>
</html>

后面的代码很简单:

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "test";
}

单击按钮时,Page_Load 事件确实会触发一次,但 Page.IsPostBack 返回 FALSE 而不是 true,并且永远不会设置 Label1.Text。

请注意,此问题仅在 Safari 中发生。在 IE8+、FF15+、Chrome 21+ 和 Opera 12+ 中一切正常。

我已经阅读了许多关于隐藏字段大小限制(以及因此视图状态)的 Safari 怪异的帖子——但是这个页面甚至不应该使用视图状态(如果有的话)。还有很多关于与 UpdatePanels 和/或 AJAX 调用相关的 javascript 错误的帖子,但正如您所见,这里没有这些帖子。

我相信这个问题也是相关的,但我想用示例 html/cs 开始一个新问题,这样你就可以重现这个问题。

我错过了什么还是Windows上的Safari真的很奇怪?

4

1 回答 1

0

我无法在 Safari 5.1.7 中复制它。您能否提供有关如何绑定事件的更多信息?您的手动分配onclick="Button1_Click"意味着您正在执行手动事件连接。您的页面声明与此匹配吗?

您确定您的 Page_Load 事件正在触发吗?你的例子是空的。

也许更详细的事件绑定是有序的,以下对我有用:

ASPX 测试页面:

<%@ Page Language="C#" AutoEventWireup="false" 
    CodeFile="default.aspx.cs" Inherits="PgSafari" %>
<!doctype html>
<html lang="en">
<head runat="server">
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

        <div><asp:Literal runat="server" ID="litTimeStamp" EnableViewState="false" /></div>

        <div><asp:Button ID="Button1" runat="server" Text="Button" /></div>
        <div><asp:Label ID="Label1" runat="server" Text="Default Label Text" /></div>

        <div>
            <h6>Log:</h6>
            <asp:PlaceHolder runat="server" ID="plcOut" />
        </div>

    </form>
</body>
</html>

后面的代码:

using System;
using System.Web.UI;

public partial class PgSafari : System.Web.UI.Page
{
    public PgSafari()
    {
        //Bind Page Events
        this.Init += new EventHandler(PgSafari_Init);
        this.Load += new EventHandler(PgSafari_Load);
    }

    protected void PgSafari_Init(object sender, EventArgs e)
    {
        Log("_Init()");

        //Bind Page Control Events
        Button1.Click += new EventHandler(Button1_Click);
    }

    protected void PgSafari_Load(object sender, EventArgs e)
    {
        Log("_Load()");
        Log("Page.IsPostBack = " + (Page.IsPostBack));

        litTimeStamp.Text = "TimeStamp: " + DateTime.Now.ToString("mm:ss.fff");
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Log("Button1_Click()");
        Label1.Text = "test";
    }

    //===============\\

    private void Log(String msg)
    {
        plcOut.Controls.Add(new LiteralControl("<div>" + msg + "</div>"));
    }
}

Safari 中的初始页面看起来应该是:
  TimeStamp: 58:44.452
  <button>
  Default Label Text
  Log:
  _Init()
  _Load()
  Page.IsPostBack = False

单击它看起来也应该:
  TimeStamp:59:48.869
  <button>
  TEST!
  日志:
  _Init()
  _Load()
  Page.IsPostBack = True
  Button1_Click()

于 2012-09-29T06:07:57.590 回答