2010-11-03 84 views
23

我遇到了這個問題幾次,我對我以前使用的解決方案並不滿意。我應該如何在導致模糊的單擊事件之後觸發Javascript模糊事件?

我有一個模糊事件輸入框,驗證它的內容和一個按鈕,它將填充輸入框點擊。問題在於點擊按鈕觸發輸入模糊事件,然後點擊按鈕點擊事件,以便按鈕插入的內容不是經過驗證的內容。

http://jsfiddle.net/jakecr/dL3K3/

我知道這是正確的行爲,但我不能想到一個乾淨的方式來解決這個問題。

+0

你的問題不明確?你的問題和預期的解決方案是什麼? – 2010-11-03 07:28:34

+0

基本上,一個用戶動作會導致兩個事件按順序觸發,但第二個動作依賴於第一個事件。我曾考慮過使用setTimeout來延遲第一個事件,但這似乎不是一個理想的解決方案。 – Jake 2010-11-03 07:38:02

+0

我以相當一般的形式提出了這個問題,因爲在不同情況下我遇到過這個問題幾次。 – Jake 2010-11-03 07:42:17

回答

31

我們在工作中遇到了類似的問題。我們在最後的 中發現的是,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和模糊目前關注的任何其他元素,但對於大多數不應該成爲問題的用例。

+0

mousedown事件可以導致提交發生無論驗證看到這裏http://stackoverflow.com/questions/43011387/mousedown-still-submitting-form-when-it-should-not – DragonFire 2017-03-25 23:19:45

+0

@DragonFire這與無關這個問題或mouswdown。 您的代碼正在運行異步並將其視爲同步代碼 – 2017-03-28 02:06:51

1

將輸入驗證邏輯分離爲自己的函數,該函數由blur事件自動調用,然後在修改輸入框中的值之後通過單擊事件調用。真的,你的驗證邏輯會被調用兩次,但我沒有看到一個方法,沒有做出更多的更改。

示例使用jQuery:

$('input').blur(function() { 
    validate(this); 
}); 

$('submit').click(function() { 
    //modify the input element 
    validate(inputElement); 
}); 

var validate = function(obj) { 
    // validate the object 
} 
+0

不是我之後的解決方案,因爲模糊事件仍然被觸發,但我認爲不可能做到我想要的。 – Jake 2010-11-08 21:58:57

8

這也可能有助於:

設置延遲模糊事件操作它觸發按鈕單擊事件之前的計時器。

// 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(); 
    }); 
+0

這是一個聰明的解決方案。 – 2013-08-14 04:15:13

-2

技巧是不使用模糊和點擊事件,因爲它們總是先按照模糊順序執行,然後單擊第二個。相反,您應該檢查焦點元素何時發生變化,因爲只有在點擊後纔會發生變化。

我覺得我有這一個優雅的解決方案:

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。

+2

您應該使用'true'和'false'而不是字符串,因爲'Boolean('false')=== true' – Jake 2012-03-06 09:05:50

+7

「優雅的解決方案」和setInterval不屬於相同的發佈內容。 – aaronsnoswell 2012-09-26 04:45:33

18

我有比Yoni Jah更好的解決方案: 在按鈕的mousedown事件中調用preventDefault。onBlur永遠不會發生,所以你可以在點擊事件中自由地做任何事情。

這比較好,因爲它不會改變點擊行爲,而是讓鼠標向下而不是鼠標向上發生,這可能是意想不到的。

+0

這是最佳解決方案。正是我在找什麼。 – 2014-06-10 20:58:32

+0

謝謝我更新了我的答案 – 2017-03-28 02:04:33

0

有時在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/

單擊列表中的項目將只在鼠標鬆開警戒,儘管父母極力掩飾他們對模糊