2016-04-11 14 views
0

Beim Schreiben eines Jasmintests scheint jQuery nicht zu erkennen, dass eine Eingabe den Fokus hat. Wenn zwischen den beiden Eingabeelementen gewechselt wird, wird die Warnung nicht angezeigt, und wenn Sie auf die Eingaben klicken, ohne die andere zu fokussieren, wird die Warnung angezeigt. Durch die Verwendung von .focus und .blur in meinem Testcode kann ich jedoch nicht das gewünschte Verhalten erzielen. Es denkt immer, dass keiner von ihnen konzentriert ist. Auch ohne den Aufruf .triggerHandler wird der Blur-Handler überhaupt nicht aufgerufen.jQuery .blur .focus funktioniert nicht im Test

Die Eingänge sind sichtbar und an das DOM angeschlossen.

var $inputs = $("input"); 
function blurTimeout() { 
    if (!$inputs.is(":focus")) { 
    alert("Nothing's focused"); 
    } 
} 

function blur() { 
    setTimeout(blurTimeout, 0); 
} 

function main() { 
    $inputs.on("blur", blur); 
} 
$(main); 

jsfiddle

bearbeiten Es scheint, dass $inputs.first().focus() Aufruf einer der Eingänge zu konzentrieren, dann alert($inputs.first().is(":focus")) Benachrichtigungen false.

var $input = $inputs.first(); 
$input.focus(); 
alert(!!$input.is("focus")); // -> false 

Antwort

1

Die Ereignisse und Handler scheinen gut zu schießen. Das Problem ist die Logik. Wenn einer der Eingänge den Fokus hat, gibt !$inputs.is(':focus') immer false zurück. Sie können das beheben, indem Sie ersetzen:

!$inputs.is(':focus') 

mit:

$inputs.filter(':focus').length 

DEMO

+0

Huh. Sehr merkwürdig, weil dies im Projektcode funktioniert (selbe Ereigniseinstellung, gleiche Bedingungslogik). Danke, ich werde sehen, ob das morgen behoben wird. – ARandomFurry

+0

Nachdem ich Ihre Lösung getestet hatte, erkannte ich, dass ich das Problem möglicherweise nicht richtig erklärt hatte. Ich möchte '! $ Inputs.is (": focus ")' zurückgeben, wenn eine der Eingaben den Fokus hat. – ARandomFurry

+0

Und das ist, was Sie bekommen. Wo ist das Problem dann? ..... ** Aber, noch wichtiger, welches Verhalten suchst du, wenn der Fokus von einem Eingang zum anderen Eingang geht? ** – PeterKA

0

Unter dem geänderten Code. Das Testen funktioniert jetzt wie beabsichtigt und das ursprüngliche Verhalten wird beibehalten.

var $inputs = $("input"); 
function blurTimeout() { 
    var index = $inputs.length; 
    while(index--){ 
     if($inputs[index] === document.activeElement){ 
      return; 
     } 
    } 
    alert("Nothing's focused"); 
} 

function blur() { 
    setTimeout(blurTimeout, 0); 
} 

function main() { 
    $inputs.on("blur", blur); 
} 
$(main); 
Verwandte Themen