我想,以防止一个默认的事件focusOut
(或blur
)事件,并保持设定为特定输入字段的焦点。
这是我已经尝试:
我的代码是这样的:
_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元素。
我做了一些研究,并已发现有关我的问题几篇文章,但没有人回答这个问题询问。
的preventDefault不会对焦点事件的工作 -在这里,给出的答案是使用任何类型的事件操作的替代路线。
焦点回到焦点文本框出来,如果没有所需的值 -在这里,解决方案是使用setTimeout()
将焦点设置回原来的元素,这是所有的权利,但我想了解这个问题的心脏为什么preventDefault()
不在这里工作。
jQuery的preventDefault()方法不工作 -我试图从这个线程的一些可能的解决方案,如使用event.stopImmediatePropagation()
和event.stop()
但都是多余的。
我明白任何时间,知识和解决方案(包括未遂)在这个问题上作出了贡献。 我真的想学习...
这里是一个的jsfiddle向您展示问题......随意摆弄它,尝试不同的解决方案。
一些研究之后,我发现,只有某些事件是“取消”。
引自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一个惊人的资源我偶然发现。
我们知道,它是点击功能引起的问题。 所以,像铬正常的浏览器中,您可以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;
});
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