Аннотация: В этой статье обсуждается, как реализовать различные всплывающие окна с помощью CodeBehind в ASP.NET и взаимодействовать с всплывающими окнами. В нем также обсуждаются различные варианты поведения фильтрации часто используемых нестандартных браузеров IE для всплывающих окон и соответствующие меры противодействия использованию всплывающих окон, чтобы предоставить универсальное и лучшее решение для использования всплывающих окон.
Ключевые слова: ASP.NET, CodeBehind, фильтрация, COM-интерфейс, JavaScript, привязка.
Будучи новейшим инструментом Microsoft для создания динамических веб-сайтов, ASP.NET добился значительного прогресса в изменении исходного метода веб-программирования по сравнению с ASP и JSP. Его технология разделения кода и страниц (CodeBehind) и полные элементы управления веб-сервером предоставляют программистам метод разработки на стороне веб-сервера, который больше соответствует традиционному программированию. Однако веб-программирование по-прежнему имеет характеристики, отличающиеся от традиционного программирования. Эти характеристики определяют, что в программировании ASP.NET необходимо использовать некоторые специальные методы для выполнения требований программы. Типичным представителем этого типа программирования являются всплывающие окна. Многие книги по программированию ничего не говорят о всплывающих окнах или просто упоминают их одним словом, как будто не понимая огромного мира использования всплывающих окон. Эта статья решит за вас большинство проблем при использовании всплывающих окон.
Чтобы улучшить параллелизм и пропускную способность доступа к веб-сайту, ASP.NET, как и другие серверные сценарии, также использует сценарии на стороне клиента, чтобы снизить нагрузку на сервер. ASP.NET до сих пор напрямую не поддерживает всплывающие окна (версия 1.1), и всплывающие окна на стороне клиента должны использоваться через JavaScript (или VBScript).
1. Окно предупреждения и метод использования клиентского сценария в CodeBehind.
Чтобы открыть простейшее окно предупреждения в браузере, вы можете использовать оператор JavaScript:
window.alert([sMessage])
, где sMessage — это сообщение с подсказкой. К сожалению, такое всплывающее окно имеет только кнопку «ОК» и может служить только подсказкой. Если мы хотим, чтобы при удалении записи появлялось всплывающее окно с запросом, вам нужно использовать:
bConfirmed = window.confirm([sMessage]),
где: bConfirmed — возвращаемое значение, а sMessage — сообщение с подсказкой. В этом всплывающем окне есть две опции: «ОК» или «Отказаться», а возвращаемое значение по его выбору помещается в bConfirmed, чтобы код мог принять решение.
Чтобы улучшить возможность повторного использования и читаемость кода, JavaScript и Codehind следует интегрировать друг с другом. Обычно есть два способа добиться такого эффекта.
(1) Используйте метод Response.Write.
Использование метода Response.Write поддерживалось еще в эпоху ASP. Он может писать код клиенту, что является очень удобным и интуитивно понятным методом. Следующий код демонстрирует, как использовать метод Response.Write для отображения предупреждающего сообщения.
Частный Sub btAlert_Click (отправитель ByVal As System.Object, ByVal e As System.EventArgs) Обрабатывает btAlert.Click
' Демонстрирует метод Response.Write и окно оповещения.
Ответ.Запись(" ")
End Sub
(2) Используйте метод RegisterXXX.
Если вы посмотрите на HTML-код, сгенерированный Response.Write, вы обнаружите, что код, сгенерированный методом Response.Write, записывается в самое начало HTML-кода, то есть до него. тег. На данный момент все объекты HTML еще не созданы. Если вы хотите использовать объекты HTML и взаимодействовать с ними, возникнет ошибка «объект не найден». Поэтому автор рекомендует метод, который больше соответствует методу CodeBehind, — использование метода RegisterXXX. RegisterXXX включает в себя: RegisterClientScriptBlock, RegisterStartupScript и функцию IsStartupScriptRegistered для оценки.
Прототипом RegisterStartupScript является:
Overridable Public Sub RegisterStartupScript( _
Ключ ByVal As String, _
Скрипт ByVal As String _
)
, где: key представляет собой уникальный идентификатор этого скрипта, а script — это строка, представляющая скрипт.
Прототип RegisterClientScriptBlock аналогичен RegisterStartupScript. Разница между этими двумя функциями заключается в том, что содержащийся в них код сценария записывается в разные места HTML-файла. RegisterClientScriptBlock создает клиентский сценарий сразу после открывающего тега элемента объекта Page, а RegisterStartupScript создает сценарий перед закрывающим тегом элемента объекта Page. Если в вашем скрипте есть операторы, которые взаимодействуют с объектом страницы (объектом документа) (это будет показано в наших последующих примерах), рекомендуется использовать RegisterStartupScript. С другой стороны, если вы хотите, чтобы клиентский скрипт выполнялся уже сейчас. возможно, вы можете использовать RegisterClientScriptBlock или Response.Write.
Чтобы предотвратить повторное добавление скриптов на страницу, ReisterStartupScript/RegisterClientScriptBlock использует ключ в качестве регистрационного ключа при регистрации скрипта, а затем IsClientScriptBlockRegistered можно использовать для принятия решений в программе.
В следующем примере будет использоваться RegisterClientScriptBlock, чтобы продемонстрировать использование подтверждения.
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Обрабатывает btConfirm.Click
'Продемонстрируйте метод RegisterClientScriptBlock и подтвердите windowIf
(Not IsClientScriptBlockRegistered("clientScript")) Тогда
'Определите, был ли добавлен скрипт, если нет, добавьте его.
Dim strScript как строка
стрСкрипт = " "
'Регистрация скриптаRegisterClientScriptBlock("clientScript", strScript)
'Если вы выберете «Нет», продолжите выполнение.
End If
End Sub
2. Всплывающее окно указанной страницы
далеко не соответствует нашим требованиям. В программе нам часто требуется всплывающее окно указанной страницы. В настоящее время вы можете использовать метод JavaScript window.open. С помощью предыдущего метода RegisterClientSciptBlock мы можем открыть указанную страницу.
Следующий код показывает, как открыть указанную страницу:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Обрабатывает btWinOpen.Click
'Используйте window.open и RegisterStartupScript для простой демонстрации.
Если (Не IsClientScriptBlockRegistered("OpenScript")) Тогда
'Определите, был ли добавлен скрипт, если нет, добавьте его.
Dim strScript As String = " "
RegisterStartupScript("OpenScript", стрСкрипт)
Конец, если
End Sub
использует метод Window.open для открытия новой страницы, которая имеет только один параметр: URL-адрес нового всплывающего окна. Оказывается, метод window.open имеет несколько параметров, но это простой вопрос javascipt, и мы не будем здесь вдаваться в подробности. Если у вас есть вопросы по этой теме, пожалуйста, проверьте MSDN.
Эта программа отлично работает при использовании непосредственно в IE. А вот если вы используете такие браузеры, как GoSurf, MyIE2, NetCapter и т.п., то к сожалению! Вы не увидите всплывающие окна. Это то, что мы собираемся обсудить о фильтрации всплывающих окон.
3. Обсудите поведение фильтрации всплывающих окон в нестандартных браузерах IE.
Распространение рекламных окон сделало многих пользователей сети невыносимыми из-за преследования рекламой. Они отказались от стандартных браузеров IE и использовали такие браузеры, как GoSurf, MyIE2, и NetCapter, которые используют ядро IE для поддержки нескольких страниц, и программное обеспечение, которое автоматически блокирует рекламу. Говорят, что в грядущем IE6 sp2 Microsoft также добавит функцию блокировки рекламных окон. Для большинства пользователей Интернета это, конечно, хорошо, но для программистов способ использования всплывающих окон принципиально не отличается от обычной рекламы. Такие окна также будут без разбора блокироваться менеджером всплывающих окон. конечно, мы не хотим этого видеть. Есть ли стандартный способ заставить окно нормально всплывать? Это требует от нас понимания принципа блокировки рекламы браузером. Обычные блокировщики рекламы используют следующие три метода для фильтрации рекламы:
(1) Метод блокировки на основе заголовка окна.
Принцип этого метода блокировки заключается в регулярной проверке всех заголовков окон IE, а затем их фильтрации на основе существующего списка (поддерживаемого браузером). программа), список массивов) для сравнения, если есть такой же, закрываем это окно. Очевидно, что этот метод имеет много недостатков. Он блокирует все всплывающие окна и является слишком строгим. В программе используется редко. Однако метод деформирования на его основе довольно распространен. То есть технология интеллектуальной фильтрации, основанная на имени заголовка окна, блокирует всплывающие окна в зависимости от того, содержит ли заголовок ключевые слова, связанные с рекламой. Это хорошее исследование для улучшения эффекта фильтрации.
(2) Метод блокировки на основе класса и местоположения окна.
После анализа было обнаружено, что имена классов обычных окон просмотра — IEFRAME и CabinetWClass, а имя класса рекламных окон — CabinetWClass. Дальнейший анализ показал, что: значения rect.top класса WorkerA рекламного окна и класса Shell DocObject View одинаковы, но значения rect.top класса WorkerA обычного окна IE и класс Shell DocObject View отличается. Основываясь на двух вышеуказанных пунктах, вы можете написать программу-убийцу рекламы. На самом деле я скептически отношусь к возможности обобщения этой программы. Поскольку автор использовал Spy++ для анализа и обнаружил, что в Windows2000 (операционной системе, используемой автором) все классы окон IE являются IEFrame. В то же время, поскольку Win2000 — операционная система, основанная на коде Unicode, класс WorkerA отсутствует и заменяется классом WorkerW. При этом не бывает ситуации, когда rect.top отличается. Поскольку у автора нет операционной системы WindowsXP, дальнейшие эксперименты на WindowsXP я проводить не могу.
(3) Методы блокировки, основанные на компонентах IE COM.
Два вышеупомянутых метода рассматривают окно IE как обычное окно Windows и выносят суждения. Фактически, IE — это типичный браузер, основанный на компонентах COM. Все браузеры, основанные на ядре IE, упаковывают файл shdocvw.dll, а затем записывают соответствующий код BHO. Только таким образом мы сможем по-настоящему контролировать браузер IE, а не царапать поверхность, как первый и второй методы.
Также существует метод блокировки всплывающих окон, основанный на ядре IE. Он блокирует всплывающие окна до их открытия. Принцип таков: всякий раз, когда IE открывает новое окно, срабатывает событие NewWindow и выполняется метод OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel). Перегрузите этот метод, чтобы определить, происходит ли событие открытия нового окна после загрузки страницы просмотра. Если да, то это обычное всплывающее окно, иначе оно будет перехвачено.
Поскольку такие браузеры, как Gosurf, перегружают компонент Shocvm.dll, естественно использовать третий метод. Однако в процессе использования мы иногда обнаруживаем, что фильтрация рекламы не идеальна, но принцип в основном тот же.