jQuery .focus (в поле X) вызывает .blur (в поле X) для вызова - PullRequest
4 голосов
/ 16 мая 2011

Кто-нибудь знает, почему функция jQuery .focus вызывает событие onblur. Причина, по которой я спрашиваю, заключается в том, что в моем пользовательском классе псевдо JavaScript я вызываю это.

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

Но внутри успешной функции JavaScript (в этом же классе) для моего вызова AJAX моей службы WCF у меня есть этот код. Строка * .focus вызывает другой экземпляр моего делегата выше. Я могу доказать это, комментируя это. Со строкой мое оповещение вызывается дважды. Без этого мое оповещение вызывается только один раз.

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
    }

...

Почему это случилось?

============ Вот мое делегатское событие согласно запросу:

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
},

========================================= Добавление моего исходного кода:

<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>

1 Ответ

1 голос
/ 06 ноября 2014

Похоже, проблема в том, что оповещение вызывает размытие (поскольку оно теперь получает фокус):

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

См:

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

Если вы перейдете к кнопке «focusser», а затем нажмите «click me!» вы увидите, что событие размытия запускается дважды (один раз для потери фокуса на кнопку «щелкни меня», а затем снова для потери фокуса в окне предупреждения).

...