Как мне использовать событие onBeforeUnload с помощью Script #?

#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 # . Я буду продолжать искать ответ. Большое спасибо за вашу помощь, хотя — это пригодится в будущем!