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

Pet*_*uss 28 jquery deprecated prop attr

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


如许多问题所示,

关于"使用attr或使用prop?"有很多困惑.,并且,根据我的(开发人员)观点,对于attr()方法的所有用途,我们可以使用prop:

  1. 向后兼容:编写新软件不需要这个;
  2. 性能:John说 "通过.attr()方法访问属性比直接通过.prop()访问它们要慢一些";
  3. 更改属性值:可以通过该prop(name,newvalue)方法更改所有.
  4. 删除属性:所有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年),我没有看到attr在开发新的jQuery代码时使用方法的一个很好的理由 ......但是,换句话说,这就是问题:我有充分的理由attr在我的方法中使用 方法日常任务?

cHa*_*Hao 30

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

.attr()检索属性,同时.prop()检索属性.这两者是不同的东西,并且总是正式的(虽然DOM通常具有对应于属性的属性).如果您有a <p whatever="value">,whatever浏览器识别的属性不在哪里,您将使用.attr()获取属性的值. .prop()甚至在大多数浏览器中都看不到它.

当您关心生成的DOM 属性时,请使用.prop().如果您关心实际的HTML 属性,请使用.attr().这不是一个或两件事; 你可以在同一个代码中使用它们,宇宙也不会内爆一次(假设你已经正确使用它们了).:)只要使用此找到适合你的时候做这项工作的人,并退出试图"贬低"的东西,不破.

  • 例如:`<span data-foo ="bar"data-whatsit ="xyz">`如果你使用`attr("data-foo")`,你会回到"bar".如果你使用`prop`,你就不会,你得到`undefined`.你*可以*使用`data`,但这会让jQuery为你的`span`创建一个数据对象,并用元素上的所有`data-*`属性预先填充它,如果你想要的话,这是不必要的把`data-foo`作为一次性的. (7认同)
  • @PeterKrauss:如果你愿意,也可以避免使用`for`循环.关键是,你为什么要这样做?它没有任何意义.使用正确的工具完成工作.如果您正在获取*属性*,请使用`attr`. (5认同)
  • @Nanne:如果你愿意,你可以自由发表这样的答案.对于一个人来说,我认为它只是错误的,有*很好的理由.如果您正在访问*属性*,请使用`attr`.不是边缘情况,一个常见的情况. (4认同)
  • @PeterKrauss:*不是全部*.浏览器不支持的任何内容都不会具有关联的属性.任何不标准的东西......同样的事情.等等. (2认同)
  • @Nanne主要的例子 - 非标准/自定义属性 - 不是一个边缘情况,它是大多数人编写JavaScript将要(或应该)经常使用的东西,所以我会说它绝对属于"日常使用". (2认同)

cer*_*nos 12

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

http://jsfiddle.net/5REVP/

特别是这部分:

<div id="example" style="padding:10px"></div>

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 如果你得到的"风格"属性,你没有得到什么设计师在款式属性中写道,你所得到的所有元素的实际CSS属性.
  • 如果您获得复选框的"已选中"属性,则会得到真或假.

  • +1(`style`是一个非常好的例子!)挑剔@FrédéricHamidi的挑剔:从HTML5开始,[HTML不再是SGML应用程序](http://www.w3.org/TR/html5 /syntax.html#parsing):*"某些早期版本的HTML ...基于SGML并使用了SGML解析规则.但是,很少(如果有的话)Web浏览器曾经为HTML文档实现了真正的SGML解析......结果混淆......已经浪费了数十年的生产力.这个版本的HTML因此返回到非SGML基础."*虽然挑剔*我自己*,但这并不意味着我们不是在讨论SGML意义上的属性.:-) (3认同)

Pet*_*uss 0

我的作业...阅读了 @cHao 和 @cernunnos 很好的解释,并使用了几个月后...我想我们需要另一个概念来决定,作为程序员,何时使用 prop 和 attr:

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

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

考虑到这些概念,我们可以得出一个“经验法则(用于attrprop使用)”:

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

  • 有点离题,但为什么如果这个答案是已接受的答案,它不在其他答案之上呢?通常,即使其他答案有更多票数,已接受的答案也会排在第一位......这是最后一个! (2认同)