JavaScript 偵測 網站是否活著

JavaScript 偵測 網站是否活著

因為要偵測網站是否活著,所以要使用一些方法確認網站,

網路用了偵測圖片的方式

http://stackoverflow.com/questions/5224197/javascript-check-if-server-is-online

http://stackoverflow.com/questions/4814752/whats-the-best-way-to-check-if-a-website-is-up-or-not-via-javascript

利用小圖,來判定該網站是否活著。

我改寫了,然後自己實際使用可行。

但需要對每個網站做個小動作(如果是自己的網站)就是放一張小圖處理。

    <script>
        function ifServerOnline(webSite,ifOnline, ifOffline)
        {
            var img = document.body.appendChild(document.createElement("img"));
            img.onload = function()
            {
                ifOnline && ifOnline.constructor == Function && ifOnline();
            };
            img.onerror = function()
            {
                ifOffline && ifOffline.constructor == Function && ifOffline();
            };
            img.src = webSite;     
            $(img).css('visibility','hidden')
        }
    </script>
ifServerOnline('http://localhost/test/images/loding.gif',function(){alert('online')}, function(){alert('offline')});

最後,用圖片還有一個缺點,

就是 如果是timeout問題,就會因為等圖撈太久,而偵測過久的問題。

所以另外又做了一個,圖片timeout時的處理。

為什麼用image來偵測呢?因為ajax,有跨網域問題,image就沒有被限制,如果用iframe,也有跨網域,無法取得內容問題。

要判斷404或網站沒有相對網址或controller  可用image 就馬上立馬知道,網站是存在的,但不存在就會等過久,等到timeout,

所以image另外搭配setTimeout來處理,

http://stackoverflow.com/questions/8659364/how-to-cancel-an-image-load-after-a-period-of-time

這篇文章有說明如何設定image timeout的處理。

改寫成下面這種方式處理

           var timer;
            function clearTimer() {
                if (timer) {                
                    clearTimeout(timer);
                    timer = null;
                }
            }

            function handleFail() {
                alert('offline ');
                // kill previous error handlers
                this.onload = this.onabort = this.onerror = function() {};
                // stop existing timer
                clearTimer();
                /*
                // switch to alternate url
                if (this.src === url) {
                    this.src = altUrl;
                }
                */
            }

            var img = document.body.appendChild(document.createElement("img"));
            img.onerror = img.onabort = handleFail;

            img.onload =  function()
            {
                clearTimer();
                alert('online');
            };

            img.onerror = function()
            {
                alert('offline ');
            };


            img.src = webSite + '/image/logo.gif';

            $(img).css('visibility','hidden');
            timer = setTimeout(function(theImg) { 
                return function() {
                    handleFail.call(theImg);
                };
            }(img), 1000);