2016-05-09 6 views
0

Ich lese viel darüber, aber ich kann es immer noch nicht herausfinden. Ich muss einige Jobs machen, wenn der Benutzer meine Seite verlässt. Also habe ich das window.onbeforeunload verwendet, um ihn zu warnen, dass er die Seite und das window.onunload beenden wird, um meinen Job zu starten. Das Problem ist, wenn ich die onunload-Funktion mache, wird es nicht korrekt fertig, bevor meine Seite bereits geschlossen ist.Javascript onunload Funktion

habe ich versucht, dies dann:

 window.onunload = function() { 

      //freezeScreen(5000); 

      console.log("destroy finished 1/8"); 

      $.each(_tabClassObj, function(index) { 
       _tabClassObj[index].destroy(); 
      }); 
      console.log("destroy finished 2/8"); 
      _tabClassObj = {}; 
      console.log("destroy finished 3/8"); 
      _terminalTabCounter = 0; 
      console.log("destroy finished 4/8"); 
      window.onbeforeunload = null; 
      console.log("destroy finished 5/8"); 
      window.onunload = null; 
      console.log("destroy finished 6/8"); 
     } 

Hier ist mein Konsolenprotokoll:

destroy finished 1/8 
WebSocket is already in CLOSING or CLOSED state. 
WebSocket is already in CLOSING or CLOSED state. 
WebSocket is already in CLOSING or CLOSED state. 
WebSocket is already in CLOSING or CLOSED state. 
WebSocket is already in CLOSING or CLOSED state. 

Ich habe versucht, den Browser-Benutzeroberfläche aus zu schließen mit der Freeze-Funktion zu verzögern, dass mein Browser Abschaltung von 5 Sekunden verzögert ... aber es funktioniert immer noch nicht. Ich habe auch hier ein setTimeout ausprobiert ... aber mit dem gleichen Ergebnis. Was ist das Problem? Danke für den Rat.

+1

Können Sie erklären, warum eine der Aktionen, die Sie auf 'unload' nehmen sind relevant? Ich meine: Löschen von Variablen und solche scheint nutzlos, wenn das sowieso passiert, wenn Sie die Seite entladen. – trincot

+0

Setzen Sie 'return false' als letzte Zeile in 'onunload'-Funktion. – wajeeh

+0

Sie scheinen eine Menge seltsamer Dinge zu tun, die nicht notwendig sind, nachdem Ihre Entladung bereits begonnen hat. Und Sie müssen Wahr oder Falsch zurückgeben, um anzugeben, ob es behandelt wurde oder nicht. Wenn Sie nicht mit dem Entladen fortfahren möchten, geben Sie oben false von Ihrem Handler zurück. – ManoDestra

Antwort

0

Ich konnte nicht getan, was ich mit Javascript-Ereignis möchte. Zu meinem Meteor Server erwähnen mein Mandant seinen Browser geschlossen hat, entwickelte ich ein Ping-System wie folgt aus:

// Both side 
TelnetUserConnections = new Meteor.Collection('TelnetUserConnections'); 

// Client side 
Meteor.startup(function(){ 
    // Timer who refresh the heartbeat on server 
    Meteor.setInterval(function() { 
     Meteor.call('keepAlive', Blaze._globalHelpers.currentUserId()); 
    }, 5000); 
}); 

// Server side 
Meteor.methods({ 
    "keepAlive": function (user_id) { 
     if (!TelnetUserConnections.findOne({user_id: user_id})) { 
      TelnetUserConnections.insert({user_id: user_id}); 
     } 
     TelnetUserConnections.update({user_id: user_id}, {$set: {last_seen: (new Date()).getTime()}}); 
    } 
}); 

Meteor.setInterval(function() { 
    // do the job when user hasn't pinged since 20 secondes 
    var now = (new Date()).getTime(); 
    TelnetUserConnections.find({last_seen: {$lt: (now - 20 * 1000)}}).forEach(function (user) { 

     /* here is my destroy stuff */ 

     TelnetUserConnections.remove({_id : user._id}); 
    }); 
}); 

Vielleicht kann es hilft

0

Wenn Sie Blaze als Ansichtsebene verwenden, haben Sie Zugriff auf die Methode onDestroy, um die Logik zu schreiben, die Sie vor dem Verlassen der URL einfügen möchten.

Template.xxx.onDestroy(function() { 
    // logic goes here. 
}); 
+0

Vielen Dank für Ihre Antwort Faysal. Ich habe bereits versucht Blaze Template Event zu verwenden ... aber normalerweise wird niemand ausgelöst. Die "onDestroy" wie Sie erwähnen, geben Sie mir eine Fehlermeldung zurück, die keine Funktion ist. Ich habe das onDestroyed versucht, aber hier wird es nicht ausgelöst ... deshalb habe ich versucht, direkt durch javascript Ereignis zu gehen. – Manov