jQuery版本兼容性检测

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

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

代码有一些错误,特别是

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

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

我们以jQuery 1.4为例,这里是一个重大变化列表:
http://jquery14.com/day-01/jquery-14#backwards

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

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

检查兼容性问题,我认为这意味着在大多数情况下会发生变化,这将是非常困难的,因为它们(大多数)本质上是非常奇怪的或破坏的情况……否则团队不会破坏它们: )

你想获得当前版本的jQuery并测试它以查看它是否是某个版本?

 $().jquery; 

那会得到版本。

都会

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

 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 } 

它在数组上按字母顺序排序。 它失败的唯一时间是由于某种原因版本"xy" vs "xy0" 。 在这种情况下, .0版本被认为更大。 它也不支持"pre"版本。

这是一个较小的版本:

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

如果您担心“rc1”,“pre”或x.0版本,这是一个更可靠的function:

 var versionCompare = function (versionStringA, versionStringB) { // quick test of equality before digging in if (versionStringA === versionStringB) return 0; var versionedAlpha = /[az]+(\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 = /[az]/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 } 

我在分叉的要点上写了解决方案: https : //gist.github.com/budiadiono/7954617 。 你怎么看?

圣洁吸烟的人,那些是有史以来最冗长的解决方案! 我错过了什么吗? 我必须。 以下是我的解决方案,我错过了什么?

压缩版:

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