asp.net - qué - primer programa en asp net
Eventos de activación mediante programación en Javascript para IE utilizando jQuery (6)
Cuando un evento se desencadena por un usuario en IE, se establece en el objeto window.event
. La única forma de ver qué desencadenó el evento es accediendo al objeto window.event
(hasta donde yo sé)
Esto causa un problema en los validadores de ASP.NET si un evento se desencadena programáticamente, como cuando se desencadena un evento a través de jQuery. En este caso, el objeto window.event
almacena el último evento desencadenado por el usuario.
Cuando el evento onchange
se activa programáticamente para un cuadro de texto que tiene un validador ASP.NET adjunto, la validación se rompe porque está mirando el elemento que disparó el último evento, que no es el elemento para el que está el validador.
¿Alguien sabe una forma de evitar esto? Parece un problema solucionable, pero al buscar en línea, la mayoría de las personas simplemente encuentran la forma de ignorar el problema en lugar de resolverlo.
Para explicar lo que estoy haciendo específicamente:
Estoy usando un plugin jQuery time picker en un cuadro de texto que también tiene 2 validadores ASP.NET asociados. Cuando se cambia el tiempo, estoy usando un panel de actualización para publicar de nuevo en el servidor para hacer algunas cosas dinámicamente, por lo que necesito que se active el evento onchange para activar la devolución de datos para ese cuadro de texto.
El selector de tiempo de jQuery funciona al crear una lista desordenada oculta que se hace visible cuando se hace clic en el cuadro de texto. Cuando se hace clic en uno de los elementos de la lista, el evento "cambiar" se dispara programáticamente para el cuadro de texto a través del método change()
jQuery.
Como el activador del evento era un elemento de la lista, IE ve el elemento de la lista como el origen del evento, no el cuadro de texto, como debería.
No estoy demasiado preocupado con este validador de ASP.NET que funciona tan pronto como se cambia el cuadro de texto, solo necesito que se procese el evento de " change
" para que se llame a mi evento de devolución de datos para el cuadro de texto. El problema es que el validador arroja una excepción en IE que detiene la activación de cualquier evento.
Firefox (y supongo que otros navegadores) no tienen este problema. Solo IE debido al modelo de evento diferente. ¿Alguien ha encontrado esto y ha visto cómo solucionarlo?
He encontrado este problema informado en varios otros lugares, pero no ofrecen soluciones:
Según lo que describes, es probable que este problema sea el resultado del modelo de burbujeo de eventos únicos que IE usa para JS.
Mi única respuesta real es eliminar los validadores de ASP.NET y usar un complemento de validación de formularios jQuery. Entonces, su cuadro de texto puede ser un control ASP Webforms regular y cuando el contenido cambia y una devolución de datos ocupa todo, es bueno. Además, mantiene más preocupaciones del lado del cliente separadas del código del servidor.
Nunca tuve mucha suerte mezclando controles de Webform Client (como los controles de Validación de Formulario) con bibliotecas externas de JS como jQuery. He encontrado que la mejor ruta es solo para ir con una u otra, pero no para mezclar y combinar.
No es la respuesta que probablemente estés buscando.
Si desea ir con un complemento de validación de formulario jQuery concider este jQuery Form Validation
Considere establecer el valor _EVENTTARGET del campo oculto antes de iniciar el evento con javascript. Tendrá que configurarlo en la identificación del lado del servidor (reemplace el guión bajo con $ en la identificación del cliente) para que el servidor lo entienda. Hago esto con los clics de botón que simulo para que el lado del servidor pueda determinar qué método OnClick disparar cuando se publique el resultado. Ajax o no, realmente no importa.
Así es como resolví un problema similar. Escribió un controlador onSelect () para el selector de fecha. texto de enlace En esa función, llamada __doPostBack (''textboxcontrolid'', ''''). Esto desencadenó una devolución de datos parcial para el cuadro de texto al servidor, que llamó a los validadores a su vez.
Yo tuve el mismo problema. Resuelto al usar esta función:
jQuery.fn.extend({
fire: function(evttype){
el = this.get(0);
if (document.createEvent) {
var evt = document.createEvent(''HTMLEvents'');
evt.initEvent(evttype, false, false);
el.dispatchEvent(evt);
} else if (document.createEventObject) {
el.fireEvent(''on'' + evttype);
}
return this;
}
});
Así que mi controlador de eventos "onSelect" para datepicker se ve así:
if ($.browser.msie) {
datepickerOptions = $.extend(datepickerOptions, {
onSelect: function(){
$(this).fire("change").blur();
}
});
}
Este es un problema endémico con jQuery datepickers y controles de validación ASP. Como está diciendo, el elemento equivocado provoca una rutina de validación de JavaScript de ASP NET, y luego el código M $ arroja un error porque el elemento desencadenante en la rutina no está definido.
Lo resolví de manera diferente a cualquier otra persona que haya visto, al decidir que M $ debería haber escrito su código de forma más robusta y, por lo tanto, redeclaró parte del código del validador M $ para hacer frente al elemento indefinido. Todo lo demás que he visto es esencialmente una solución alternativa en el lado de jQuery, y elimina la posible funcionalidad (por ejemplo, usar el evento click en lugar del cambio).
El bit que falla es
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
que arroja un error cuando intenta obtener una longitud para los ''vals'' indefinidos.
Acabo de agregar
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
y ella está bien para ir. El código final, que redeclara la función ofensiva completa, está a continuación. Lo puse como un guión incluido en la parte inferior de mi página maestra o página.
Sí, esto rompe la compatibilidad hacia arriba si M $ decide cambiar su código de validador en el futuro. Pero uno esperaría que lo solucionen y luego podamos deshacernos de este parche por completo.
// Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix
function ValidatorOnChange(event) {
if (!event) {
event = window.event;
}
Page_InvalidControlToBeFocused = null;
var targetedControl;
if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {
targetedControl = event.srcElement;
}
else {
targetedControl = event.target;
}
var vals;
if (typeof (targetedControl.Validators) != "undefined") {
vals = targetedControl.Validators;
}
else {
if (targetedControl.tagName.toLowerCase() == "label") {
targetedControl = document.getElementById(targetedControl.htmlFor);
vals = targetedControl.Validators;
}
}
var i;
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
ValidatorUpdateIsValid();
}
Solucioné el problema con un parche:
window.ValidatorHookupEvent = function(control, eventType, body) {
$(control).bind(eventType.slice(2), new Function("event", body));
};
Actualización: He enviado el problema a MS ( enlace ).