8

バージョンの互換性の問題について、jQuery スクリプト/拡張機能/プラグイン/その他をテストできるリソースはありますか?

4

6 に答える 6

13

バージョンの互換性の問題を解決するために小さなjQueryプラグインを作成しました...自由に改善してください。

(function($) {
    /**
     * Used for version test cases.
     * 
     * @param {string} left A string containing the version that will become
     *        the left hand operand.
     * @param {string} oper The comparison operator to test against. By
     *        default, the "==" operator will be used.
     * @param {string} right A string containing the version that will
     *        become the right hand operand. By default, the current jQuery
     *        version will be used.
     *        
     * @return {boolean} Returns the evaluation of the expression, either
     *         true or false.
     */
    $.isVersion = function(left, oper, right) {
        if (left) {
            var pre = /pre/i,
                replace = /[^\d]+/g,
                oper = oper || "==",
                right = right || $().jquery,
                l = left.replace(replace, ''),
                r = right.replace(replace, ''),
                l_len = l.length, r_len = r.length,
                l_pre = pre.test(left), r_pre = pre.test(right);

            l = (r_len > l_len ? parseInt(l) * ((r_len - l_len) * 10) : parseInt(l));
            r = (l_len > r_len ? parseInt(r) * ((l_len - r_len) * 10) : parseInt(r));

            switch(oper) {
                case "==": {
                    return (true === (l == r && (l_pre == r_pre)));
                }
                case ">=": {
                    return (true === (l >= r && (!l_pre || l_pre == r_pre)));
                }
                case "<=": {
                    return (true === (l <= r && (!r_pre || r_pre == l_pre)));
                }
                case ">": {
                    return (true === (l > r || (l == r && r_pre)));
                }
                case "<": {
                    return (true === (l < r || (l == r && l_pre)));
                }
            }
        }

        return false;
    }
})(jQuery);

そのように使用することができます:

$.isVersion("1.4.2"); // returns true, if $().jquery == "1.4.2"
$.isVersion("1.3.2", ">"); // returns true if $().jquery > "1.3.2"
$.isVersion("1.3", ">", "1.2.6"); // returns true
$.isVersion("1.3.2", "<", "1.3.1"); // returns false
$.isVersion("1.4.0", ">=", "1.3.2"); // returns true
$.isVersion("1.4.1", "<=", "1.4.1"); // returns true

プレリリースもサポートします(リリースはプレリリースよりも重いため、1.4.0pre <1.4.0):

$.isVersion("1.4.2", "<=", "1.4.2pre"); // returns false
于 2010-06-24T20:41:46.600 に答える
5

コードにはいくつかのバグがあり、特に

  1. $ .isVersion( '1.9.2.17'、'<'、 '2.0')はfalseを返します
  2. $ .isVersion( '1.17.2.1'、'>'、 '1.8')はfalseを返します

解決策
1.は添付のコードで修正されています。
2.完全に書き直さないと難しいのではなく、とにかくまれなケースです。

(function($) {
/**
 * Used for version test cases.
 *
 * @param {string} left A string containing the version that will become
 *        the left hand operand.
 * @param {string} oper The comparison operator to test against. By
 *        default, the "==" operator will be used.
 * @param {string} right A string containing the version that will
 *        become the right hand operand. By default, the current jQuery
 *        version will be used.
 *
 * @return {boolean} Returns the evaluation of the expression, either
 *         true or false.
 */
$.isVersion = function(left, oper, right) {
    if (left) {
        var pre = /pre/i,
            replace = /[^\d]+/g,
            oper = oper || "==",
            right = right || $().jquery,
            l = left.replace(replace, ''),
            r = right.replace(replace, ''),
            l_len = l.length, r_len = r.length,
            l_pre = pre.test(left), r_pre = pre.test(right);

        l = (r_len > l_len ? parseInt(l) * Math.pow(10, (r_len - l_len)) : parseInt(l));
        r = (l_len > r_len ? parseInt(r) * Math.pow(10, (l_len - r_len)) : parseInt(r));

        switch(oper) {
            case "==": {
                return (true === (l == r && (l_pre == r_pre)));
            }
            case ">=": {
                return (true === (l >= r && (!l_pre || l_pre == r_pre)));
            }
            case "<=": {
                return (true === (l <= r && (!r_pre || r_pre == l_pre)));
            }
            case ">": {
                return (true === (l > r || (l == r && r_pre)));
            }
            case "<": {
                return (true === (l < r || (l == r && l_pre)));
            }
        }
    }

    return false;
}
})(jQuery);
于 2011-06-22T14:49:24.430 に答える
3

