2016-05-11 16 views
1

Ich entschuldige mich, wenn dies zuvor beantwortet wurde, konnte ich es nicht mit der Suche finden.JavaScript/jQuery: Wie löst man ein Ereignis aus, wenn "display: none" entfernt wird?

Ich muss 4 Elemente kennzeichnen, um ein Ereignis auszulösen, wenn sie eingeblendet werden ("display: none" wird entfernt). Ich denke, dass ein mutationObserver der richtige Weg ist, aber ich habe Probleme, genau auf das Ereignis zu filtern, das ich brauche.

Hat jemand Erfahrung damit?

Bearbeiten: Leider haben wir keinen Zugriff auf das Skript tatsächlich die Elemente zu verstecken. Sie sind Eigentum und werden von einem anderen Team geschützt. Das einzige was wir eingeben können ist, wenn das Element eingeblendet wird.

Ich habe versucht, herauszufinden, wie das für meine Bedürfnisse zu bearbeiten.

// Blocker is the element that has a changing display value 
var blocker = document.querySelector('#blocker'); 
// Trigger changes the display value of blocker 
var trigger = document.querySelector('#trigger'); 
// Our mutation observer, which we attach to blocker later 
var observer = new MutationObserver(function(mutations){ 
    mutations.forEach(function(mutation){ 
     // Was it the style attribute that changed? (Maybe a classname or other attribute change could do this too? You might want to remove the attribute condition) Is display set to 'none'? 
     if(mutation.attributeName === 'style' && window.getComputedStyle(blocker).getPropertyValue('display') !== 'none' 
     ){ 
      alert('#blocker\'s style just changed, and its display value is no longer \'none\''); 
     } 
    }); 
}); 

// Attach the mutation observer to blocker, and only when attribute values change 
observer.observe(blocker, { attributes: true }); 

// Make trigger change the style attribute of blocker 
trigger.addEventListener('click', function(){ 
    blocker.removeAttribute('style'); 
}, false); 
+0

Feuern Sie ein benutzerdefiniertes Ereignis in welchem ​​Skript/Verhalten löst die Entfernung von 'display: none'? –

+0

Leider haben wir keinen Zugriff auf dieses Skript. Drittanbieter-Tagging-Unternehmen. –

Antwort

4

Hier gehen wir

var blocker = document.querySelector('#blocker'); 
var previousValue = blocker.style.display; 

var observer = new MutationObserver(function(mutations){ 
    mutations.forEach(function(mutation) { 
     if (mutation.attributeName !== 'style') return; 
     var currentValue = mutation.target.style.display; 
     if (currentValue !== previousValue) { 
      if (previousValue === "none" && currentValue !== "none") { 
      console.log("display none has just been removed!"); 
      } 

      previousValue = mutation.target.style.display; 
     } 
    }); 
}); 


observer.observe(blocker, { attributes: true }); 

Grundsätzlich wir den Standardwert im Stil-Attribute erhalten (falls vorhanden) - dies in previousValue gespeichert ist; Dann lassen wir den Code, aber wir machen einige Unterschiede in der Schleife. Zuerst prüfen wir, ob der Stil im Ziel geändert wurde. Dann erhalten wir den aktuellen Anzeigewert im Style-Attribut des Ziels. Der nächste Schritt besteht darin, diese Werte zu vergleichen. Wenn previousValue "none" ist und jetzt etwas anderes, bedeutet dies die Anzeige: none wurde nicht gesetzt. Sie müssen jedoch beachten, dass es nur auf diese spezifische Änderung hört. Wenn Sie nicht auf "keine" hören müssen, können Sie es weglassen.

Sie können es in Ihrem Code verwenden - ich habe nicht Ihren gesamten Code absichtlich geschrieben, so zögern Sie nicht, Ihren Event-Listener auf Ziel hinzuzufügen.

+0

Super, danke !!! Ich werde das jetzt versuchen. –

+0

Normalerweise verwende ich einen jQuery .each Selektor, um Elemente wie diese auf jedes Element mit einer bestimmten Klasse anzuwenden. Würde diese Antwort mit mehreren Objekten derselben Klasse funktionieren? –

+0

Wenn Sie möchten, dass Sie auf mehrere Elemente hören möchten, dann müssen Sie die Elemente iterieren. Sie könnten diesen Code einfach in Ihre .each-Funktion einfügen und die 'blocker'-Variable entfernen und an jeder Stelle, an der sie aufgetreten ist, das zweite Argument von .each loop (the elem) einfügen. Das ist es, es ist auch erwähnenswert, dass Sie den Beobachter trennen können, sobald er nicht mehr benötigt wird - rufen Sie einfach observer.disconnect() –

1

Leider bin ich nicht sicher, wie Sie display: none „Entfernen“, aber wenn Sie sind, durch Zufall, jQuery mit $.show Funktion, dann könnten Sie einen „Rückruf“ -Funktion angeben, welche würde aufgerufen werden, sobald die Show "Animation" beendet ist.

Hier ist ein Beispiel:

$(".myElement").show(400, function() { 
    // Do something... 
}); 

Noch einmal, ich bin nicht sicher, wie Sie ‚re display: none entfernen, so kann dies überhaupt nicht hilfreich sein.

+0

Wir sind leider nicht. Dieses Skript gehört einem anderen Team und ist für uns nicht verfügbar. Wir arbeiten mit den Vermarktern zusammen, um die gesammelten Daten zu bereichern. –

+0

Verstanden. Bitte ignoriere meine Antwort, da sie nichts nützt, sorry! –

Verwandte Themen