1

I am trying to use an Ajax search\suggest box. I use jQuery to handle the textbox losing focus. However, when I click on a link in the suggestion list jQuery fires the blur event and the link is not followed. Here is the jQuery code:

$(document).ready(function() {

    $('#lstxt').click(function() {
        this.value = '';
    });
    $('#lstxt').blur(function() {
        this.value = 'Database Search';
        document.getElementById('ls').innerHTML='';
        document.getElementById('ls').style.border='0px';
    });
});

How do I get it to not fire .blur if a link is being clicked inside the suggestion list (id="ls_table")?

4

4 回答 4

6
var global_switch = false;
$('#ls_table').hover (
  function () { global_switch = true; },
  function () { global_switch = false; }
)
$('#lstxt').blur(function() {
  if (global_switch) { return; } else { ...});

只是一个概念证明。与往常一样,全局变量是不好的。看看 jQuery 的数据 API来规避它。

干杯,

于 2009-07-07T19:41:06.097 回答
3

我在实现自己的方法时使用的方法是增加了一点延迟:

$('#lstxt').blur(function(){
    setTimeout(function(){
        // original blur code here
    }, 250);
});

绝对不是最好的解决方案(但通常有效)。但是 Boldewyn 的解决方案应该可以工作——假设在尝试分配它之前已经创建了 #ls_table。如果您经常创建/销毁#ls_table,您可以将事件绑定到父元素:

// just using the data API for jquery.
$('#ls').hover(
    function(){ $('#ls').data('autocompleteover', 1); },
    function(){ $('#ls').data('autocompleteover', 0); }
);
$('#lstxt').blur(function(){
    if($('#ls').data('autocompleteover'))
        return;
    // original blur code here
}
于 2009-07-14T20:06:09.740 回答
0

试试这个代码:

$(document).ready(function() {

    $('#lstxt').click(function() {
        this.value = '';
        return true;
    });
    $('#lstxt').blur(function() {
        this.value = 'Database Search';
        $('#ls').html('').css('border',"0px");
        return true;
    });
});

编辑:如果您在文本框外单击,则会触发模糊。lstxt 是文本框吗?

edit2:您将需要取消绑定模糊事件并有条件地重新绑定它。我需要更多关于你的页面布局的信息来告诉你怎么做

于 2009-07-07T19:37:10.580 回答
0

我处理了类似的问题(在模糊上使用了一些自定义验证器,在单击关闭按钮之前触发了该验证器 - 但我想在不触发此模糊事件的情况下关闭对话框(单击))输入代码(使用验证器):

      ..
      $(this).blur({validators: validators}, function(event){ // blur                                                
      (function($this){
         validator_timeout = setTimeout(function(){ // validator_timeout is global
           $this.validate(event.data.validators); // do some validation
         }, 50); // delay just minimum of time, but enough to let other event to be fired
       }($(this))); // passing $(this) to function
      });...

在其他事件处理程序上,如关闭对话框,当我们不想在验证时调用函数时,只需清除验证器超时以抑制模糊:

   click_function = function(){                        
       clearTimeout(validator_timeout);
       $( this ).dialog( "close" );
   }   

希望它对某人有用。

于 2011-10-11T08:27:38.837 回答