jQuery升级,.attr和.prop - 从1.2.6到1.9.1

5
我正在尝试升级公司内大量网站的jQuery版本,从非常老旧的版本(1.2.6,1.4.3)升级到最新版本(1.9.1)。情况还算顺利——迁移脚本完成了大部分工作,尽管这只针对1.6.4到1.9.1的版本升级,我认为我已经处理了大部分需要更改的内容。
不过我遇到了几个问题,其中主要问题是从 .attr() 更改为 .prop()——因为我们所有的代码都使用 .attr(),如果我们只是改用.prop(),就会有一些代码出错,特别是一些用于在商店中筛选产品的链接——这些链接会在被点击时调用AJAX请求并进行其他处理。
我最初的“修复”(非常夸张的修复)是基于简单地将一种方法的调用重定向到另一种方法:
$.fn.attr = $.fn.prop;

我相信这会引入一系列的 bug,尽管它修复了最初的错误。从那时起,我只发现了一个进一步的由此引起的 bug(目前为止),即它会导致 href 属性(可能是以 # 开头的锚点)返回完整的标准化 URL - http://jsfiddle.net/eT6xE/1/

<a href="#something"><span>Product Details</span></a>
<div></div>

$('div').append( $('a').attr('href') );
$('div').append( '<br />' + $('a').prop('href') );
// #something  \n  http://fiddle.jshell.net/eT6xE/1/show/#something

考虑到这是我注意到的唯一错误,我进行了一些尝试,并想出了一个解决方法 - http://jsfiddle.net/M92CE/1/ - 似乎可以重新引入原始功能。虽然这似乎是href属性/prop问题的相当干净的解决方案,但我不禁觉得最初的修复...离它应该有多远。
是否有任何“标准”方法可以重新引入此功能?如果没有,是否有更好的方法来实现它?
干杯。

我会采用类似的方式来重写函数,但不仅仅是从旧代码到新代码的简单赋值。我会创建一个特定的函数:委托给新函数、处理任何行为变化,并且还会抛出某种过时警告(例如使用控制台),以便客户端代码可以摆脱旧的方法。 - Matt Whipple
1个回答

5
jQuery 1.9移除了在先前版本中已被弃用的许多旧功能。从jQuery 1.2升级到1.9时,您几乎肯定会遇到很多问题,就像您发现的那样。
幸运的是,jQuery 1.9有一个名为jQuery Migrate的附属库,用于向后兼容旧版本,它重新添加了所有在1.9中删除的旧版弃用功能。
如果要使用最新的jQuery版本使旧代码重新运行,请使用jQuery Migrate使其正常工作。
但是,请记住,Migrate库的目的是帮助您过渡到新功能,而不是让您的代码停留在过去。因此,请使用Migrate使代码正常工作,但然后您需要开始考虑更改代码,以便您不再需要Migrate。
根据您拥有的代码量,可能需要做很多工作,但是有Migrate可以让您逐个进行这些更改,而不必一次性修复所有东西。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接