少なくとも私が今まで見た中では、これを自動化するツールはありません。その理由は、jQuery コア チームが、長期的なメリットがない限り、重大な変更を導入しないように努めているためです。これは、互換性を破る変更があった場合に、自動化されたシステムが常に教えてくれるものとは限らないことを意味します

例として jQuery 1.4 を使用してみましょう。重大な変更のリストは次のとおりです:
http://jquery14.com/day-01/jquery-14#backwards

  • jQuery()良いか悪いか?
  • jQuery.browser.version今のブラウザ版は良いか悪いか?
  • JSON良くも悪くも、はるかに厳密な解析の対象になりましたか?

これらはほんの一握りですが、多くの場合、それらがコードを壊したり助けたりするかどうかによって異なります。.attr(val, func())明らかにこれが 1.4+ のみであることを検出できた場合、コードで使用できる jQuery の最小バージョンを判断できるエンジンが可能になる可能性があります 。

ほとんどの場合、変更を破壊することを意味する互換性の問題を確認することは、はるかに困難です。なぜなら、それらは(ほとんどの場合)本質的に非常に奇妙であるか、壊れているコーナーケースだからです...そうでなければ、チームはそれらを壊していなかったでしょう: )

于 2010-04-17T00:34:18.980 に答える
1

jQuery の現在のバージョンを取得して、特定のバージョンかどうかをテストしますか?

$().jquery;

それはバージョンを取得します。

大都市

于 2010-04-16T21:22:52.207 に答える
0

これが私の迅速で汚い解決策です:

var versionGTE = function (valueA, valueB) {
  var values = [valueA, valueB];
  values.sort();
  // if valueA > valueB, values will have switched
  return (values[1] === valueA);
};

使用例:

if (versionGTE(jQuery.fn.jquery, "1.3")) {
  // don't use @ in attr selectors
}

配列に対してアルファベット順のソートを行います。失敗するのは、何らかの理由でバージョン"x.y""x.y.0". その場合、.0バージョンは大きいと認識されます。"pre"バージョンもサポートしていません。

小さいバージョンは次のとおりです。

var versionGTE = function (valueA, valueB) {
  return ([valueA, valueB].sort()[1] === valueA);
};

x.0「rc1」、「pre」、またはバージョンが心配な場合は、より信頼性の高い関数を次に示します。

var versionCompare = function (versionStringA, versionStringB) {
  // quick test of equality before digging in
  if (versionStringA === versionStringB) return 0;

  var versionedAlpha = /[a-z]+(\d+)/gi,
      getArray = function (verString) {
        // replace rc1, rc2, beta3, etc with .-1.1, .-1.2, .-1.3, etc
        return verString.replace(versionedAlpha, ".-1.$1").split(".");
      },
      valuesA = getArray(versionStringA),
      valuesB = getArray(versionStringB),
      maxLength = Math.max(valuesA.length, valuesB.length),
      hasLetters = /[a-z]/gi,
      // assume any version with letters is -1 (pre, rc, etc)
      // also assume that any null entries are 0 (1.5 === 1.5.0)
      parseVersion = function (verString) {
        return (verString) ? (hasLetters.test(verString)) ? -1 : parseInt(verString, 10) : 0;
      };

  // verify both arrays are the same size
  valuesA.length = maxLength;
  valuesB.length = maxLength;

  for (var i = 0; i < maxLength; i++) {
    var valueA = parseVersion(valuesA[i]),
        valueB = parseVersion(valuesB[i]);

    if (valueA < valueB) {
      return -1;
    } else if (valueA > valueB) {
      return 1;
    }
  }

  // all equal at this point
  return 0;
};

0これは、等しい1場合、a > b の場合、およびa < b の場合に返されるという点で、sort または .compare 関数に似ています-1。例:

if (versionCompare(jQuery.fn.jquery, "1.3") >= 0) {
  // don't use @ in attr selectors
}
于 2012-05-11T20:51:52.580 に答える
-3

聖なる煙の人々、それらはこれまでで最も冗長な解決策です! 何か不足していますか?私はしなければならない。以下は私の解決策ですが、何が欠けていますか?

圧縮版:

(parseInt(jQuery.fn.jquery.split('.').join('')) > 140) ? alert("Running jquery greater than 1.4.0") : alert("current jquery version is 1.4.0 or less");

明確にするために長いバージョン:

// get version as a string and get rid of the periods. 
version = jQuery.fn.jquery.split('.').join('');

// Make into one long number for easy comparison.  Example, 171, or 141.
version = parseInt(version);
if(version > 141){
    alert("We're using a version greater than 1.4.1");
}else{
    alert("jQuery version is 1.4.1 or lower");
}
于 2012-04-26T23:02:11.330 に答える