San*_*ath 4 jquery upgrade backwards-compatibility
我从jquery 1.3.2升级到1.6.4,发现现有代码中的一些东西不起作用 -
禁用某些东西 -
$(selector).attr("disabled","");
检查是否选中了单选按钮 -
if($(selector).attr('checked'))
我检查了版本发行的向后不兼容1.4,1.5和1.6,发现只有问题#2提及,但上述问题#1没有明确提及.所以我担心问题#1,我可以发现现有代码的更多问题.我想我在http://blog.jquery.com/2011/05/03/jquery-16-released/的 "数据属性的案例映射"部分中遗漏了一些内容.有人可以解释一下吗.
来源 - 从jQuery 1.3.2升级到jQuery 1.5(或1.4)
更新
我仍然有点困惑适当替换attr用prop.我读过.prop()vs .attr()和其他一些问题.到目前为止,无论我在哪里阅读,它都说在大多数情况下我需要这样做.但那是少数案件呢?有人可以提供一些代码示例或情况吗?如何在现有代码中找到此类案例?我还阅读了 /sf/answers/423998571/,其中提到 -
你真正需要注意的事情就是不要在整个应用程序中混用这些属性用于同一属性
我是否需要更换attr,以prop在现在工作的罚款这种线的情况下?
$(selector).attr("id")
Run Code Online (Sandbox Code Playgroud)
更新#2
假设在我现有的代码中,我有以下几行(我猜这会直接影响UI小部件的行为或状态),但是目前没有检查是否检查了该元素 -
就在那里
$(selector).attr("checked","checked"); //setting
Run Code Online (Sandbox Code Playgroud)
但这不存在
if($(selector).attr("checked")) //checking
Run Code Online (Sandbox Code Playgroud)
我应该还是更换attr,以prop在设置代码,即使设定现在的工作?
更新#3
是否有一些地方可以获得某种属性列表,这些属性直接影响UI小部件的某些属性?我仍然有困惑决定将attr替换为prop的属性.这个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>
Run Code Online (Sandbox Code Playgroud)
使用jquery 1.3.2,以下返回实际的输入计数 -
$("#60table INPUT[type='checkbox']").length
Run Code Online (Sandbox Code Playgroud)
但是,现在使用jquery 1.6.4,上面返回0(注意输入的位置类似于#60table> div>输入,而不是直接在#60table下).我必须做 $("#60table").find("INPUT[type='checkbox']").length正确的号码.
由于这个原因,下面的现有代码停止升级后的工作,虽然我更换了attr有prop-
$("#60table INPUT[type='checkbox']").attr('checked', $("#60").attr("checked")); //I replaced the attr by prop here
Run Code Online (Sandbox Code Playgroud)
因此,我仍然遇到新问题,升级后旧代码不再有效.
投入赏金
因为 -
元素选择器逻辑不再起作用 - 我不确定是否可能有更多代码无效.以Update 4为例,当输入的位置#60table > div > input为时,选择是不正确的$("#60table INPUT[type='checkbox']").如果是这样,我的项目中可能存在其他一些可能已经破裂的常见错误.
更好地解释所有用prop替换attr的地方 -我需要更明确地区分何时使用prop而不是attr,以及更多示例.根据乔恩的回答 -
如果它直接影响UI小部件的行为或状态,则使用prop; 否则使用attr.
我在哪里可以获得某种属性列表,这些属性直接影响UI小部件的某些属性
这个问题与数据属性的案例映射无关,这仅仅是由于属性/属性API的演变:
在过去,jQuery没有在属性和属性之间划清界限.通常,DOM属性表示从文档中检索的DOM信息的状态,例如标记中的value属性.DOM属性表示文档的动态状态; 例如,如果用户单击上面的输入元素并键入def,则.prop("value")为abcdef,但.attr("value")仍为abc.
在大多数情况下,浏览器将属性值视为属性的起始值,但是诸如checked或disabled之类的布尔属性具有异常语义.
至于缺少其他相关的重大变化,应该足以搜索您的代码以便适当地使用attr和替换prop; 考虑attr到大部分时间都倾向于使用,通常应该替换大多数呼叫.
更新:让我们适当地定义.
关键思想是元素具有HTML 属性:<input name="foo" disabled>具有属性id和disabled; id有价值,disabled有没有.其中一个属性直接影响UI窗口小部件的属性,浏览器呈现该属性以表示此元素(在桌面应用程序控件的意义上,输入框被禁用).所以经验法则是:
如果它直接影响UI小部件的行为或状态使用
prop; 否则使用attr.
在你提到的例子中,id是一个抽象的数量,不直接影响任何元素的行为或状态; 因此你应该继续使用attr它.
更新2:
即使设置现在正在工作,我仍然应该在设置代码中将attr替换为prop吗?
是的,你应该因为jQuery的文档这么说.正如你在前面提到的那样,混合prop并attr导致有问题的行为.
更新3:
是否有一些地方可以获得某种属性列表,这些属性直接影响UI小部件的某些属性?我仍然有困惑决定将attr替换为prop的属性.
并不是的.这里适用的经验法则是,如果某个东西是布尔值,那么prop很可能是访问它的正确方法.
更新4:
看起来,在这两个版本(1.3.2到1.6.4)之间,jquery使元素选择更加严格.
实际上Sizzle负责解析选择器中的匹配元素(jQuery内置Sizzle).我不知道改变行为会导致什么样的变化,但罪魁祸首是以id数字开头的.这不是有效的HTML 4.01,但由于某种原因,它在Sizzle中也有所不同.解决方法很简单:不要id用数字开始.
您发现的其他解决方法(将选择器分解为两个并使用.find)是有效的,因为在选择器是表单的特殊情况下#id,jQuery 直接调用 getElementById而不是调用Sizzle.
| 归档时间: |
|
| 查看次数: |
1591 次 |
| 最近记录: |