为什么jQuery 1.9+ attr()方法不被弃用?

我可以,一个jQuery1.9 +软件开发人员,在我的日常工作中“弃用” attr()方法的使用吗?


如许多问题所示,

  • .prop()vs .attr() (main)
  • jQuery attr vs. prop,有一个道具列表?
  • jQuery attr vs prop?
  • 将jQuery 1.8.3迁移到1.9.0 – 替换已弃用的.attr()
  • ……等……

关于“使用attr或使用道具?”存在很多困惑 ,并且,根据我的(开发人员)观点,对于attr()方法的所有用法,我们可以使用prop代替:

  1. 向后兼容性 :编写新软件不需要这个;
  2. 性能 : John说 “通过.attr()方法访问属性比直接通过.prop()访问它们要慢一些”;
  3. 更改属性值 :all可以通过prop(name,newvalue)方法更改。
  4. 删除属性 :all可以通过removeProp(name)方法删除。
  5. 检查HTML属性值 :浏览器使用DOM,所有HTML都转换为DOM,如果DOM影响了attr(name)方法也受到影响。 关于prop的“强类型”:它比“html string value”(例如“checked”vs true )更好。
  6. 检查是否在“HTML原始代码”中定义了属性 (假设浏览器中的方法attr返回undefined,如果不是)…嗯,我们需要在某个软件中使用它吗? 在表单中 ,“。val()方法是建议的jQuery方式来获取或设置表单的值”
  7. 跨浏览器一致性 :两者(不仅仅是attr)都是一致的方法。 (它是??)。

所以,在这个时候(2013年),我没有看到在开发新的jQuery代码时使用attr方法的充分理由……但是,换句话说,这就是问题: 使用attr方法有充分的理由在我的日常任务中?

.attr()不被弃用,因为它对它的用途很有用 ,并且是唯一正确的方法来做它所做的事情(没有使用每个元素的getAttribute函数,它做同样的事情……或者你自己解析HTML )。 我们甚至讨论这个问题的唯一原因是因为jQuery(以及一些旧的浏览器( 咳嗽 IE 咳嗽 ))错误地混淆了属性和属性,并且混淆是他们在1.9中明显修复的内容。

.attr()检索属性 ,而.prop()检索属性 。 这两者是不同的东西,并且总是正式的(虽然DOM通常具有对应于属性的属性)。 如果你有

,那么whatever浏览器识别出whatever属性,你都可以使用.attr()来获取属性的值。 .prop()甚至无法在大多数浏览器中看到它。

当您关心生成的DOM 属性时 ,请使用.prop() 。 如果您关心实际的HTML 属性 ,请使用.attr() 。 这不是一个或两件事; 你可以在同一个代码中使用它们,宇宙也不会内爆一次(假设你已经正确地使用它们了)。 :)只需使用适合你当时正在做的工作的那个,并退出尝试“弃用”未破坏的东西。

我冒昧地为你准备一个小提琴:

http://jsfiddle.net/5REVP/

特别是这部分:

 
console.log("style"); var styleAttr = $("#example").attr("style"); console.log(styleAttr); // You get "padding:10px" var styleProp = $("#example").prop("style"); console.log(styleProp); // You get a CSSStyleDeclaration object

“样式”示例清楚地显示属性与属性不同(检查控制台)。

为了可读性,可维护性和向后(以及向前)兼容性,您应该始终对给定任务使用正确的方法,否则方法可能会像您一样停止行为,.attr()方法是例子。

.attr()方法用于获取元素的属性,属性是一个SGML术语,指的是元素标签内包含的信息,您可以通过检查元素轻松读取该信息。

  • 如果获得元素的“style”属性,除了在该属性中专门编写的内容之外,您将不会获得任何其他信息。
  • 如果您获得复选框的“已选中”属性,您将获得“已选中”或“”。

.prop()方法用于获取元素的DOM属性。

  • 如果你得到“style”属性,你没有得到设计师在style属性中写的内容,那么你将获得该元素的所有实际css属性。
  • 如果您获得复选框的“已选中”属性,则会得到真或假。

.attr()只访问HTML属性,而.prop()将检索不在HTML元素上的属性。 查看文档:

例如,应检索selectedIndex,tagName,nodeName,nodeType,ownerDocument,defaultChecked和defaultSelected,并使用.prop()方法进行设置。 在jQuery 1.6之前,这些属性可以使用.attr()方法检索,但这不在attr的范围内。 它们没有相应的属性,只是属性。

http://api.jquery.com/prop/

我的作业……在阅读了@cHao和@cernunnos的好解释之后,经过几个月的使用后…我还需要另一个概念来决定,作为程序员,在使用或不使用prop和attr时:

  • HTML源代码及其表示:浏览器在浏览器的内存空间中加载HTML页面。 那么,留在内存浏览器中的是DOM表示,但是DOM保留了一些原始的东西,作为属性和cssText属性 ,它们是“有时持久化的表示”。
    PS:未在“标准DOM”中定义的属性没有到DOM属性的映射。 当一个(非只读) 属性发生更改时,如果存在相应的(映射) 属性 ,则可以自动更改。

  • DOM状态 :动态页面需要直接在DOM上进行更改,这是最终用户看到的。 因此,如果页面上有一些“点击和更改”操作,那么每次DOM进入新页面表示时,每次DOM都有一个新状态 。
    当一个DOM- 属性发生更改时,所有其他DOM 属性 (如果需要)都会一致地更改。

考虑到这些概念,我们可以得出“ 经验法则 (对于attr vs prop用途)”:

  1. 使用prop ,你有90%的机会它可以工作……如果你使用jQuery 改变DOM状态 (和标准DOM假设),则有99%。
  2. 如果需要更改或访问data-*属性,请使用.data()方法。
  3. 否则(非DOM,非数据或非标准事物)检查是否使用.attr() ,并保留一些时间来研究它(参见上面的答案)。