2011-04-19 67 views
13

我试图防止模糊发生时选择:在自动完成被调用。 (选择:在自动完成的建议框中单击项目时调用) 但是,无意中,从建议框中选择项目时会调用模糊。 我该如何解决这个问题?jQuery - 防止自动完成选择触发模糊()

下面是我的代码基本排队的方式。

$("#input_field").autocomplete({ 
    source: "source.php", 
    select: function(event, ui) { alert("Item selected! Let's not trigger blur!"); } 
}).blur(function(event) { 
    alert("Alert if the user clicked outside the input, pressed enter, or tab button."); 
    alert("But not from the item selection! :S"); 
}); 

谢谢!

编辑:这是一个简短的上下文。我试图让用户搜索/选择一个项目或创建一个新的项目,如果用户模糊输入。

+0

,如果你可以给多一点背景下,为什么你想从发生,这阻止模糊有助于 – JohnP 2011-04-19 05:16:19

+0

谢谢,我希望我的简要上下文帮助 – m0dE 2011-04-19 08:55:57

+0

+1,我遇到同样的确切的问题。请参阅下面的答案。 – 2011-12-14 21:13:11

回答

19

自动完成的jQuery UI部件带有一个“更改”事件,我认为这是你想做的事情。它被称为模糊,除非在用鼠标选择项目时不调用它。

$("#input_field").autocomplete({ 
    source: "source.php", 
    select: function(event, ui) { alert("Item selected! Let's not trigger blur!"); } 
}); 
$("#input_field").bind('autocompletechange', function(event, ui) { 
    alert("Alert if the user clicked outside the input, pressed enter, or tab button."); 
    alert("But not from the item selection! :S"); 
}); 
+0

+1显示何时更改被解雇。请将此投票作为答案。 – 2012-05-17 09:38:56

+0

谢谢!你救了我几个小时的痛苦 – 2012-10-04 15:16:22

+0

这似乎不适合我。模糊功能发生,然后我得到'不让触发'的警报。 – briansol 2013-09-18 21:26:48

0

使用event.stopPropagation();

$("#input_field").autocomplete({ 
    source: "source.php", 
    select: function(event, ui) { alert("Item selected! let's not trigger blur!"); } 
}).blur(function(event) { 
event.stopPropagation();  
alert("noooooo! blur is still being called!"); 
}); 

,或者你可以同样的方式使用event.preventDefault() ...

$("#input_field").autocomplete({ 
     source: "source.php", 
     select: function(event, ui) { alert("Item selected! let's not trigger blur!"); } 
    }).blur(function(event) { 
    event.preventDefault(); 
    }); 

参考event.preventDefault

+0

我无法得到这个工作。我停下来后仍然看到警报。这两个用例。 – briansol 2013-09-18 21:11:59

0

您可能需要获得更具体的,但它听起来像是你仍然需要模糊一些blur函数,但您不希望它在初始设置时调用;尝试像这样...

$('#input_field').data('ready_to_blur',false) 
    .blur(function(e) { 
     if ($(this).data('ready_to_blur')) 
      return; 
     $(this).data('ready_to_blur',true); 
     event.stopPropagationImmediate(); 
    }) 
    .autocomplete({ 
     source: "source.php", 
     select: function(event, ui) { alert("Item selected! let's not trigger blur!"); } 
    }) 

我也认为你会想要使用stopPropagationImmediate。请参阅文档:http://api.jquery.com/event.stopImmediatePropagation/

+0

我想在用户离开#input_field后立即发生模糊。但“无意中,当我从建议框中选择一个项目时会调用模糊,我该如何解决这个问题?” – m0dE 2011-04-19 06:33:39

1

我不知道如何避免onBlur触发,但我想我遇到了同样的问题,并且通过测试onBlur函数中是否打开了自动填充字段来解决此问题。

HTML declaraction

<input id="autocompleteTextbox" type="text" onblur="onBlurFunction();" 
     onkeyup="onKeyUpFunction();" /> 

的Javascript

var autocompleteOpen = false; 
var itemSelected = false; 

$("#autocompleteTextbox").autocomplete({ 

    source: function(request, response) { 
     //Set source. 
    }, 

    select: function(event, ui) { 
     itemSelected = true; 
    }, 

    open: function(event, ui) { 
     autocompleteOpen = true; 
    }, 

    close: function(event, ui) { 
     autocompleteOpen = false; 
     //A selection caused the close. Blur the autocomplete field. 
     if (itemSelected) { 
      document.getElementById("autocompleteTextbox").blur(); 
     } 
    } 
}); 


function onBlurFunction() { 
    if (!autocompleteOpen) { 
     //Do stuff. 
    } 
} 

function onKeyUpFunction() { 
    itemSelected = false; 
} 

这样,如果自动完成是在开放的onBlurFunction代码()将不会运行。 itemSelected用于测试用户是否在字段中输入文本或从自动完成列表中选择了某些内容。在关闭功能中,如果用户从列表中选择了某些东西,则模糊该字段。我不知道你的情况是否有道理。

2

基于我在这里看到的,我已经把两个代码示例放在一起来创建我认为是答案的东西;这对我来说:

$('#txtCatagory').autocomplete({ source: 'handlers/Catagories.ashx', minLength: 2, 
    change: function (event, ui) { 
     AddTag(event.srcElement.value); 
     $('#txtCatagory').val(''); 
    }, 
    select: function (event, ui) { 
     event.preventDefault(); 
     AddTag(ui.item.value); 
     $('#txtCatagory').val(''); 
    } 
}); 

这里是我的文本框:

<asp:TextBox runat="server" ID="txtCatagory" ClientIDMode="Static" OnKeyPress="return disableEnterKey(event)" /> 

这里做的事情对我来说是什么我在文本框中键入传递给AddTag功能或任何我从jQuery选择UI自动完成已通过。但批判地说,它不会传递我输入的任何内容,如果我使用自动完成功能,它会清除该框以准备下一次输入。

正如您可能已经从函数AddTag的名称中猜到的那样,我使用它来标记帖子或产品,但是感谢上面的帖子,我现在设法将自动完成添加到该功能。

-2

触发一个事件,当用户从一个文本域模糊显示他/她一个200px宽和100px高的蓝色背景色的小div时,并用粗体文本告诉他“他不应该离开这个字段空白“

+0

您确实应该提供一些代码或修复问题中的代码。一个jsfiddle也是一个好主意。 – Sgoettschkes 2012-10-29 07:40:46

0

这个问题的一个非常简单的解决方案。

显示下拉列表时取消绑定模糊事件处理程序, 并在选择后再次绑定模糊事件处理程序。

添加两个事件自动完成初始化时

displaydropdowncallback: function(){ $("#AUTOTEXT").unbind("blur"); }, 
selectdatacallback: function (data) { 
    $("#AUTOTEXT").blur(validatepostcode); 
} 

修改jquery的自动完成源码:

添加代码 options.displaydropdowncallback();

show: function() { 
    var offset = $(input).offset(); 

加入 options.selectdatacallback(selected.data);

function selectCurrent() { 
     var selected = select.selected(); 

     if (!selected) 
      return false;