#javascript #asp.net #javascript-events #script#
#javascript #asp.net #dom-события #скрипт#
Вопрос:
Я использую библиотеку Script # с ASP.NET . Я хочу прослушать onBeforeUnload
событие браузера и ответить на него.
В настоящее время я перехватываю событие следующим образом:
Window.AttachEvent( "onbeforeunload", OnNavigateAway );
...
private void OnNavigateAway()
{
Script.Alert("You're leaving.");
}
Но вторым параметром для Window.AttachEvent
является DOMEventHandler
, который имеет возвращаемый тип void
. Чтобы использовать onBeforeUnload
событие, мне нужно иметь возможность возвращать строковое значение, которое браузер использует в качестве сообщения подтверждения.
Есть ли какой-либо способ сделать это без использования литерала скрипта или ручного кодирования JavaScript? Я бы действительно предпочел оставаться в скомпилированном C # -> JavaScript как можно дольше.
На случай, если это имеет значение, я использую версию 0.5.5 библиотеки Script #, которая не является последней версией, но пока я ограничен этим.
ОБНОВЛЕНИЕ: DuckMaestro отлично ответил на мой вопрос, но у меня это все равно не сработало. Это правильный ответ на мой вопрос в том смысле, что скомпилированный JavaScript — это именно то, что я ожидал и чего хотел. Но это не дает желаемого эффекта, заставляя браузер выдавать предупреждение.
Однако у меня есть обходной путь, на случай, если кто-то еще наткнется на этот ответ и захочет узнать, как я изначально взломал его, чтобы заставить работать. Вместо этого:
public delegate string BeforeUnloadDelegate();
...
Window.AttachEvent( "onbeforeunload", (DOMEventHandler) (Object)
new BeforeUnloadDelegate(OnNavigateAway) );
Я сделал это:
Script.Literal( "window.onbeforeunload = this._onNavigateAway" );
Это дурной тон по ряду причин. Это будет работать только на .debug.js класс, который генерирует Script#; Script# изменяет имена в версии выпуска, поэтому скрипт генерируется скриптом.Оператор Literal не будет соответствовать. Кроме того, это сводит на нет многие преимущества использования Script # в первую очередь. (Например, использование инструментов рефакторинга Visual Studio для переименования OnNavigateAway
во что-то другое приведет к потере ссылки в строке.) Кроме того, код C # объявляет метод как OnNavigateAway
, тогда как Script.Literal
должен ссылаться на this._onNavigateAway
.
Тем не менее, если у вас, как и у меня, поджимают сроки и вы ищете способ взлома, с этого стоит начать. Если я добьюсь большего прогресса в более правильной версии, я обновлю этот вопрос с подробностями.
Еще раз спасибо DuckMaestro за ответ на вопрос, который я задал.
Ответ №1:
Я бы объявил новый тип делегата
public delegate string BeforeUnloadCallback();
а затем измените ваш код attachEvent на
Window.AttachEvent( "onbeforeunload", (DOMEventHandler)(Object) new BeforeUnloadCallback(OnNavigateAway) );
Я не уверен, что это сработает в версии 0.5.5, но именно такой трюк я время от времени использую в 0.6.x.
Комментарии:
1. Вау, отличный трюк! Это выдало именно тот Javascript, который я хотел выдать. Возвращаемое значение по-прежнему не интерпретируется браузером, но я сильно подозреваю, что проблема в том, как attachEvent вызывается Script # . Я буду продолжать искать ответ. Большое спасибо за вашу помощь, хотя — это пригодится в будущем!