2010-11-15 37 views
1

我有一個數據庫的字段'狀態',當離線時默認爲0,在線時爲1。我想知道是否有人知道在瀏覽器關閉的情況下更新數據庫的方法(將1設置爲0)。有人建議我使用卸載並指向AJAX,但我不知道該怎麼做...請幫助,謝謝...AJAX更新數據庫在瀏覽器退出

+1

請注意,在窗口關閉之前沒有真正可靠的方法來執行AJAX調用 - 觸發的事件(onbeforeunload和onunload,IIRC)在很短的時間內被強制終止。因此,有些客戶可能無法及時更新數據庫。此外,沒有可靠的方法來確定瀏覽器是否關閉,或只是用戶正在導航到不同的頁面。 – Piskvor 2010-11-15 19:52:48

回答

0

Piskvor已經死了。沒有可靠的方法來確定用戶何時實際離開您的網站,例如,去bored.com--或者如果他們有兩個打開的窗口都在查看您的網站,並且他們決定關閉其中的一個。這就是爲什麼大多數情況下,登錄會話過期並且網站提供「註銷」按鈕 - 要確切知道。

如果你確實想進一步探索這條路,這是爲創建一個javascript函數一樣簡單

function doAjaxThingy(){ 

    var qty = document.getElementById(q).value; 
    var ajax = getXmlObject(); 
    var url= '/doAjaxThingy.php'; 

    if (ajax.readyState == 4 || ajax.readyState == 0) { 
     ajax.open("POST", url, true); 
     ajax.onreadystatechange = function(){ 
      if (ajax.readyState == 4) {  
       alert(ajax.responseText); 
      } 
     }; 
     ajax.send(null); 
    } 
} 

function getXmlObject() { 
     if (window.XMLHttpRequest) { 
      return new XMLHttpRequest(); 
     } else if(window.ActiveXObject) { 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     } else { 
      showError('Status: Cound not create XmlHttpRequest Object. Consider upgrading your browser.','Please Wait'); 
     } 
    } 

,然後讓頁面知道要調用該函數時,它卸載

<body onunload="doAjaxThingy();"> 
+0

感謝您的建議,我剛剛嘗試過,它看起來好像AJAX可能無法正常工作時從身體onunload調用,因爲它什麼都不做,再次感謝我會繼續嘗試:) – jason 2010-11-16 15:30:19

+0

其實我想我可能已經工作了與您的意見(S))...我會回來後,如果它的工作,因爲我想 - 再次感謝Piskvor和Dutchie432我欣賞它加載:) – jason 2010-11-17 12:42:05

+0

我會好奇,看到你的最終結果!祝你好運。此外,你可能會想再次嘗試使用我忘記包含的getXmlObject函數。 : - / – Dutchie432 2010-11-18 13:27:57

2
Here is a simple solution for browser close event. I faced some issue with "onunload" and "beforeonunload" events. It will be triggered for browser close, tab close, any link click, URL change. So i customized my code like this. 

<script type="text/javascript"> 
     jQuery(document).ready(function() { 
      var validNavigation = false; 

      // Attach the event keypress to exclude the F5 refresh 
      $(document).bind('keypress', function(e) { 
      if (e.keyCode == 116){ 
       validNavigation = true; 
      } 
      }); 

      // Attach the event click for all links in the page 
      $("a").bind("click", function() { 
      validNavigation = true; 
      }); 

      // Attach the event submit for all forms in the page 
      $("form").bind("submit", function() { 
      validNavigation = true; 
      }); 

      // Attach the event click for all inputs in the page 
      $("input[type=submit]").bind("click", function() { 
      validNavigation = true; 
      }); 

      window.onbeforeunload = function() {     
       if (!validNavigation) {        
       var status = 'abandoned'; 
        $.ajax({ 
         type: "POST", 
         url: your action URL, 
         data: "status=" + status, 
         success: function(res) { 
         }, 
        }); 
       } 
      }; 
     }); 
    </script>