未聚焦元素未触发模糊事件或阻止全部聚焦

时间:2013-08-12 22:59:35

标签: jquery click focus blur

我有几个输入元素,其行为类似于下拉元素,其方式与jquery日期事件ui的工作方式类似。由于应用程序的性质,这需要保持这种方式。我已将元素设置为不可编辑。这将允许应用程序在其下构建一个伪下拉菜单,其中包含一个选项列表,同时阻止用户直接操作它。单击一个后,jQuery插件会将值分配给该输入。

问题是有一个触发onblur的验证检查器,所以看起来验证器过早验证,当然它工作正常。我不想重写验证器插件。

有没有办法阻止焦点或模糊事件在特定点击事件中一起发生?

这是挑战的小提琴

http://jsfiddle.net/powerphillg5/YHgKQ/

这里是代码,因为我们必须在提供链接时提供代码#law-abidingcitizen:

<input type="text" id="my_input" value="Click me." />
<script>
$('#my_input').blur(function(){
    alert("Prevent me without removing the blur() and function that caused me!");
});

$("#my_input").click(function(){
    $(this).after("<ul>\
                  <li data-value='value1' class='click_me'>Now, click me,</li>\
                  <li data-value='value1' class='click_me'>or me!</li>\
                   </uL>");

    $(".click_me").click(function(){
        $("#my_input").val($(this).data("value"));
        $(this).parent().remove();
        $("#my_input").after("<img src='http://harrisongreetingcards.net/images/1316_thank_you_for_your_time_note_card.png' />");
    })

}); 
</script>

2 个答案:

答案 0 :(得分:0)

我认为你想要做的只是解除该事件中的模糊处理程序,所以在添加处理程序后添加它:

// Add this after the handlers you want to prevent are added
$('#my_input').unbind('blur');   

或者,如果您无法取消绑定处理程序,则取决于添加内容的位置 - 因为它尚未添加 - 您可以添加自己的处理程序,以防止任何其他后续添加的处理程序关闭:

// Add this before the handlers you want to prevent are added
$("#my_input").blur(function(event) {
   event.stopImmediatePropagation();
});

请注意,这可能会对整体功能产生影响,因为您实际上已经阻止了这些事件的发生(并且某些事情可能依赖于它们)。因此,您可能希望在某些时候重新绑定功能并伪造事件,或者只调用特定的功能。

修改:再次阅读您的问题。模糊事件发生在click事件之前,因此您不能只是从click事件内部将其关闭。因此,如果您希望模糊事件在其他情况下发生(例如,当您开箱即用时),您需要做一些更聪明的事情。在这种情况下,您需要编写自己的模糊处理程序来决定要执行的操作,或者您可能需要添加一些故意强制模糊事件的其他处理程序 - 可能是在不同的字段获得焦点时。

我不知道您的应用程序,因此很难知道您需要什么,但希望这可以帮助您实现它。

答案 1 :(得分:0)

我有一个想法,丑陋但可以工作。

  1. 保持原始模糊。
  2. 更改新的模糊侦听器以通过setTimeout调用原始模糊。
  3. 在超时触发之前,如果单击.click_me元素,则取消它。否则,就放手吧。
  4. 代码看起来像

    var blurTimeout = false;
    var inputObject = $('#my_input');
    var inputBlur = $._data(inputObject[0], 'events').blur[0].handler;
    inputObject.off('blur').blur(function(e) {
        blurTimeout = setTimeout(function() {
            inputBlur.apply(inputObject, e);//call original blur.
        }, 500);
    });
    

    并在点击功能中添加取消超时。

    $(".click_me").click(function(){
        clearTimeout(blurTimeout);
        ...
    

    和小提琴是here

    不过,我建议也直接改变模糊。