Resumen: este artículo analiza cómo implementar varias ventanas emergentes usando CodeBehind en ASP.NET e interactuar con ventanas emergentes. También analiza los diversos comportamientos de filtrado de los navegadores IE no estándar de uso común para ventanas emergentes y las contramedidas correspondientes para el uso de ventanas emergentes, con el fin de proporcionar una solución universal y mejor para el uso de ventanas emergentes.
Palabras clave: ASP.NET, CodeBehind, filtrado, interfaz COM, JavaScript, enlace
Como la última herramienta de Microsoft para crear sitios web dinámicos, ASP.NET ha logrado grandes avances en el cambio del método de programación web original en comparación con ASP y JSP. Su tecnología de separación de código y páginas (CodeBehind) y controles completos del servidor web brindan a los programadores un método de desarrollo del lado del servidor web que está más en línea con la programación tradicional. Sin embargo, la programación web todavía tiene características que son diferentes de la programación tradicional. Estas características determinan que se deben utilizar algunas técnicas especiales en la programación ASP.NET para completar los requisitos del programa. Las ventanas emergentes son representativas de este tipo de método de programación. Muchos libros de programación guardan silencio sobre las ventanas emergentes o simplemente las mencionan en una sola palabra, pareciendo no comprender el enorme mundo del uso de las ventanas emergentes. Este artículo resolverá la mayoría de los problemas relacionados con el uso de ventanas emergentes.
Para mejorar la concurrencia y el rendimiento del acceso al sitio web, ASP.NET, al igual que otros scripts del servidor, también utiliza scripts del lado del cliente para reducir la presión sobre el servidor. ASP.NET no admite directamente ventanas emergentes hasta ahora (versión 1.1), y las ventanas emergentes del lado del cliente deben usarse a través de JavaScript (o VBScript).
1. Ventana de advertencia y método de uso del script del lado del cliente en CodeBehind
Para abrir la ventana de advertencia más simple en el navegador, puede usar la instrucción JavaScript:
window.alert([sMessage])
donde sMessage es el mensaje de aviso. Desafortunadamente, una ventana emergente de este tipo sólo tiene un botón "Aceptar" y sólo puede servir como mensaje de aviso. Si queremos que aparezca una ventana emergente de consulta al eliminar un registro, debemos usar:
bConfirmed = window.confirm([sMessage])
donde: bConfirmed es el valor de retorno y sMessage es el mensaje emergente. Esta ventana emergente tiene dos opciones: "Aceptar" o "Renunciar", y el valor de retorno de su elección se coloca en bConfirmed para que el código emita un juicio.
Para mejorar la reutilización y legibilidad del código, JavaScript y Codehind deben integrarse entre sí. Generalmente hay dos formas de lograr este efecto.
(1) Utilice el método Response.Write:
el uso del método Response.Write se admite desde la era ASP. Puede escribir código para el cliente, lo cual es un método muy conveniente e intuitivo. El siguiente código demuestra cómo utilizar el método Response.Write para mostrar un mensaje de advertencia.
Sub privado btAlert_Click (remitente ByVal como System.Object, ByVal y como System.EventArgs) maneja btAlert.Click
'Demuestra el método Response.Write y la ventana de alerta.
Respuesta.Escribir(" ")
End Sub
(2) Utilice el método RegisterXXX
Si observa el código HTML generado por Response.Write, encontrará que el código generado por el método Response.Write está escrito al principio del código HTML, es decir, antes. la etiqueta. En este momento, aún no se han generado todos los objetos HTML. Si desea utilizar e interactuar con objetos en HTML, se producirá un error de "objeto no encontrado". Por lo tanto, el autor recomienda un método que esté más en línea con el método CodeBehind: utilizar el método RegisterXXX. RegisterXXX incluye: RegisterClientScriptBlock, RegisterStartupScript y la función IsStartupScriptRegistered para juicio.
El prototipo de RegisterStartupScript es:
Sub RegisterStartupScript público reemplazable (_
Clave ByVal como cadena, _
Script ByVal como cadena _
)
donde: clave representa el identificador único de este script y script es una cadena que representa el script.
El prototipo de RegisterClientScriptBlock es el mismo que RegisterStartupScript. La diferencia entre las dos funciones es que el código de secuencia de comandos que contienen está escrito en diferentes ubicaciones del archivo HTML. RegisterClientScriptBlock emite el script del cliente inmediatamente después de la etiqueta de apertura del elemento del objeto Page, y RegisterStartupScript emite el script antes de la etiqueta de cierre del elemento del objeto Page. Si su secuencia de comandos tiene declaraciones que interactúan con el objeto de la página (objeto de documento) (esto se verá en nuestros ejemplos posteriores), se recomienda utilizar RegisterStartupScript. Por otro lado, si desea que la secuencia de comandos del cliente se ejecute tan pronto como. posible, puede utilizar RegisterClientScriptBlock o Response.Write.
Para evitar la adición repetida de scripts a la página, ReisterStartupScript/RegisterClientScriptBlock usa la clave como clave de registro al registrar el script, y luego IsClientScriptBlockRegistered se puede usar para emitir juicios en el programa.
El siguiente ejemplo utilizará RegisterClientScriptBlock para demostrar el uso de confirmar.
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja btConfirm.Click
'Demuestra el método RegisterClientScriptBlock y confirma windowIf
(Not IsClientScriptBlockRegistered("clientScript")) Luego
'Determine si el script ha sido agregado, si no, agréguelo.
Dim strScript como cadena
cadenaScript = " "
'Registrar scriptRegisterClientScriptBlock("clientScript", strScript)
'Si selecciona "No", continúe la ejecución.
End If
End Sub
2. Abrir la página especificada
El simple hecho de tener una ventana de aviso está lejos de cumplir con nuestros requisitos. En el programa, a menudo necesitamos abrir la página especificada. En este momento, puede utilizar el método window.open de JavaScript. Con el método RegisterClientSciptBlock anterior, podemos abrir la página especificada.
El siguiente código muestra cómo abrir la página especificada:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
'Utilice window.open y registreStartupScript para una demostración sencilla.
Si (no es IsClientScriptBlockRegistered ("OpenScript")) entonces
'Determine si el script ha sido agregado, si no, agréguelo.
Dim strScript como cadena = " "
RegistrarseStartupScript("OpenScript", strScript)
Terminar si
End Sub
utiliza el método Window.open para abrir una nueva página, que tiene un solo parámetro: la dirección URL de la nueva ventana emergente. Resulta que el método window.open tiene múltiples parámetros, pero esto es una simple cuestión de javascipt y no entraremos en detalles aquí. Si tiene preguntas relacionadas, consulte MSDN.
Este programa funciona bien cuando se usa directamente en IE. Pero si utiliza navegadores como GoSurf, MyIE2, NetCapter, etc., ¡desafortunadamente! No verás ventanas emergentes. Esto es lo que vamos a discutir sobre el filtrado de ventanas emergentes.
3. Discuta el comportamiento de filtrado de ventanas emergentes de los navegadores IE no estándar.
La proliferación de ventanas publicitarias ha hecho que muchos internautas sean insoportables para ser acosados por anuncios. Han abandonado los navegadores IE estándar y los navegadores usados como GoSurf, MyIE2, y NetCapter que utiliza el kernel de IE para admitir múltiples páginas y software que bloquea anuncios automáticamente. Se dice que en el próximo IE6 sp2, Microsoft también agregará la función de bloquear ventanas publicitarias. Por supuesto, esto es algo bueno para la mayoría de los usuarios de Internet, pero para los programadores, la forma en que usamos las ventanas emergentes no es fundamentalmente diferente de los anuncios comunes. Estas ventanas también serán bloqueadas indiscriminadamente por el administrador de ventanas emergentes. Por supuesto que no queremos verlo. ¿Existe una forma estándar de hacer que la ventana aparezca normalmente? Esto requiere que comprendamos el principio del bloqueo de publicidad del navegador. Los bloqueadores de anuncios comunes utilizan los siguientes tres métodos para filtrar anuncios:
(1) Método de bloqueo basado en títulos de ventanas
El principio de este método de bloqueo es verificar periódicamente todos los títulos de ventanas de IE y luego filtrarlos según la lista existente (mantenida por el. programa). Una lista de matrices) para comparar, si hay la misma, cerramos esta ventana. Obviamente, este método tiene muchos defectos: bloquea todas las ventanas emergentes y es demasiado estricto. Rara vez se utiliza en el programa. Sin embargo, el método de deformación basado en él es bastante común. Es decir, la tecnología de filtrado inteligente basada en el nombre del título de la ventana bloquea las ventanas emergentes en función de si el título contiene palabras clave relacionadas con la publicidad. Esta es una buena exploración para mejorar el efecto de filtrado.
(2) Método de bloqueo según la clase de ventana y la ubicación
Después del análisis, se encontró que los nombres de clase de las ventanas de navegación normales son IEFRAME y CabinetWClass, mientras que el nombre de clase de las ventanas publicitarias es CabinetWClass. Un análisis más detallado encontró que: los valores de rect.top de la clase WorkerA de la ventana publicitaria y la clase Shell DocObject View son los mismos, pero los valores de rect.top de la clase WorkerA de la ventana normal de IE y la clase Shell DocObject View son diferentes. Con base en los dos puntos anteriores, puede escribir un programa publicitario excelente. De hecho, soy escéptico acerca de la generalización de este programa. Porque el autor usó Spy ++ para analizar y descubrió que en Windows2000 (el sistema operativo utilizado por el autor), las clases de Windows IE son todas IEFrame. Al mismo tiempo, dado que Win2000 es un sistema operativo basado en código Unicode, no existe la clase WorkerA y es reemplazada por la clase WorkerW. Al mismo tiempo, no existe ninguna situación en la que rect.top sea diferente. Dado que el autor no tiene un sistema operativo WindowsXP, no puedo realizar más experimentos en WindowsXP.
(3) Métodos de bloqueo basados en componentes IE COM.
Los dos métodos anteriores tratan la ventana de IE como una ventana normal de Windows y emiten juicios. De hecho, IE es un navegador típico basado en componentes COM. Todos los navegadores basados en el núcleo de IE empaquetan el archivo shdocvw.dll y luego escriben el código BHO correspondiente. Sólo de esta manera podremos controlar realmente el navegador IE, en lugar de arañar la superficie como los métodos uno y dos.
También existe un método de bloqueo de ventanas emergentes basado en el kernel de IE. Bloquea las ventanas emergentes antes de que se abran. El principio es: cada vez que IE abre una nueva ventana, se activará el evento NewWindow y se ejecutará el método OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel). Sobrecargue este método para determinar si el evento de apertura de la nueva ventana ocurre después de que se haya descargado la página de navegación. Si es así, significa que es una ventana emergente normal; de lo contrario, será interceptada.
Dado que los navegadores como Gosurf sobrecargan el componente Shocvm.dll, es natural utilizar el tercer método. Sin embargo, durante el uso, a veces encontramos que el filtrado de anuncios no es perfecto, pero el principio es básicamente el mismo.