jQuery:prop vs attr ...澄清

请注意,这不是.prop()与.attr();的重复。 这个问题提到了prop vs attr的基本功能,而这个问题是特定于他们作为制定者的差异。

在试图缩小应该使用.prop()设置的内容时,与创建新元素时通过.attr()设置的内容相比,在使用jQuery 1.7.2进行测试时,我发现该道具快大约2.5倍,所以这似乎是优选的。

我可以找到的唯一使用attr设置的事件列表给attr:

accesskey,align,background,bgcolor,class,contenteditable,contextmenu,data-XXXX,draggable,height,hidden,id,item,itemprop,拼写检查,样式,主题,tabindex,标题,valign,width

  • 这是否完整(即,不在该列表中的任何内容 - 例如min,max,step等 - 应该使用prop)?
  • 在测试中,当使用道具设置时,其中一些看起来工作正常。 测试上面的列表,我没有问题使用prop设置以下内容:

    id,class,align,contenteditable,draggable,hidden,spellcheck,tabindex,title

  • 有没有什么理由,对于“用attr设置的东西,在使用prop设置时仍然可以工作”的列表,为什么它仍然应该用attr设置? 如果没有,那么当创建一个基本的<div id="foo" class="bar" draggable="true" title="zipzap">时,性能提高250%...... :)


  • 我无法在网上找到任何完整列表。 每个给出任何类型列表的人都会复制jQuery 1.6博客文章中给出的部分列表。 关于#3,Starx在他的评论中提到了这个答案。 http://timmywillison.com/通过体面的讨论进入更好的细节。 MDN和W3C规范还提到,有些属性的接口可以将它们设置为属性(https://developer.mozilla.org/en/DOM/element),尽管MDN并未实际列出那些是。 MDN确实提到使用属性接口作为setter比使用getAttribute更脆弱:

    “尽管这些接口通常由大多数HTML和XML元素共享,但DOM HTML规范中列出的特定对象有更多专用接口,但请注意,这些HTML接口”仅适用于[HTML 4.01]和[XHTML 1.0]文档,并且不保证能够与任何未来版本的XHTML一起工作。“HTML 5草案确实表示它旨在与这些HTML界面向后兼容,但他们称他们”某些以前不推荐使用,支持不佳,很少使用或考虑过的功能不必要的“已被删除。”通过完全转移到DOM XML属性方法(如getAttribute()),可以避免潜在的冲突。“

    不过,现在假设Firefox和Chrome中呈现的任何HTML5 doctype页面已经处于“已弃用,支持不良”等界面已被删除的环境中,这似乎是安全的。

    因此,我已经使用布尔值,字符串值和整型值对每个HTML元素类型测试了每个属性以及jQuery博客中提到的非属性属性。

    使用1.7.2和1.8pre,无论你调用.prop()还是attr(),jQuery都会在内部总是实际使用.prop,用于:

    async, autofocus, autoplay, checked, controls, defer, disabled, hidden, loop,
    multiple, open, readonly, required, scoped, selected
    

    对于HTML元素(这里不考虑窗口,文档等),除非使用.attr(),否则jQuery不会设置以下任何属性:

    accept-charset, accesskey, bgcolor, buffered, codebase, contextmenu, datetime,
    default, dirname, dropzone, form, http-equiv, icon, ismap, itemprop, kind, 
    language, list, location, manifest, nodeName, nodeType, novalidate, pubdate, 
    radiogroup, seamless, selectedIndex, sizes, srclang, style, tagName
    

    最后,jQuery将使用.prop()或.attr()设置以下属性列表。 在上面的第一个列表中,无论您使用.attr()还是.prop(),jQuery始终使用.prop()。 对于这个列表中的属性,jQuery使用你使用的任何东西。 如果你使用.prop(),jQuery使用.prop(),反之亦然。 无论哪种情况,结果都是一样的。 因此,忽略任何潜在的语义考虑,就prop()比.attr()快2.5倍而言,jQuery 1.6.1博客文章表明使用.attr(),但可以使用.prop() ,性能显着提高:

    accept, action, align, alt, autocomplete, border, challenge, charset, cite, 
    class, code, color, cols, colspan, contenteditable, coords, data, defaultValue, 
    dir, draggable, enctype, for, headers, height, hidden, high, href, hreflang, 
    id, keytype, label, lang, low, max, maxlength, media, method, min, name, 
    optimum, pattern, ping, placeholder, poster, preload, readonly, rel, required, 
    reversed, rows, rowspan, sandbox, scope, shape, size, span, spellcheck, src, 
    srcdoc, start, step, summary, tabindex, target, title, type, usemap, value, 
    width, wrap
    

    试着用简单的术语理解这一点。

    .attr()给出了一个元素的属性。 它在页面上加载时的属性。

    .prop()给出元素的属性,

  • 这可以是一个元素的状态,就像复选框一样,它可以被选中或不被选中。
  • 或者,它可以是一个元素的修改属性,因为它是默认状态。
  • 这个问题有你需要知道的所有差异。 通常,在使用DOM操作部分时,您需要属性而不是属性。 TJ的答案确实清除了这个概念。

    链接地址: http://www.djcxy.com/p/27529.html

    上一篇: jQuery: prop vs attr... clarification

    下一篇: attributes vs properties