Я хотел бы сначала загрузить страницу ASP.NET, а затем запустить событие на стороне сервера, которое, в свою очередь, обновляет HTML-код на клиенте.Событие привязано к элементу управления изображения Anthem.NET, поэтому логичным шагом будет просто запустить событие этого элемента управления.Однако, если есть другой подход к запуску этого события на стороне сервера и возвращению результирующего HTML-кода usercontrol клиенту, я также рассмотрю его.Я использую ASP.NET 3.5, платформу Anthem.NET и JQuery 1.4.4.
Я работал над этим несколько часов и просмотрел несколько сообщений, которые, казалось, имели ответ, однако ни одногоказалось, добился цели - по крайней мере, не будет работать в каждом браузере.
Кнопка, которую я пытаюсь запустить:
<anthem:ImageButton runat="server" ID="btnGetRates"
ImageUrl="~/BVModules/Themes/BVC5/Images/Buttons/GetRates.png"
TextDuringCallBack="Retrieving rates...">
</anthem:ImageButton>
, которая выглядит так, когда отображается на клиенте:
<span id="Anthem_ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates__">
<input type="image"
name="ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates"
id="ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates"
src="BVModules/Themes/Depot/images/buttons/GetRates.gif"
onclick="javascript:Anthem_FireCallBackEvent(this,event,'ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates','',true,'','','Retrieving rates...',true,null,initAccordion,null,true,true);return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContentHolder$EstimateShippingDisplay2$btnGetRates", "", true, "", "", false, false))"
style="border-width:0px;" />
</span>
Подход 1:
jQuery(document).ready(function() {
setTimeout(getRates, 5000);
});
function getRates() {
jQuery('#ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates').click();
}
При использовании этого метода текст кнопки обновляется до «Получение тарифов ...», однако при вызове его никогда не происходитсервер и он просто зависает бесконечно (в IE7).В Firefox кнопка меняется на доли секунды, а затем возвращается обратно, и вызов на сервер также не запускается.
Интересно, если функция getRates () вызывается из события нажатия кнопки, а не из(document) .ready () будет работать (в IE, но не в Firefox).
Подход 2:
Я следовал инструкциям в принятом ответе в Вызов функции ASP.NET из JavaScript? , но помимо того, что мой серверный метод не запускается, этот подход не учитывает тот факт, что я хочу, чтобы выходной HTML пользовательского элемента управления отображался на клиентекогда метод завершен.
Подход 3:
jQuery(document).ready(function() {
setTimeout(getRates, 5000);
});
function getRates() {
var btn = document.getElementById('ctl00_MainContentHolder_EstimateShippingDisplay2_btnGetRates');
fireEvent(btn,'click');
}
function fireEvent(element,event){
if (document.createEventObject){
var evt = document.createEventObject();
return element.fireEvent('on'+event,evt)
} else {
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true ); // event type,bubbling,cancelable
return !element.dispatchEvent(evt);
}
}
Я нашел этот метод запуска событий здесь .
Вместо того, чтобы использовать подход jQuery, это восходит к основам javascript.Этот метод отлично работает в IE, но снова у меня возникают проблемы с Firefox.Так как это работает в одном браузере, я знаю, что я должен быть ближе.
Интересно, что, несмотря на то, что это перешло от обычной работы к полной работе в IE, поведение Firefox точно такое же, как былос подходом № 1 - кнопка на мгновение меняется на текст «Получение тарифов ...» и меняется так быстро, что едва заметна.
Другая подсказка:
Я покопался в JavaScript Anthem.NET, чтобы посмотреть, смогу ли я найти подсказку о том, что происходит.Хотя я нашел подсказку, я не уверен, почему именно это вызывает эту разницу в поведении браузера, или, более конкретно, как выглядит код для обработки этого другого поведения.Как видно из следующего кода, событие кнопки для IE прикрепляется иначе, чем для других браузеров.И если вам интересно, да, я использую средства проверки (валидаторы).
// Primarily used by Anthem.Manager to add an onsubmit event handler
// when validators are added to a page during a callback.
function Anthem_AddEvent(control, eventType, functionPrefix) {
var ev;
eval("ev = control." + eventType + ";");
if (typeof(ev) == "function") {
ev = ev.toString();
ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
}
else {
ev = "";
}
var func;
if (navigator.appName.toLowerCase().indexOf('explorer') > -1) {
func = new Function(functionPrefix + " " + ev);
}
else {
func = new Function("event", functionPrefix + " " + ev);
}
eval("control." + eventType + " = func;");
}
Я почти готов добавить полотенце и начать работать над подходом, использующим веб-сервис для получения выходных данных.html моего пользовательского элемента управления, а затем возвращаю его в jQuery, чтобы его можно было заменить в форме на стороне клиента, но я подумал, что я проверю, чтобы узнать, может ли кто-нибудь дать мне подсказку о том, как заставить подход № 3 работать вIE браузеры.