Я создал страницу, которая объединяет встроенный jQuery UI datepicker . Я не хочу инициировать обратный вызов панели обновления, когда пользователь нажимает новую дату, чтобы обновить некоторые данные. Теперь эта страница имеет несколько панелей обновления (не спрашивайте :)), поэтому мне нужно проверить, какая панель обновлений выполнила перезагрузку, чтобы сделать что-то на стороне клиента. Я использую __doPostBack
для обратной передачи и Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {}
для прослушивания после завершения обновления.
Проблема в том, что в FF обратный вызов говорит мне, что это не асинхронная операция, и данные, которые мне нужны, чтобы проверить, какая панель обновления выполнила обновление, установлены в нуль.
Моя проблема в том, что это нормально работает в IE, но не в любом другом браузере, что может быть вызвано двумя причинами: IE переходит в причудливый режим, который решает проблему (это то, что я думаю), или что IE имеет какой-то вид встроенной поддержки панели обновления, которую не поддерживают другие браузеры.
Я сузил проблему и создал тестовую страницу:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js "></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js "></script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript">
function doAspNetPostback() {
__doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', '');
}
$(document).ready(function() {
/* Create the datepicker */
buildDatepicker();
/* Add callback-method for when the scriptmanager finished a request */
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {
/* Show the panelID - This is 'upd1|hiddenOnSelectionChangedButton' in IE as it should be, and null in Chrome / FF */
alert(sender._postBackSettings.panelID);
});
});
function buildDatepicker() {
var dp = $("#datepicker").datepicker({
onSelect: function(dateText, inst) {
/* Do a postback when someone clicks a date */
doAspNetPostback();
}
});
}
</script>
<div id="datepicker">
</div>
<asp:UpdatePanel UpdateMode="Conditional" ID="upd1" runat="server">
<ContentTemplate>
<asp:Button ID="hiddenOnSelectionChangedButton" Text="Press me" runat="server" />
<div id="lala" runat="server">
Upd1
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
Запуск этой тестовой страницы в IE приведет к появлению окна сообщения, которое показывает, что он должен делать, в то время как загрузка его в FF или Chrome приведет к появлению сообщения, в котором будет указано "null":)
Я пробовал все виды вещей, но я не уверен, что может вызвать такое поведение, потому что я не очень глубоко во внутренней работе jQuery или ASP.NET Ajax. Однако, если я перебираю код в FireBug достаточно медленно, он работает ... Что заставляет меня думать, что это может быть проблема с совместимостью между обратными вызовами jQuery и обратными вызовами ASP.NET Ajax?
Любая помощь или идеи будут высоко оценены.
Спасибо.
[ОБНОВЛЕНИЕ] Тим решил это! Большое спасибо! - Также спасибо всем, кто потратил свое время, пытаясь понять это:)