jQuery .focus(在字段X上)导致.blur(在字段X上)被调用

时间:2011-05-16 18:04:59

标签: jquery focus blur

有谁知道为什么jQuery .focus函数会导致onblur事件被调用。我问的原因是因为在我的JavaScript自定义psuedo类中,我称之为。

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

但是对于我的WCF服务的AJAX调用,成功的JavaScript函数(在同一个类中),我有这个代码。 * .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
},

========================================= 添加我的源代码:

&lt; asp:TextBox id =“TxtSampleId”runat =“server”class =“LIMSInputField”onfocus =“Change(this,event)”onblur =“Change(this,event)”/&gt;

<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 个答案:

答案 0 :(得分:1)

听起来问题是警报会触发模糊(因为它现在正在接收焦点):

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

请参阅:

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

如果你选择&#34; focuser&#34;按钮,然后单击&#34;单击我!&#34;你会看到模糊事件被触发两次(一次失去焦点到&#34;点击我&#34;按钮然后再次失去焦点到警报窗口)。