2016-01-05 83 views
0

我有一些代码在元素上的“模糊”事件上运行。 该代码需要实际使用activeElement,因此实际上不能从“模糊”事件中运行。如何在Javascript中创建“关于模糊”或“模糊”事件?

我希望我能创建一个这样的事件。目的是在“模糊”事件之前“willblur”事件将会发生。

var lastTouchedElement; 

    $('body').on('click', preBlurHandler); 
    $('body').on('focusin', postFocusHandler); 
    $('.inp1').on('willblur', function() {alert('willblur');}); 
    $('.inp1').on('blur', function() {alert('blur');}); 


    function preBlurHandler(ev) { 

    if (!lastTouchedElement) { 
     postFocusHandler(ev); 
     return; 
    } 

    var focussingElement = ev.target; 

    if (lastTouchedElement === focussingElement || $.contains(lastTouchedElement, focussingElement)) { 
     //focus is staying in the same place, do nothing 
     return; 
    } 

    $(lastTouchedElement).trigger('willblur', [ev, { 
     target: lastTouchedElement, 
     focussingElement: focussingElement 
    }]); 
    } 


    function postFocusHandler(ev) { 
    lastTouchedElement = document.activeElement; 
    } 

完整的代码中的jsfiddle在https://jsfiddle.net/t0un95jt/3/

但它不工作。事实上,它甚至不是很接近。

Help me StackOverflow;你是我唯一的希望。

+0

Focusin,[focusout](https://developer.mozilla.org/en-US/docs/Web/Events/focusout) – Jonathan

回答

1

关键是使用addEventListener而不是JQuery的on(),并使用“mousedown”而不是“click”。

,而不是这一行:

$('body').on('click', preBlurHandler); 

我用这个:

window.addEventListener('mousedown', preBlurHandler, true); 

为的addEventListener最后一个参数:真正的,意思是 “捕获阶段做到这一点”。捕获阶段从最外层的元素开始,并且在冒泡阶段开始之前,通过在随后的子元素上触发一个事件来工作,这个阶段开始回溯到DOM树。