關於自動刷新CSS

因爲最近系統調整大量的css,但願用戶在瀏覽的時候能即時看到css的更改,而不是繼續看到的是客戶機上的緩存css.php

在網絡上找了下,發現不少人推薦一個叫cssrefresh的小工具。css

http://www.oschina.net/p/cssrefresh緩存

網上說很好用,因此我就下載了試試。網絡

但按網上的進行了引用以後,卻沒有即時的顯示。dom

查看了下內部實現,發現是由於實現時時去檢查請求頭的文件的Last-Modified的值,可是跟蹤發現,裏面並不存在該屬性,工具

固然就不能實現即時的顯示。this

看網文,說是請求頭裏面有ETag的屬性,一樣是標識文件是否有修改的,具體的不是很清楚。url

因此我就更改了下,以ETag爲判斷依據。spa

而後發現是能夠的。.net

/*    
 *    CSSrefresh v1.0.1
 *    
 *    Copyright (c) 2012 Fred Heusschen
 *    www.frebsite.nl
 *
 *    Dual licensed under the MIT and GPL licenses.
 *    http://en.wikipedia.org/wiki/MIT_License
 *    http://en.wikipedia.org/wiki/GNU_General_Public_License
 */

(function() {

    var phpjs = {

        array_filter: function( arr, func )
        {
            var retObj = {}; 
            for ( var k in arr )
            {
                if ( func( arr[ k ] ) )
                {
                    retObj[ k ] = arr[ k ];
                }
            }
            return retObj;
        },
        filemtime: function( file )
        {
            var headers = this.get_headers( file, 1 );
            return (headers && headers['ETag']) || false;
        },
        get_headers: function( url, format )
        {
            var req = window.ActiveXObject ? new ActiveXObject( 'Microsoft.XMLHTTP' ) : new XMLHttpRequest();
            if ( !req )
            {
                throw new Error('XMLHttpRequest not supported.');
            }

            var tmp, headers, pair, i, j = 0;

            try
            {
                req.open( 'HEAD', url, false );
                req.send( null ); 
                if ( req.readyState < 3 )
                {
                    return false;
                }
                tmp = req.getAllResponseHeaders();
                tmp = tmp.split( '\n' );
                tmp = this.array_filter( tmp, function( value )
                {
                    return value.toString().substring( 1 ) !== '';
                });
                headers = format ? {} : [];
    
                for ( i in tmp )
                {
                    if ( format )
                    {
                        pair = tmp[ i ].toString().split( ':' );
                        headers[ pair.splice( 0, 1 ) ] = pair.join( ':' ).substring( 1 );
                    }
                    else
                    {
                        headers[ j++ ] = tmp[ i ];
                    }
                }
    
                return headers;
            }
            catch ( err )
            {
                return false;
            }
        }
    };

    var cssRefresh = function() {

        this.reloadFile = function( links )
        {
            for ( var a = 0, l = links.length; a < l; a++ )
            {
                var link = links[ a ],
                    newTime = phpjs.filemtime( this.getRandom( link.href ) );

                //    has been checked before
//                if ( !link.last )
//                {
                    //    has been changed
                    if ( link.last != newTime )
                    {
                        //    reload
                        link.elem.setAttribute( 'href', this.getRandom( link.href ) );
                    }
//                }

                //    set last time checked
                link.last = newTime;
}
            setTimeout( function()
            {
                this.reloadFile( links );
            }, 1000 );
        };

        this.getHref = function( f )
        {
            return f.getAttribute( 'href' ).split( '?' )[ 0 ];
        };
        this.getRandom = function( f )
        {
            return f + '?x=' + Math.random();
        };


        var files = document.getElementsByTagName( 'link' ),
            links = [];

        for ( var a = 0, l = files.length; a < l; a++ )
        {            
            var elem = files[ a ],
                rel = elem.rel;
            if ( typeof rel != 'string' || rel.length == 0 || rel == 'stylesheet' )
            {
                links.push({
                    'elem' : elem,
                    'href' : this.getHref( elem ),
                    'last' : false
                });
            }
        }
        this.reloadFile( links );
    };


    cssRefresh();

})();

保存爲js文件,進行引用便可。

相關文章
相關標籤/搜索