2016-11-04 2 views
0

Ich möchte ein Popup auslösen, wenn der Benutzer zu einer bestimmten Element-ID von meiner Website scrollt.Wie wird die JS-Funktion nur einmal ausgeführt?

Im Moment gelingt mir das, aber es funktioniert in einer Schleife und ich kann die Funktion nicht stoppen, nachdem es einmal ausgeführt wurde.

Folgt meinem JS-Code:

$(window).scroll(function() { 
var executed = false; 
    if (!executed){ 
    executed = true; 
     var hT = $('#scroll-to').offset().top, 
     hH = $('#scroll-to').outerHeight(), 
     wH = $(window).height(), 
     wS = $(this).scrollTop(); 
    if (wS > (hT+hH-wH)){ 
    <!-- 
    window.setTimeout('window.location="javascript:showSuccessToast();"; ',2000); 
    // --> 
    }} 
    }); 

Ich kann nicht verstehen, warum die Funktion ausführt, wenn "ausgeführt" Variable wahr wird. Wie kann ich es nur einmal feuern showsuccessToast?

+0

Mögliche Duplikat [Funktion in Javascript, die nur einmal aufgerufen werden kann] (http://stackoverflow.com/ questions/12713564/function-in-javascript-das-kann nur einmalig aufgerufen werden) –

+1

'$ (window) .one (" scroll ", function() {...});' Keine Notwendigkeit zu behandeln das selbst. –

+1

@Frederic, aber zeigen Sie auf ein Stück Doc, damit er folgen kann. http://api.jquery.com/one/ – arhak

Antwort

1

Die var immer false gesetzt wird ausgeführt, wenn das Scroll-Ereignis eintritt. Was bedeutet, dass es in Ihrer Funktion nutzlos ist.

Setzen Sie die Ausführung der Ereignisfunktion sollte funktionieren.

var executed = false; 
$(window).scroll(function() { 
    var hT = $('#scroll-to').offset().top, 
    hH = $('#scroll-to').outerHeight(), 
    wH = $(window).height(), 
    wS = $(this).scrollTop(); 
if (wS > (hT+hH-wH)){ 
if (!executed){ executed = true; 
    <!-- 
    window.setTimeout('window.location="javascript:showSuccessToast();"; ',20); 
    // --> 
}} 
}); 
+0

Was passiert, wenn der Benutzer die Seite aktualisiert? Wird es erneut ausgelöst? –

+0

Jetzt wird es nur ausgelöst, wenn ich die Seite neu lade und die ID im Fenster vorhanden ist :(Wenn ich von der oberen bis zur ID blättern, wird es nicht ausgelöst –

+0

Natürlich wird es Feuer (was meinst du Feuer?) wieder. Der Speicher wird aktualisiert, wenn der Benutzer die Seite aktualisiert. So ausgeführt wird auf false zurückgesetzt. – ZeroZerg

2

Ihre Funktion wird jedes Mal neu ausgeführt, wenn das Ereignis ausgelöst wird - dies beinhaltet die Initialisierung von executed. Mit anderen Worten, bei jeder Ausführung Ihrer Funktion setzen Sie executed zurück auf false!

Um dies zu beheben, müssen Sie außerhalb der Funktion der Variablendefinition ziehen:

var executed = false; 

$(window).scroll(function() { 
    if (!executed) { 
     executed = true; 

     ... 
    } 
}); 
+0

Jetzt feuert es nur, wenn ich die Seite neu lade und die ID ist im Fenster vorhanden :(Wenn ich von der Spitze bis zur ID blättern, feuert es nicht –

+0

@GeorgeL. Sie müssen die 'executed = true verschieben 'Linie zu der Stelle, die Sie nur einmal ausführen wollen.Wahrscheinlich in diesem Fall innerhalb des if-Blocks – JJJ

+0

aber es ist in der if-Block –

2

Eine andere Möglichkeit wäre unbind() zu verwenden, wie die folgende JS-Code zeigt:

$(window).scroll(myScrollFunction); 
function myScrollFcuntion() 
{ 
    // do things 
    $(window).unbind("scroll", myScrollFunction); 
} 
+0

Nun, jetzt wird das Ereignis nicht ausgelöst –

Verwandte Themen