如何将新版jQuery代码转换为旧版?求适配jQuery 1.4.1的代码改造方案
嘿,我来帮你搞定这个jQuery 1.4.1兼容的问题,顺便给你总结下新版转旧版的通用思路~
针对你的代码的修改方案
首先,原代码里用了$(document).on(),但jQuery 1.4.1还没推出这个方法(它是1.7版本才加入的),所以得换成当时支持的事件委托写法。另外,原代码的value拼接没加引号,容易在value含特殊字符时出错,我一起帮你优化了:
修改后的兼容代码(完整保留原逻辑)
$(document).delegate("select", "change", function(){ $("option[value='" + this.value + "']", this) .attr("selected", true) .siblings() .removeAttr("selected"); });
更简洁的等效写法(兼容1.4.1)
其实select元素的val()方法在1.4.1里已经支持直接设置选中项,效果和原代码完全一致,代码更简洁:
$(document).delegate("select", "change", function(){ $(this).val(this.value); });
为什么这么改?
- 把
$(document).on(事件, 选择器, 函数)换成了$(document).delegate(选择器, 事件, 函数):这是1.7之前jQuery官方推荐的事件委托写法,和on()的委托逻辑一致,只是参数顺序调换了。 - 给
value加了单引号:避免当option的value包含空格、引号等特殊字符时,选择器解析出错。
新版jQuery转旧版(如1.4.x)的通用方法
下面是我整理的一些核心转换规则,帮你应对大部分版本兼容场景:
- 事件绑定类
- 事件委托:新版
$(父元素).on(事件名, 子元素选择器, 处理函数)→ 旧版用$(父元素).delegate(子元素选择器, 事件名, 处理函数);如果是全局委托到document,也可以用$(子元素选择器).live(事件名, 处理函数),但delegate()性能更好。 - 直接绑定:新版
$(元素).on(事件名, 处理函数)→ 旧版用$(元素).bind(事件名, 处理函数)。
- 事件委托:新版
- 属性操作类
- 1.6版本才推出
.prop()方法,1.4.x里只能用.attr()来操作所有属性(包括checked、selected这类状态属性)。比如新版$("input").prop("checked", true)→ 旧版$("input").attr("checked", true)。 - 注意:旧版
.attr()获取状态属性时返回的是字符串(比如"checked"),不是布尔值,判断的时候要调整写法,比如用if ($(elem).attr("checked"))而不是if ($(elem).prop("checked"))。
- 1.6版本才推出
- 选择器类
- 一些CSS3高级选择器(比如
:nth-child()、:placeholder-shown)在旧版jQuery里支持有限,建议用jQuery原生的筛选方法替代,比如$("div").eq(1)代替$("div:nth-child(2)")(注意eq()是从0开始计数)。
- 一些CSS3高级选择器(比如
- AJAX类
- 1.5版本才引入Promise式的
.done()、.fail()回调,1.4.x里只能用$.ajax()的success、error参数。比如新版$.get(url).done(func).fail(errFunc)→ 旧版$.ajax({url: url, success: func, error: errFunc})。
- 1.5版本才引入Promise式的
- 工具方法类
- 一些新工具方法(比如
$.proxy()是1.4才加入的),如果你的版本比这个还旧,可能需要手动实现类似功能;不过1.4.1已经支持$.each()、$.trim()、$.parseJSON()这些常用方法,不用额外处理。
- 一些新工具方法(比如
内容的提问来源于stack exchange,提问作者user13120736
相关产品推荐
相关产品推荐

