我应该如何在导致模糊的单击事件之后触发Javascript模糊事件?
我遇到了这个问题几次,我对我以前使用的解决方案并不满意。我应该如何在导致模糊的单击事件之后触发Javascript模糊事件?
我有一个模糊事件输入框,验证它的内容和一个按钮,它将填充输入框点击。问题在于点击按钮触发输入模糊事件,然后点击按钮点击事件,以便按钮插入的内容不是经过验证的内容。
见http://jsfiddle.net/jakecr/dL3K3/
我知道这是正确的行为,但我不能想到一个干净的方式来解决这个问题。
我们在工作中遇到了类似的问题。我们在最后的 中发现的是,mousedown事件将在模糊事件 之前触发,从而允许您在验证之前设置内容,甚至取消完全使用标志的验证 过程。
检查这个拨弄我使用例 - 由 http://jsfiddle.net/dL3K3/31/
$(function(){
var flag = true;
$('input').blur(function(){
if(!$(this).val() && flag){
alert("Grrr, It's empty");
}
});
$('button').mousedown(function(){
flag = false;
});
$('button').mouseup(function(){
flag = true;
$('input').val('content').focus();
});
});
CNC中
由于@mclin建议,用鼠标按下事件的preventDefault将防止模糊的行为。 ,你可以直接离开原来的单击事件完整 -
http://jsfiddle.net/dL3K3/364/
$(function(){
$('input').blur(function(){
if(!$(this).val()){
alert("Grrr, It's empty");
}
});
$('button').mousedown(function(e){
e.preventDefault();
});
$('button').click(function(){
$('input').val('content');
});
});
这种解决方案可能是有点清洁,更好的为大多数情况下只需要注意的是,如果你使用它,你会的preventDefault和模糊目前关注的任何其他元素,但对于大多数不应该成为问题的用例。
mousedown事件可以导致提交发生无论验证看到这里http://stackoverflow.com/questions/43011387/mousedown-still-submitting-form-when-it-should-not – DragonFire 2017-03-25 23:19:45
@DragonFire这与无关这个问题或mouswdown。 您的代码正在运行异步并将其视为同步代码 – 2017-03-28 02:06:51
将输入验证逻辑分离为自己的函数,该函数由blur事件自动调用,然后在修改输入框中的值之后通过单击事件调用。真的,你的验证逻辑会被调用两次,但我没有看到一个方法,没有做出更多的更改。
示例使用jQuery:
$('input').blur(function() {
validate(this);
});
$('submit').click(function() {
//modify the input element
validate(inputElement);
});
var validate = function(obj) {
// validate the object
}
不是我之后的解决方案,因为模糊事件仍然被触发,但我认为不可能做到我想要的。 – Jake 2010-11-08 21:58:57
这也可能有助于:
设置延迟模糊事件操作它触发按钮单击事件之前的计时器。
// Namespace for timer var setTimer = { timer: null }
$('input,select').blur(function() {
setTimer.timer = setTimeout(function() {
functionCall();
}, 1000);
});
$('input,select').focus(function() {
setTimer.timer = setTimeout(function() {
functionCall();
}, 1000);
});
$("#btn").click(function() {
clearTimeout(setTimer.timer);
functionCall();
});
这是一个聪明的解决方案。 – 2013-08-14 04:15:13
技巧是不使用模糊和点击事件,因为它们总是先按照模糊顺序执行,然后单击第二个。相反,您应该检查焦点元素何时发生变化,因为只有在点击后才会发生变化。
我觉得我有这一个优雅的解决方案:
var alreadyValidated = 'true';
setInterval(function(){
if(document.activeElement.id != 'validation-field-id'){
if(alreadyValidated=='false'){
alreadyValidated = 'true';
validate(document.activeElement);
}
}
else {
alreadyValidated = 'false';
}
}, 200);
这些天所有现代浏览器都支持document.activeElement。
您应该使用'true'和'false'而不是字符串,因为'Boolean('false')=== true' – Jake 2012-03-06 09:05:50
“优雅的解决方案”和setInterval不属于相同的发布内容。 – aaronsnoswell 2012-09-26 04:45:33
我有比Yoni Jah更好的解决方案: 在按钮的mousedown事件中调用preventDefault。onBlur永远不会发生,所以你可以在点击事件中自由地做任何事情。
这比较好,因为它不会改变点击行为,而是让鼠标向下而不是鼠标向上发生,这可能是意想不到的。
这是最佳解决方案。正是我在找什么。 – 2014-06-10 20:58:32
谢谢我更新了我的答案 – 2017-03-28 02:04:33
有时在mouseup上获取子对象是有用的,但是父母想要在模糊时隐藏子对象。我们可以取消子元素的隐藏,然后等到我们的鼠标松开时,再用力模糊当我们准备
JS
var cancelHide = false;
$('.my-input').blur(function() {
if (!cancelHide) {
$('.my-item').hide();
}
});
$('.my-input').click(function() {
$('.my-item').show();
});
$('.my-item').mousedown(function() {
cancelHide = true;
});
$('.my-item').mouseup(function() {
var text = $(this).text();
alert(text);
cancelHide = false;
$('.my-input').blur();
});
HTML
<input type="text" class="my-input"/>
<div class="my-item">Hello</div>
<div class="my-item">Lovely</div>
<div class="my-item">World</div>
发生
css
.my-item {
display:none;
}
https://jsfiddle.net/tic84/on421rxg/
单击列表中的项目将只在鼠标松开警戒,尽管父母极力掩饰他们对模糊
你的问题不明确?你的问题和预期的解决方案是什么? – 2010-11-03 07:28:34
基本上,一个用户动作会导致两个事件按顺序触发,但第二个动作依赖于第一个事件。我曾考虑过使用setTimeout来延迟第一个事件,但这似乎不是一个理想的解决方案。 – Jake 2010-11-03 07:38:02
我以相当一般的形式提出了这个问题,因为在不同情况下我遇到过这个问题几次。 – Jake 2010-11-03 07:42:17