0

https://github.com/yui/yuglifyからYahooJavaScriptUglify(yuglify)をダウンロードしました。これを、Apacheサーバーでホストされている一部のPHPプロジェクトのJSおよびCSS圧縮に使用する予定です。これらの元の内容でファイルを縮小しようとしました:

var _cmFrameList = new Array ();    // a pool of reusable iframes
var _cmFrameListSize = 0;           // keep track of the actual size
var _cmFrameIDCount = 0;            // keep track of the frame id
var _cmFrameMasking = true;         // use the frame masking

// disable iframe masking for IE7
/*@cc_on
    @if (@_jscript_version >= 5.6)
        if (_cmFrameMasking)
        {
            var v = navigator.appVersion;
            var i = v.indexOf ("MSIE ");
            if (i >= 0)
            {
                if (parseInt (navigator.appVersion.substring (i + 5)) >= 7)
                    _cmFrameMasking = false;
            }
        }
    @end
@*/

var _cmClicked = false;             // for onClick

しかし、代わりにこれを手に入れました:

var _cmFrameList=new Array,_cmFrameListSize=0,_cmFrameIDCount=0,_cmFrameMasking=!0,_cmClicked=!1

元のファイルの内容には、古いIEブラウザーで動作するために必要な条件付きコンパイルコードがいくつかあります(@ cc_on、@ if、@ endなどで始まるコメント行)。yuglifyはこれらの条件付きコンパイル行を単純なコメントとして扱っているようであり、そのため、すべてを削除しています。

好奇心から、この同じファイル( https://github.com/yui/yuicompressor/downloads )でもyuicompressorをテストしましたが、すべての条件付きコンパイルコードはそのままのようです。改行でさえまだそこにあります:

var _cmFrameList=new Array();var _cmFrameListSize=0;var _cmFrameIDCount=0;var _cmFrameMasking=true;
/*@cc_on
    @if (@_jscript_version >= 5.6)
        if (_cmFrameMasking)
        {
            var v = navigator.appVersion;
            var i = v.indexOf ("MSIE ");
            if (i >= 0)
            {
                if (parseInt (navigator.appVersion.substring (i + 5)) >= 7)
                    _cmFrameMasking = false;
            }
        }
    @end
@*/
var _cmClicked=false;

古いIEブラウザーは、これらの条件付きコンパイル行がないと文字化けします。yuglifyを削除せずに使用することはできますか?

4

1 に答える 1

0

evalコマンドで少し回避策を使用して、それを解決する方法を見つけました。

最初に、私はこれらのグローバル変数を作成しました:

var is_IE_browser = eval('/*@cc_on !@*/false');
var jscript_version = (is_IE_browser) ? eval("/*@cc_on @_jscript_version @*/") : (0);
var IE_version = (is_IE_browser) ? (get_IE_version()) : (0);

次に、この関数を作成しました。

function get_IE_version(){
    var IE_version;
    if(jscript_version == 5.6 || (jscript_version == 5.7 && navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) {
        IE_version = 6;
    } else if(jscript_version == 5.7){
        IE_version = 7;
    } else if(jscript_version == 5.8){
        IE_version = 8;
    } else if(jscript_version == 9){
        IE_version = 9;
    } else if(jscript_version == 10){
        IE_version = 10;
    } else {
        IE_version = 0;
    }
    return IE_version;
}

これにより、上記の変数を使用して、すべての条件付きコンパイルコード(cc_on)をいくつかの条件に置き換えることができます。

変数「is_IE_browser」は、ブラウザがIEの場合はtrueを返し、そうでない場合はfalseを返します。

変数「IE_version」は、ブラウザがIEの場合はIEのバージョン番号を返し、そうでない場合はゼロを返します。

このコードを使用すると、ほとんどのIEブラウザーを確実に検出できます(IE6を除き、ブラウザーのユーザーエージェントデータを少し検索する必要があり、ブラウザーのスニッフィングに対して脆弱ですが、私はそれを使用できます)。

このようにして、古いブラウザを正常に検出し、JSファイルを損傷することなくyuglifyを使い続けることができます。

于 2013-11-11T20:47:24.590 に答える