2016-12-24 6 views
1

Ich versuche, eine Funktion zu erstellen, die ausgelöst wird, wenn eine der Klasse Elemente den Fokus verlieren:Gruppe Klasse Mitglied Formelemente für focusout()

<h5>ON Time</h5> 
<div class = 'timeSetting'><form id = 'weekendStart'> 
<input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onHour' value='6' name = 'value' min='1' max='12'><input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onMinute' value='30' name = 'value' min='0' max='59'> 
<select id = 'weekendStartAmPm'> 
<option value = 'weekendStartAm'>am</option> 
<option value='weekendStartPm'>pm</option> 
</select> 
</form></div> 
<h5>OFF Time</h5> 
<div class = 'timeSetting'><form> 
<input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onHour' value='10' name = 'value' min='1' max='12'><input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onMinute' value='00' name = 'value' min='0' max='59'> 
<select id = 'weekdayStartAmPm'> 
<option value='wkdayStartPm'>pm</option> 
<option value = 'wkdayStartAm'>am</option> 
</select> 
</form></div> 

Ich weiß, das ist nicht richtig, aber ich möchte so etwas wie es:

$('.timeSetting').focusout(function(){ 
    console.log('lost focus'); 
}); 

wo Benutzer kann Tab zwischen Formularelementen und bearbeiten übertragen Fokus und einmal irgendwelche (und alle) Mitglieder der Klasse verlieren Fokus, dann die Funktion Feuer ...

+0

Sie müssten alle Elemente übereinstimmen, versuchen Sie etwas wie '.timeSetting Eingabe, .timeSetting select' für Ihre jQuery-Selektor. – PaulBGD

+0

Ein paar Tipps für Sie: Wir haben ein jQuery-Plugin namens focusgroup erstellt, um genau dies zu tun. Das grundlegende Prinzip besteht darin, nach Fokusereignissen zu horchen und festzustellen, wenn eine Gruppe übrig ist ("document.activeElement" ist nicht mehr in der Gruppe). Der Schlüssel war, benutzerdefinierte Ereignisse auszulösen und stattdessen auf diese zu achten. "groupfocus" und "groupblur" -Events statt im High-Level-Code. Ein weiterer Trick, der benötigt wurde, war das Warten auf 1 Frame bei einem Blur-Event, bevor das neue activeElement erkannt wurde. –

+0

Gefundene und alte Antwort von mir und aktualisierte es für Ihr HTML. Ich hoffe, es ist hilfreich. Merry Xmas :) –

Antwort

0

Hier ist ein Beispiel, basierend auf etwas, das ich vor ein paar Jahren wieder auf SO Gruppen von Fokus zu handhaben schrieb: http://jsfiddle.net/TrueBlueAussie/0y2dvxpf/6/

$('div.timeSetting').on('focus focusin', 'input,select', function() { 
    var $editor = $(this).closest('.timeSetting'); 
    $editor.addClass("focused"); 

}).on('blur focusout','input,select', function() { 
    var $editor = $(this).closest('.timeSetting'); 
    // wait for the new element to be focused 
    setTimeout(function() { 
    // See if the new focused element is in the editor 
    if (!$.contains($editor[0], document.activeElement)) { 
     $editor.removeClass("focused"); 
    } 
    }, 0); 
}); 

Vorerst es zeigt nur den Fokus mit Klassenänderungen, aber man könnte genauso gut Trigger benutzerdefinierte Ereignisse statt und fangen Sie diese auf einem Vorfahren.

+0

Ich mag die Art, wie dies funktioniert, aber die Bindung an 'Unschärfe' und 'Focusout' bewirkt, dass zwei Ereignisse bei Fokusverlust ausgelöst werden (zusammen mit dem analogen Fokus). Offensichtlich entferne ich einen und es funktioniert gut; ist das da für mehrere Browser-Unterstützung ?. Kannst du mir auch sagen, warum ich ZWEI Klicks von einem 'Select'-Objekt brauche, um den Fokus auf das Objekt und das entsprechende div zu verlieren? –

+0

@JimfromPrinceton: Fühlen Sie sich frei, die Ereignisse zu ändern. Das meiste war aus dem Gedächtnis. Sie sollten nicht 2 Klicks benötigen, außer möglicherweise, wenn die Auswahl offen war, also müsste man sich das ansehen. Sollte auf allen Browsern funktionieren, da wir etwas Ähnliches in der Produktion verwenden. –

0

Try this:

$("[class] input").focusout(function(){ 
    console.log('lost focus'); 
}); 

Dadurch wird ein beliebiger Eintrag ausgewählt, der in einem Element mit einem Klassenattribut auf einem beliebigen Wert vorhanden ist.

Leere Saiten:

Wenn die attr muss vorhanden sein & einen beliebigen Wert haben könnte (oder gar keine)

jQuery("[href]"); 

Edit: Aber wenn Sie möchten, den Moment zu erfassen, Der Fokus geht von einem div mit class1 zu einem anderen div mit class2. Sie können dies verwenden:

var currentClass = false; 
var leftClass = false; 
$("[class]").focusout(function(){ 
    leftClass = $(this).attr('class'); 
    console.log('lost focus ' + leftClass); 
}); 

$("[class]").focusin(function(){ 
    currentClass = $(this).attr('class'); 

    if(leftClass && leftClass != currentClass) { 
     // Put your code here 
     console.log(" div left " + leftClass); 
    } 
    console.log('in focus ' + currentClass); 
}); 
+0

Dies erkennt jedes Blur-Ereignis. Das OP möchte wissen, wann der Fokus die Divs, die die Formulare umhüllen, verlässt. –

+0

Dies wird den verlorenen Fokus jeder Eingabe in jedem Div mit einem Klassenattribut erkennen: Er sagte: ** und sobald alle (und alle) Mitglieder der Klasse den Fokus verlieren, dann feuert die Funktion ** –

+1

@GoneCoding hat es richtig. Ich möchte die Funktion ausführen, sobald Gruppenmitglieder als Gruppe den Fokus verlieren. Mein erster Beitrag war nicht gut geschrieben. –