У меня есть страница в моем приложении, где blur () подключена к событию onchange раскрывающегося списка с помощью jquery.Этот drowndownlist настроен на автоответчик.Размытие предназначено для удаления фокуса из выпадающего списка при выборе.Я не буду вдаваться в подробности того, почему это делается.
Добавление blur () к событию onchange приводит к двойным обратным передачам.Это происходит не при каждом выборе, но очень часто происходит двойной постбэк.Я могу видеть это в trace.axd, который показывает два постбэка с одинаковой отметкой времени.
Я смог воспроизвести это на простом примере страницы.
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Session["log"] = string.Format("{0}value={1}<br/>", Session["log"], DropDownList1.SelectedValue);
Session["Counter"] = (int)Session["Counter"] + 1;
}
else
{
Session["log"] = string.Empty;
Session["counter"] = 0;
}
}
</script>
<html>
<head>
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
$("select").change(function (e) {
e.target.blur();
});
});
</script>
</head>
<body>
<form runat="server">
<h2>
Double Postback
</h2>
<p>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true">
<asp:ListItem Text="1" Value="1"></asp:ListItem>
<asp:ListItem Text="2" Value="2"></asp:ListItem>
<asp:ListItem Text="3" Value="3"></asp:ListItem>
</asp:DropDownList>
</p>
<p>
<%=Session["counter"] %><br />
<%=Session["log"] %>
</p>
</form>
</body>
</html>
Сеанс в нем должен вести журнал (легче, чем trace.axd), когда это происходит.Вы увидите два дублированных значения журнала, выплевывающих на экран.Я использую ASP.NET 4.0.
Может кто-нибудь сказать мне, почему использование document.ready для добавления размытия в onchange приведет к двойной обратной передаче?Похоже, что он должен каким-то образом отключить второе событие onchange.
РЕДАКТИРОВАТЬ: Это, кажется, происходит только в IE (IE8 - то, что я использую) Chrome и Firefox не имеют двойной обратной передачи.
Похоже, эта проблема связана с jQuery проблемой с событием изменения и IE8