jQuery .focus (en el campo X) hace que .blur (en el campo X) sea invocado

¿Alguien sabe por qué la función jQuery .focus haría que se llamara a un evento onblur? La razón por la que pregunto es porque en mi clase psuedo personalizada de JavaScript, estoy llamando a esto.

jQuery(thisTemp.Elements.TxtSampleId).blur(Function.createDelegate(thisTemp,     
    thisTemp.PreAccessioningLoad));

Pero dentro de la función JavaScript exitosa (en esta misma clase) para mi llamada AJAX a mi servicio WCF, tengo este código. La línea * .focus está causando que se llame a otra instancia de mi delegado anterior. Puedo probar esto al comentarlo. Con la línea, mi alerta se llama dos veces. Sin él, mi alerta solo se llama una vez.

PreAccessioningLoadSuccess: function(quickDataEntryObject) {

    var val = jQuery(this.Elements.TxtSampleId).val().replace(/^\s\s*/, "").replace(/\s\s*$/, "");
    var intRegex = /^\d{1,10}$/;
    if (!intRegex.test(val)) {
        jQuery(this.Elements.SampleIdAjaxValidate).html("<span style='color:red'>Sample Id must contain between 1 and 10 digits</span>");
        jQuery(this.Elements.TxtSampleId).focus();
        jQuery(this.Elements.ImageAjaxSpinner).css("visibility", "hidden");
        alert("this alert gets called twice when .focus() function called ???");
        return false;
    }
    else {
        jQuery(this.Elements.SampleIdAjaxValidate).html("");  // clear AJAX validation
    }

...

¿Por qué pasaría eso?

============ Aquí está mi evento de delegado según la solicitud:

PreAccessioningLoad: function(sender) {

    if (this.Elements.TxtSampleId.value != "") {

        var service = new Acu.LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService();
        jQuery(this.Elements.ImageAjaxSpinner).css("visibility", "visible");
        service.PreAccessioningLoad(this.Elements.TxtSampleId.value, Function.createDelegate(this, this.PreAccessioningLoadSuccess), Function.createDelegate(this, this.PreAccessioningLoadError));
    }
    return false;  //prevent page postback
},

========================================= Agregando mi código fuente:

<script type="text/javascript">

    function Change(obj, evt) {
        if (evt.type == "focus") {
            obj.style.borderColor = "black";
            obj.style.backgroundColor = "#90EE90";  // light green on focus
        }
        else if (evt.type == "blur") {
            obj.style.borderColor = "white";
            obj.style.backgroundColor = "#7AC5CD";  // light blue on blur
        }
    }

</script>

preguntado el 16 de mayo de 11 a las 18:05

¿Pueden publicar el código adjunto del evento también? Parece que esta es una imagen incompleta. -

fuera de mi cabeza: algo está recibiendo atención durante su controlador de eventos, lo que hace que se active el desenfoque. Sin embargo, no he tenido tiempo de revisar su código y hay suficientes bits que faltan, no estoy seguro de poder hacerlo. -

Recuerde, estoy llamando a ASP.NET Ajax de Microsoft "Function.createDelegate", no a jQuery. Quizás haya un conflicto. Sé que jQuery implícitamente hace devoluciones de llamada / delegados en su código en casi todas partes, pero en esta situación, ¿cómo podría hacer que esto funcione? La función de evento devuelve falso, por lo que no sucede nada más excepto ese bloque de código. Es posible que tengamos que contactar al equipo de jQuery en este caso. jQuery (thisTemp.Elements.TxtSampleId) .blur (Function.createDelegate (thisTemp, thisTemp.PreAccessioningLoad)); -

Si lo desea, puedo poner mi código en una URL activa y usted puede depurarlo. Tengo miedo de depurar delegados. ¡Ja ja! Puede haber una fobia a ese tipo de cosas. -

Agregué mi código fuente. Notarás que tengo un evento de desenfoque codificado en el campo de entrada, pero ese es un evento de desenfoque separado del que agregué a través de mi clase de JavaScript. Si realmente quieres reproducir, intentaré simular algo cuando tenga tiempo. ¡Me aseguraré de darte una insignia enorme si descubres este monstruo! (aunque no se como dar insignias) -

1 Respuestas

Parece que el problema es que la alerta dispara el desenfoque (ya que ahora está recibiendo el enfoque):

alert("this alert gets called twice when .focus() function called ???");

Ver:

http://jsfiddle.net/on50g7cr/2/

Si presiona el botón "enfocador" y luego hace clic en "¡haga clic en mí!" verá que el evento de desenfoque se dispara dos veces (una por perder el foco en el botón "hacer clic en mí" y luego otra vez por perder el foco en la ventana de alerta).

respondido 06 nov., 14:02

Ya no trabajo para esa empresa, así que no tengo forma de probar mi código. Así que tomaré su palabra con el violín. ¡Buen trabajo! - MacGyver

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.