2012-04-17 65 views
4

我从jQuery的1.3.2升级到1.6.4,并发现了一些东西,在现有的代码不工作 -.attr()相关的东西在jquery升级1.3.2之后停止工作到1.6.4,还有什么可以打破的?

  1. 禁用的东西 -

    $(selector).attr("disabled","");

  2. 察看单选按钮是否检查 -

    if($(selector).attr('checked'))

我检查了版本发行版1.4,1.51.6的向后不兼容性,发现只提到了问题#2,但未提及上述问题#1。所以我担心,像问题#1,我可以找到更多的问题与我现有的代码。我想我错过了http://blog.jquery.com/2011/05/03/jquery-16-released/的“数据属性的案例映射”部分。请有人解释一下。

来源 - Upgrading from jQuery 1.3.2 to jQuery 1.5 (or 1.4)

更新

我还与适当prop更换attr有点困惑。我已阅读.prop() vs .attr()和其他一些问题。我到目前为止所阅读的任何地方,在大多数情况下,我都需要这样做。但是哪些是少数情况呢?有人可以提供一些代码示例或情况吗?我如何在现有的代码中找到这种情况?它提到我也看过https://stackoverflow.com/a/6057122/351903说 -

你真的需要小心的就是不整个应用程序

待办事项混合相同属性 使用的这些事情我现在需要将attr替换为prop,以防这些线路工作正常吗?

$(selector).attr("id") 

更新#2
假设在我现有的代码,我有一个像下面几行(我猜直接影响到UI控件的行为或状态),但目前还没有检查,看是否该元素被选中与否 -

这是有

$(selector).attr("checked","checked"); //setting 

但是,这是不是有

if($(selector).attr("checked")) //checking 

即使现在设置正在工作,我还应该在设置代码中将attr更换为prop吗?

更新#3
有没有从那里我能得到某种属性的列表,它直接影响到UI控件的某些属性的一些地方?我仍然困惑于决定用什么属性来替换属性。是否有其他人对这个jQuery版本感到相同,或者我只有一个:D?

更新#4
看起来,在这两个版本之间的某处(1.3.2至1.6.4),jQuery的制作元素的选择更加严格。

详细
在模块中,有以下HTML -

<div id="60table"> 
    <div> 
     <input type="CHECKBOX" id="60_1" value="1" name="data[reportsInfo][Campaign][2752]"> 
     <label for="60_1">23 apr new campaign 1</label> 
    </div> 
    <div> 
     <input type="CHECKBOX" id="60_2" value="1" name="data[reportsInfo][Campaign][2753]"> 
     <label for="60_2">23 apr new campaign 2</label> 
    </div> 
    <div> 
     <input type="CHECKBOX" id="60_3" value="1" name="data[reportsInfo][Campaign][2707]"> 
     <label for="60_3">2nd camp added</label> 
    </div> 
</div> 

与jQuery 1.3.2,下面回到投入的实际计数 -

$("#60table INPUT[type='checkbox']").length 

但是,现在与jQuery 1.6.4,上述返回0(请注意,输入的位置像#60table> div>输入,不直接在#60table下)。我必须做$("#60table").find("INPUT[type='checkbox']").length才能得到正确的号码。

由于这个原因,下面的现有代码停止升级后的工作,虽然我更换了attrprop - 在旧的代码后,没有更多的工作

$("#60table INPUT[type='checkbox']").attr('checked', $("#60").attr("checked")); //I replaced the attr by prop here 

所以,我仍然得到新问题升级。

把赏金
因为 -

  • 元素选择逻辑没有更多的工作 -我不知道是否有可能是有些不工作更加规范。以更新4为例,当输入的位置是#60table > div > input时,选择$("#60table INPUT[type='checkbox']")这样的选择是不正确的。如果是这样,那么我的项目中可能存在的其他一些常见错误可能已经打破。

  • 更好地解释所有替换属性与prop -我需要更清楚地区分何时使用prop替代attr,以及更多示例。按照乔恩的答案 -

如果它直接影响到UI控件使用 道具的行为或状态;否则使用attr。

我在哪里可以得到某种属性的列表的直接影响UI部件

+1

你应该用'.prop(“checked”,true)'替换'.attr(“checked”,“checked”)''。我不确定你的意思是“即使检查正在工作”。 – Jon 2012-04-17 09:15:17

+0

对不起,我的意思是说即使设置正在工作 – 2012-04-17 09:19:53

回答

9

的问题是不相关的数据的情况下,映射属性在所有的某些属性,它只是由于属性/属性API的演变:

过去,jQuery并没有在 属性和属性之间绘制清晰的线条。通常,DOM属性表示从文档中检索到的DOM信息的状态,例如标记中的 值属性。 DOM 属性表示文档的动态状态;例如,如果用户点击上面的输入元素并键入def .prop(“value”)为abcdef,但.attr(“value”)仍为abc。

在大多数情况下,浏览器将属性值作为该属性的初始值 ,但作为托运或 禁用有异常语义布尔属性等。

至于失踪等相关重大的变动,这应该足以搜索你的代码为attr用途和使用prop适当更换;鉴于attr在大多数情况下倾向于使用,大多数呼叫通常应该被替换。

更新:让我们定义适当

的核心思想是,元素具有HTML 属性<input name="foo" disabled>具有的属性iddisabled; id有一个值,而disabled没有。其中一个属性直接影响UI小部件的一个属性,即浏览器呈现以表示此元素(从桌面应用程序控件的意义上说,输入框已禁用)。所以经验法则是:

如果它直接影响到UI控件使用prop的行为或状态;否则使用attr

在你提到的例子中,id是一个抽象数量,它不直接影响任何元素的行为或状态;因此您应该继续使用attr

更新2:

我应该还是更换ATTR在设置代码来支撑,即使 设置现在的工作?

是的,你应该因为jQuery的文档是这么说的。正如您在问题中提到的那样,混合propattr可能会导致问题行为。

更新3:

有没有从那里我能得到某种 属性的列表,它直接影响到UI控件的某些属性的一些地方?我是 仍然有混淆决定哪些属性取代attr prop。

不是。这里适用的经验法则是,如果某件事是布尔值,那么prop很可能是访问它的正确方法。

更新4:

看起来,在这两个版本(1.3.2至1.6.4 ),jQuery的制造元件选择用更严格的介于两者之间。

它实际上是Sizzle,它负责解析匹配元素从选择器(jQuery comes with Sizzle built-in)。我不知道变化的行为会有什么变化,但罪魁祸首是你的数字开头的idThis is not valid HTML 4.01,但由于某种原因,它也会在Sizzle中发挥作用。解决方法很简单:不要用数字开始id

,你发现了(两个分手的选择和使用.find)的其他解决方法是有效的,因为在选择的形式#id的特殊情况下,jQuery的directly callsgetElementById,而不是调用灒。

+0

感谢您的答案。请阅读我的问题中的**更新**部分。 – 2012-04-17 08:22:31

+0

@SandeepanNath:更新了答案,看看。 – Jon 2012-04-17 09:00:16

+0

再次感谢。最后一个问题,现在我认为可能是一个愚蠢的问题。请检查**更新#2 **。 – 2012-04-17 09:08:26

1

要回答你的更新#4:

ID属性should not start with digits

之所以$('#60table')作品是因为里面多数民众赞成优化为document.getElementById('#60table')通常工作在浏览器中,抗议下:)

的jQuery但是,当您开始使用组合表达式(例如$('#60table input[...]'))时,Sizzle引擎会运行,这会对其查询使用更严格的规则。

希望有所帮助。

相关问题