【问题标题】:jQuery version compatibility detectionjQuery版本兼容性检测
【发布时间】:2010-04-16 18:28:45
【问题描述】:

是否有任何资源可以测试 jQuery 脚本/扩展/插件/任何版本的兼容性问题?

【问题讨论】:

标签: jquery backwards-compatibility


【解决方案1】:

刚刚写了一个小的 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

$.isVersion("1.4.2", "<=", "1.4.2pre"); // returns false

【讨论】:

    【解决方案2】:

    代码有一些错误,特别是

    1. $.isVersion('1.9.2.17', '
    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);
    

    【讨论】:

    【解决方案3】:

    至少我见过没有自动化工具可以做到这一点。这样做的原因是 jQuery 核心团队试图引入重大更改,除非有真正的长期利益。这意味着,当发生重大更改时,您想要不是自动化系统总能告诉您的。

    我们以 jQuery 1.4 为例,以下是重大更改列表:
    http://jquery14.com/day-01/jquery-14#backwards

    • jQuery() 现在是一个空集,好还是坏?
    • jQuery.browser.version现在是浏览器版本,好还是不好?
    • JSON 现在受到更严格的解析,好还是坏?

    这些只是少数,但它们是否会破坏或帮助您的代码通常取决于。现在,如果您有.attr(val, func()),那么显然这只是 1.4+,您可以检测到...因此可以确定您的代码可以使用的 jQuery 的最低版本的引擎可能是可能的。

    检查兼容性问题(我认为这意味着在大多数情况下会破坏更改)会更加困难,因为它们(大部分)本质上是非常奇怪或被破坏的极端情况......否则团队不会有把它们弄坏了:)

    【讨论】:

      【解决方案4】:

      您是否想获取当前版本的 jQuery 并对其进行测试以查看其是否为特定版本?

      $().jquery;
      

      这将获得版本。

      大都会

      【讨论】:

      • 比“jQuery().jquery”更好,因为 $ 也可能用于其他事情
      【解决方案5】:

      这是我快速而肮脏的解决方案:

      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" vs "x.y.0"。在这种情况下,.0 版本被认为更大。它也不支持"pre" 版本。

      这是一个较小的版本:

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

      如果您担心“rc1”、“pre”或x.0 版本,这里有一个更可靠的函数:

      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;
      };
      

      这类似于 sort 或 .compare 函数,如果相等则返回 0,如果 a > b 则返回 1,如果 a -1。示例:

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

      【讨论】:

        【解决方案6】:

        Holy Smokes people,这些是有史以来最冗长的解决方案!我错过了什么吗?我必须。以下是我的解决方案,我缺少什么?

        压缩版:

        (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");
        }
        

        【讨论】:

        • 比较 jQuery 1.7 和 1.1.3.1 会发生什么?
        猜你喜欢
        • 1970-01-01
        • 2019-08-27
        • 2014-12-03
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多