有没有办法使用event.preventDefault与事件的内容的方法吗? 如果不是,为什么?

2019-08-16 16:06发布

我想,以防止一个默认的事件focusOut (或blur )事件,并保持设定为特定输入字段的焦点。

这是我已经尝试:

  • 使用event.preventDefault()在开始和在函数结束时(用于测试目的,而不是风格)

  • return false; 以防止传播

  • 直接在元素设置焦点回到元素(但我发现,焦点仍转换时,因为执行调焦开关 .on()函数执行。我知道我可以使用setTimeout ,但我想,以避免它并找出问题的心脏。)

  • 利用blur ,而不是focusOut

我的代码是这样的:

    _triggerEventHide: function(inst, eventType) {
        inst.$target.on(eventType, function(event) {
            event.preventDefault();
            if (!$.suggestBox.$divCont.hasClass($.suggestBox.mouseOverClassName)) {
                $.suggestBox.$divCont.css({display: 'none'});   //reposition Suggestbox
            } else {
                inst.target.focus(); 
            }
            event.preventDefault();
            return false;
        });
     }

需要注意的是$target代表了jQuery包裹的元素和target代表了原生的DOM元素。

我做了一些研究,并已发现有关我的问题几篇文章,但没有人回答这个问题询问。

  1. 的preventDefault不会对焦点事件的工作 -在这里,给出的答案是使用任何类型的事件操作的替代路线。

  2. 焦点回到焦点文本框出来,如果没有所需的值 -在这里,解决方案是使用setTimeout()将焦点设置回原来的元素,这是所有的权利,但我想了解这个问题的心脏为什么preventDefault()不在这里工作。

  3. jQuery的preventDefault()方法不工作 -我试图从这个线程的一些可能的解决方案,如使用event.stopImmediatePropagation()event.stop()但都是多余的。

我明白任何时间,知识和解决方案(包括未遂)在这个问题上作出了贡献。 我真的想学习...

这里是一个的jsfiddle向您展示问题......随意摆弄它,尝试不同的解决方案。

Answer 1:

一些研究之后,我发现,只有某些事件是“取消”。

  • 引自http://help.dottoro.com/ljwolcsp.php

    您可以检查是否可以将事件在所有浏览器中取消财产除了在Internet Explorer版本9之前虽然在Firefox中存在取消财产取消了,它总是返回true,无论该事件的取消状态。 有没有办法来确定是否一个事件可以在Internet Explorer 9版本之前被取消。

    需要注意的是在非可取消的事件中使用preventDefault方法和returnValue属性不会导致错误。 当一个事件处理程序返回false,该事件将被取消。 你可以用它代替了preventDefault方法和returnValue属性的。 见以下实施例2。

  • 在Javascript中每个事件都有被定义为是否可以阻止事件“真”或“假”,如果事件不能被取消取消财产。 参考: http://help.dottoro.com/ljeosnqv.php

  • 从一个示例脚本http://help.dottoro.com/ljeosnqv.php证明这个属性可以发现这里上的jsfiddle(以节省空间)。 注意有关如何火狐始终在事件对象的取消属性返回true代码中的注释。

一般主要存在:

 $('selector').on(eventType, function (event) {
    alert(('cancelable' in event));   //will return true
    alert(event.cancelable);      //will return true if event can be cancelled
                                  //NOTE: Firefox mistakenly always returns true
});
  • 事件有根据情况发生的文化预设顺序。 例如,如果一个鼠标按钮被点击eventTriggers的顺序将是:鼠标按下,鼠标松开,然后单击。 参考:www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event-initMouseEvent

  • 引自http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-flow-cancelation

    A“取消事件”是与被允许的DOM事件流期间要被取消的默认动作相关联的事件。 在事件流期间的任何阶段,已触发事件侦听器有取消默认动作或者允许默认动作进行的选择。 在浏览器中的超链接的情况下,取消该行动将没有激活超链接的结果。 在这个规范中定义并非所有事件都取消事件。

  • 有时候,事件的顺序有它发生的DOM默认操作前看到的取消事件,即使显示了,在这种情况下,因为它已经发生了,也无法取消的默认操作。 也就是说默认操作事件的调度之前发生。


我的解决方案:

话虽这么说,我还是设法找到解决我的问题多/少这个问题。 基本上我不得不与一个的focusIn元素的事件监听已经和我想这个元素,以保持焦点。

<div id='display'></div>
$('#idBox').on('focusin', function () {
  $('#div').append('focused');
  //do something
}

起初我尝试使用一个setTimeout的事件当我点击了,但我发现,这不是一件好事,因为它再次被触发我的focusIn事件。 因此,我们需要的是DOM的的焦点切换默认操作之前分派的事件。 我没有发现符合该要求的事件,但只适用于IE浏览器...典型。 为了您的信息是:“onbeforedeactivate”,是取消 。 然而,由于跨浏览器的兼容性是非常重要的,我们不应该用这个eventTrigger。 而是我发现,DOM开始其重点改变行为之前发生的事件MouseDown。

所以,我们可以做的是:

$(document).on('mousedown', function(event) { 
       target = event.target;     // the element clicked on
       myTarget = document.getElementById("idBox");   // the element to keep focus
       if (target !== myTarget) {   
           event.preventDefault();  //prevent default DOM action
           event.stopPropagation();   //stop bubbling
           return false;   // return
       }
});

还有的会很多关于它的其他方式。 我个人不喜欢的事件监听设置到整个文档,而是说明基本其服务宗旨。


脚注:一个伟大的文章阅读,以了解更多关于在Javascript事件处理是http://help.dottoro.com/ljtdqwlx.php一个惊人的资源我偶然发现。



Answer 2:

我们知道,它是点击功能引起的问题。 所以,像铬正常的浏览器中,您可以detact鼠标按下事件,然后的preventDefault。

但是,这并不在IE工作,但我们可以用beforedeactivate事件,而不是http://msdn.microsoft.com/en-us/library/windows/apps/jj569321.aspx 。 它可以在IE中deteact当焦点正在发生变化。 所以就阻止它。

代码将是这样的:

       $inp.on('blur', function(){

            self.hide();
        });

        isIE && $inp.on('beforedeactivate', function(evt){
            mousedown && evt.preventDefault();
        });

        $holder.on('mousedown', function(evt){
            evt.preventDefault();
            mousedown = 1;
        });


Answer 3:

inst.$target.on("blur", function() {
     if (!$.suggestBox.$divCont.hasClass($.suggestBox.mouseOverClassName)) {
        $.suggestBox.$divCont.css({'display': 'none'});   //reposition Suggestbox
        return true;
        } 
      inst.target.focus();
      return false;
         });

需要看到你的HTML。 我不认为你是正确的事情打电话EX:

$.suggestBox我想应该是$(".suggestBox")但我不能说没有看到您的htnl



文章来源: Is there a way to use event.preventDefault with focusOut? If not, why?