.prop()与.attr()


2296

因此jQuery 1.6具有新功能prop()

$(selector).click(function(){
    //instead of:
    this.getAttribute('style');
    //do i use:
    $(this).prop('style');
    //or:
    $(this).attr('style');
})

还是在这种情况下他们做同样的事情?

如果我确实必须切换到using prop()attr()那么如果我切换到1.6 ,所有旧呼叫都会中断?

更新

selector = '#id'

$(selector).click(function() {
    //instead of:
    var getAtt = this.getAttribute('style');
    //do i use:
    var thisProp = $(this).prop('style');
    //or:
    var thisAttr = $(this).attr('style');

    console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>

(另请参见此提琴:http : //jsfiddle.net/maniator/JpUF2/

控制台将记录getAttribute为字符串,将记录attr为字符串,但是将记录propCSSStyleDeclaration,为什么?将来如何影响我的编码?


17
这将是明确的兴趣:books.google.ca/...

28
@Neal,因为此更改超越了jQuery。HTML属性和DOM属性之间的差异很大。

7
这让我难过,看到jQuery的恢复的变化。他们朝着错误的方向前进。

4
@尼尔 是的,这只会使问题进一步复杂化,而不是将两种方法分开。

6
@BritishDeveloper的答案比简单地说总是使用x或y更为复杂,因为它取决于您打算获得的内容。您需要属性还是属性?他们是两个截然不同的东西。
凯文B

Answers:


1874

2012年11月1日更新

我的原始答案专门适用于jQuery 1.6。我的建议保持不变,但jQuery 1.6.1进行了些微更改:面对预料之中的一堆破损网站,jQuery团队恢复attr()为接近(但不完全相同)布尔属性的旧行为。约翰·雷西格(John Resig)也对此发表了博客。我可以看到他们所遇到的困难,但仍然不同意他的推荐attr()

原始答案

如果您只使用过jQuery,而没有直接使用过DOM,那么这可能是一个令人困惑的更改,尽管从概念上来说绝对是一种改进。对于使用jQuery的成千上万的网站来说,效果不是很好,但是由于此更改,这些网站将中断。

我将总结主要问题:

  • 您通常想要prop()而不是attr()
  • 在大多数情况下,prop()照常attr()做。通常,attr()可以prop()在代码中替换对的调用。
  • 属性通常比属性更容易处理。属性值只能是字符串,而属性可以是任何类型。例如,该checked属性是布尔值,该style属性是一个对象,每种样式都有各自的属性,该size属性是一个数字。
  • 当一个属性和一个具有相同名称的属性同时存在时,通常更新一个属性会更新另一个属性,但是对于某些输入属性(例如value和)则不是这种情况checked:对于这些属性,属性始终表示当前状态,而属性(旧版本的IE中除外)对应于输入的默认值/检查性(反映在defaultValue/ defaultChecked属性中)。
  • 这项更改消除了固定在属性和属性前面的jQuery魔术层,这意味着jQuery开发人员将不得不学习一些有关属性和属性之间差异的知识。这是一件好事。

如果您是jQuery开发人员,并且对整个业务都对属性和属性感到困惑,那么您需要退后一步,并对其有所了解,因为jQuery不再那么努力地使您远离这些东西。对于有关该主题的权威性但有些措手不及的单词,有以下规范:DOM4HTML DOMDOM Level 2DOM Level 3。Mozilla的DOM文档对大多数现代浏览器均有效,并且比规范更易于阅读,因此您可能会发现其DOM参考有用。关于元素属性的一

作为如何比属性更容易处理属性的示例,考虑一个最初选中的复选框。这是有效的HTML可能有两个片段:

<input id="cb" type="checkbox" checked>
<input id="cb" type="checkbox" checked="checked">

那么,如何确定jQuery是否选中了该复选框?查看堆栈溢出,通常会发现以下建议:

  • if ( $("#cb").attr("checked") === true ) {...}
  • if ( $("#cb").attr("checked") == "checked" ) {...}
  • if ( $("#cb").is(":checked") ) {...}

这实际上是世界上最简单的与checkedBoolean属性有关的事情,自1995年以来,该属性在每个主要的可编写脚本的浏览器中都已经存在并且可以完美地工作:

if (document.getElementById("cb").checked) {...}

该属性还会使选中或取消选中复选框变得很简单:

document.getElementById("cb").checked = false

在jQuery 1.6中,这无疑变成了

$("#cb").prop("checked", false)

使用该checked属性编写复选框脚本的想法是无益且不必要的。该属性是您所需要的。

  • 目前尚不清楚使用该checked属性检查或取消选中复选框的正确方法是什么
  • 该属性值反映的是默认值,而不是当前的可见状态(某些IE的较旧版本除外,因此使操作更加困难)。该属性不会告诉您是否已选中页面上的复选框。参见http://jsfiddle.net/VktA6/49/

2
@TJCrowder,那是哪一个?
Naftali aka Neal,

9
@Neal:如果您想知道DOM元素具有哪些属性以及属性如何播种其值,请掌握以下链接:DOM2 HTML规范DOM2规范和DOM3规范。在每种情况下的指标是优秀的,你链接直接的财产,在那里它的价值来自于等的详尽描述
TJ克罗德

4
@Neal:是什么使它与众不同:信息的来源和性质。value例如,看蒂姆的例子。调用一个函数attr来检索属性 value而不是属性“值”的意义不大(它们可以不同)。展望未来,attr做属性和prop做属性将更加清晰,尽管过渡对于某些人而言将是痛苦的。不要以这种错误的方式来做,没有什么比退后一步并阅读规范来了解什么是属性。
TJ Crowder

54
@Neal:DOM元素是一个对象。就像任何其他编程对象一样,属性是该对象的属性。其中一些道具从标记中的属性获取初始值,这些初始值也存储在DOM对象的单独属性映射中。在大多数情况下,编写道具只会更改道具,尽管遗憾的是,有些道具会将所有更改写入底层属性(value例如),但让我们尽量忽略它。您有99%的时间想要使用道具。如果您需要使用实际属性,您可能会知道。
TJ Crowder

4
@Tim:“ 在现代浏览器中,value更改输入的属性不会改变其value属性”,我认为它并没有这样做,这就是为什么我开始将其用作示例,但是当我开始编写示例时,该死如果未在Chrome,Firefox,Opera,IE ...上进行更新-jsbin.com/ahire4原来是因为我在input[type="button"]实验中使用。这更新一个属性input[type="text"]- jsbin.com/ahire4/2约费解通话!不只是元素,还有元素的类型 ……
TJ Crowder

664

我认为蒂姆说得很好,但让我们退后一步:

DOM元素是对象,是内存中的东西。像OOP中的大多数对象一样,它具有properties。它还分别具有在元素上定义的属性的映射(通常来自浏览器为创建元素而读取的标记)。有些元素的属性得到他们最初从值属性具有相同或相似名称(value从“值”属性获取其初始值; href从“href”属性获取其初始值,但它不是完全一样的值; className从“类别”属性)。其他属性以其他方式获取其初始值:例如,该parentNode属性根据其父元素是什么来获取其值;style 属性,无论是否具有“样式”属性。

让我们考虑以下页面中的锚点http://example.com/testing.html

<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>

一些免费的ASCII艺术(并遗漏了很多东西):

+----------------+
| HTMLAnchorElement |
+----------------+
| href:“ http://example.com/foo.html” |
| 名称:“ fooAnchor” |
| id:“ fooAnchor” |
| className:“测试一个” |
| 属性:
| href:“ foo.html” |
| 名称:“ fooAnchor” |
| id:“ fooAnchor” |
| 类:“测试一个”
+----------------+

请注意,属性和属性是不同的。

现在,尽管它们是截然不同的,但是由于所有这些都是进化而来的,而不是从头开始设计的,因此,如果您设置了它们,则许多属性会写回到它们派生的属性上。但是,并非所有事情都如此,正如您从href上面可以看到的那样,映射并不总是直接的“传递值”,有时涉及到解释。

当我说属性是对象的属性时,我并不是在抽象地说。这是一些非jQuery代码:

var link = document.getElementById('fooAnchor');
alert(link.href);                 // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"

(这些值与大多数浏览器相同;存在一些差异。)

link物体是一个真实的东西,你可以看到有访问之间的真正的区别属性就可以了,和访问的属性

正如Tim所说,在绝大多数情况下,我们希望与物业合作。部分原因是它们的值(甚至是它们的名称)在浏览器之间趋于一致。我们大多只想在没有与之相关的属性(自定义属性)时使用属性,或者当我们知道该特定属性的属性和属性不是1:1时(如href上述和“ href”一样) 。

在各种DOM规范中列出了标准属性:

这些规范具有出色的索引,我建议您随时保持指向它们的链接;我一直都在用它们。

自定义属性包括,例如,data-xyz您可以放置​​在元素上以向代码提供元数据的任何属性(现在,只要您坚持使用data-前缀,该属性从HTML5开始就有效)。(最新版本的jQuery使您可以data-xyz通过data函数访问元素,但该函数不仅data-xyz属性的访问器[它所做的更多和更少];除非您确实需要其功能,否则我将使用该attr函数进行交互带有data-xyz属性。)

attr函数以前在获取他们认为想要的东西时有一些复杂的逻辑,而不是从字面上获取属性。它混淆了这些概念。移至propattr打算取消合并它们。简而言之,在v1.6.0中,jQuery在这方面走得太远了,但是很快又增加了功能,attr以处理人们attr在技​​术上应该使用的常见情况prop


哇。这个新的1.6.1更新确实使该问题一点点消失了。(但不多)但该链接现在基本上可以解决了
Naftali aka Neal

它并没有为我消除它,我只是使用jquery1.7修复了我在设置.attr('class','bla')的地方出现的错误,而在.prop('className','bla' )工作
PandaWood 2012年

@PandaWood:.attr('class', 'bla')工作在预期我1.7.01.7.11.7.2在Chrome 17,Firefox的11,11歌剧,IE6,IE8,IE9和Safari 5
TJ克罗德

谢谢,在我的情况下一定有一些特定的东西,让我检查一下并返回一个测试用例。但是,如我们现在所拥有的那样,将代码更改为“ prop / className”,而不是“ attr”,这为我们解决了一个巨大的错误,该错误在我们从jquery1.4移至1.7时出现-在所有浏览器上
PandaWood

3
@TJCrowder回复:.data-它会读取属性的默认值(如果存在),但是如果您对其进行写入,它将更改元素的隐藏属性,而不更新该属性。
Alnitak

250

对于jQuery来说,这种变化已经很长时间了。多年来,他们一直对名为的函数感到满意,该函数attr()主要检索DOM属性,而不是您期望从该名称获得的结果。的隔离attr()prop()应有助于缓解一些HTML之间的属性和DOM属性的混乱。$.fn.prop()获取指定的DOM属性,而$.fn.attr()获取指定的HTML属性。

为了完全理解它们的工作原理,这是对HTML属性和DOM属性之间区别的扩展解释:

HTML属性

句法:

<body onload="foo()">

目的: 允许标记具有与之相关联的数据,以用于事件,渲染和其他目的。

可视化: HTML属性 类属性显示在此处。可通过以下代码进行访问:

var attr;
attr = document.body.getAttribute("class");
//IE 8 Quirks and below
attr = document.body.getAttribute("className");

属性以字符串形式返回,并且在浏览器之间可能不一致。但是,它们在某些情况下可能至关重要。如上所示,IE 8 Quirks模式(及以下版本)期望get / set / removeAttribute中的DOM属性名称而不是属性名称。这是了解差异很重要的众多原因之一。

DOM属性

句法:

document.body.onload = foo;

目的: 允许访问属于元素节点的属性。这些属性类似于属性,但是只能通过JavaScript访问。这是一个重要的区别,有助于阐明DOM属性的作用。请注意,属性与properties完全不同,因为此事件处理程序分配是无用的,并且不会接收该事件(主体没有onload事件,只有onload属性)。

可视化: DOM属性

在这里,您会注意到Firebug中“ DOM”选项卡下的属性列表。这些是DOM属性。您会立即注意到其中的很多,因为您在不知不觉中就已经使用过它们。它们的值就是您将通过JavaScript收到的值。

文献资料

HTML: <textarea id="test" value="foo"></textarea>

JavaScript: alert($('#test').attr('value'));

在早期版本的jQuery中,这将返回一个空字符串。在1.6中,它将返回适当的值foo

不用看任何一个函数的新代码,我可以自信地说,混淆更多是与HTML属性和DOM属性之间的差异有关,而不是与代码本身有关。希望这可以为您解决一些问题。

-马特


7
$.prop()获取DOM属性,$.attr()获取HTML属性。我正在尝试从心理上弥合差距,以便您可以了解两者之间的区别。

10
男孩,我现在也很困惑。那么$('#test').prop('value')不返回任何东西吗?也不.attr('checked')需要复选框吗?但这曾经吗?现在您必须将其更改为prop('checked')?我不了解这种区分的必要性-为什么区分HTML属性和DOM属性为何很重要?导致此更改“长期存在”的常见用例是什么?什么是与抽象两者之间的区别了,因为它似乎像他们的使用情况大多重叠?
BlueRaja-Danny Pflughoeft

5
@BlueRaja:因为这两个概念之间存在严重的根本差异,因此,如果像过去使用jQuery一样将其刷在地毯下,则会导致意外失败。value是最明显的情况之一,因为value属性将为您提供字段的当前值,但是value属性将为您提供在value="..."属性中声明的原始值,该值实际上是defaultValue属性。(尽管这个特殊情况再次被IE <9中的错误所困扰。)
bobince 2011年

4
@BlueRaja:答案更加复杂。:-) attr('value', ...)在jQuery <1.6中进行设置会设置属性,因此当前值会更改,而默认值不会更改。在1.6中,它设置了属性,因此理论上默认值会更改,而当前值不会更改。但是,浏览器在准确设置value属性方面存在不一致的地方。在IE中,它也会设置当前值。在某些浏览器中,仅在之前尚未设置当前值时才设置当前值。[哭泣]
bobince 2011年

1
就像@Quentin所说的那样,“属性由HTML定义。属性由DOM定义。” 我读过的最简单的版本。
艾伦·董

240

属性在DOM中;HTML中的一个属性被解析为DOM。

更多细节

如果更改属性,则更改将反映在DOM中(有时使用不同的名称)。

示例:更改class标签的属性将更改classNameDOM中该标签的属性。如果标签上没有属性,则仍然具有带有空值或默认值的相应DOM属性。

示例:虽然标签没有class属性,但是DOM属性className确实存在,并且具有空字符串值。

编辑

如果更改一个,则另一个将由控制器更改,反之亦然。该控制器不在jQuery中,而是在浏览器的本机代码中。


那么这是否意味着最好更新属性,因为这样就可以确保属性和属性都被更新并且对齐?
路加福音

1
@Luke DOM是内部技术表示,即模型。HTML属性是外部表示形式,即视图。如果更改一个,则另一个将由控制器更改,反之亦然。
yunzen 2013年

@HerrSerker因此,它们都通过控制器保持同步吗?我认为这只是在jQuery的attr和prop方法之内?这是对您的提琴的修改,我将在其中进行更多研究-jsfiddle.net/v8wRy-到目前为止,它们似乎是等效的。
路加福音

3
“如果更改一个,则另一个将由控制器更改,反之亦然。此控制器不在jQuery中,而是在浏览器的本机代码中。” 对于大多数属性/属性,情况并非如此。对于大多数人来说,它只是单向转换,其中属性确定相应属性的初始值。前两个答案详细说明了这一点。
ᴠɪɴᴄᴇɴᴛ

@Vincent。我看不到,前两个答案说的与我的答案相反。当然,大多数属性是相应DOM属性的初始值。但是他们是相互依存的。jQuery('p').prop('className', 'foo');在Chrome控制台中尝试类似的操作,您将看到每个段落的thg class属性如何'foo'。当然不在源代码中,源代码来自服务器。这是一个常数。
yunzen 2015年

140

只是HTML属性和DOM对象之间的区别引起了混乱。对于那些愿意使用DOM元素等原生属性的人this.src this.value this.checked.prop非常欢迎该家庭。对于其他人,这只是增加了一层混乱。让我们澄清一下。

最简单的方法,看看之间的区别.attr,并.prop为下面的例子:

<input blah="hello">
  1. $('input').attr('blah')'hello'按预期返回。这里没有惊奇。
  2. $('input').prop('blah'):返回undefined-因为它正在尝试执行[HTMLInputElement].blah-并且该DOM对象上不存在此类属性。它仅在范围内作为该元素的属性存在,即[HTMLInputElement].getAttribute('blah')

现在,我们进行如下更改:

$('input').attr('blah', 'apple');
$('input').prop('blah', 'pear');
  1. $('input').attr('blah'):返回'apple'??为什么不将“梨”设置为该元素的最后一个。因为属性是在输入属性上更改的,而不是DOM输入元素本身的更改-它们基本上几乎彼此独立地工作。
  2. $('input').prop('blah'):返回 'pear'

出于上述原因,您真正需要注意的事情是不要在整个应用程序中同一属性混用这些用法

看到说明不同的小提琴: http : //jsfiddle.net/garreh/uLQXc/


.attrvs .prop

第一轮:风格

<input style="font:arial;"/>
  • .attr('style') -返回匹配元素的内联样式,即 "font:arial;"
  • .prop('style') -返回样式声明对象,即 CSSStyleDeclaration

第二回合:价值

<input value="hello" type="text"/>   

$('input').prop('value', 'i changed the value');
  • .attr('value')-返回'hello'*
  • .prop('value') -退货 'i changed the value'

*注意:出于这个原因,jQuery有一个.val()方法,该方法在内部等效于.prop('value')


@Neal,因为它可以更好地引用jquery函数的结构。“ $('input')。prop('blah'):返回未定义-因为它正在尝试执行[HTMLInputElement] .blah-并且该DOM对象上不存在此类属性。它仅在范围中作为属性存在该元素的即[HTMLInputElement] .getAttribute( '等等')”
UGURGümüşhan

2
似乎与doc.jquery.com/prop的文档不同:“ .prop()方法应用于设置为禁用和检查状态,而不是.attr()方法。.val()方法应用于获取和设定值。”
天鹅

53

TL; DR

使用prop()attr()在大多数情况下。

属性是输入元件的当前状态。一个属性是默认值。

一个属性可以包含不同类型的事物。属性只能包含字符串


1
如果可能的话,请附上一些简单的例子,并说明使用的时间prop() and when to go for attr()。等待答案:)

36

脏检查

这个概念提供了一个可以观察到差异的示例:http : //www.w3.org/TR/html5/forms.html#concept-input-checked-dirty

试试看:

  • 单击按钮。两个复选框都被选中。
  • 取消选中两个复选框。
  • 再次单击该按钮。仅prop选中该复选框。砰!

$('button').on('click', function() {
  $('#attr').attr('checked', 'checked')
  $('#prop').prop('checked', true)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>attr <input id="attr" type="checkbox"></label>
<label>prop <input id="prop" type="checkbox"></label>
<button type="button">Set checked attr and prop.</button>

对于诸如disabledon的某些属性button,添加或删除content属性disabled="disabled"始终会切换属性(在HTML5中称为IDL属性),因为http://www.w3.org/TR/html5/forms.html#attr-fe-disabled表示:

禁用的IDL属性必须反映禁用的内容属性。

因此尽管它很丑陋,因为它不需要修改HTML,但您可能会摆脱它。

对于诸如checked="checked"on的其他属性input type="checkbox",事情会中断,因为一旦单击它,它就会变脏,然后添加或删除checked="checked"content属性将不再切换检查状态

这就是为什么您应该主要使用的原因.prop,因为它直接影响有效属性,而不是依赖于修改HTML的复杂副作用。


为了完整起见,还可以尝试以下变体:1)在单击按钮之前,选中然后取消选中第一个复选框2)(为此,您需要更改代码段)给第一个输入一个checked属性:checked="checked"
ᴠɪɴᴄᴇɴᴛ

33

全部都在文档中

属性和属性之间的差异在特定情况下可能很重要。在jQuery 1.6之前,.attr()方法在检索某些属性时有时会考虑属性值,这可能会导致行为不一致。从jQuery 1.6开始,.prop()方法提供了一种显式检索属性值的方法,而.attr()则检索属性。

所以使用道具!


2
所以这意味着当我切换到1.6时,很多东西都会坏掉?
Naftali又名Neal,

不,这只是一个不一致的行为,如果以前可以运行,它将始终与jQuery 1.6一起使用,只是该道具更安全;)
Arnaud F.

6
我似乎记得。$.attr()我大部分时间都在检索属性,而不是“有时”。今天,由它引起的混乱仍在回荡。可悲的是,我很难找到关于HTML属性和DOM属性的权威性读物,所以我可能会在这里写一个答案。

3
@Arnaud -f不正确。现在,所有使用attr('checked')复选框的1.6之前的代码都将被破坏。
CaptSaltyJack 2011年

3
@Matt McDonald:什么样的“ ...难以在HTML属性和DOM属性上找到明确的阅读...”是什么意思?属性(反映的和其他的)在DOM2 HTML规范中进行了描述;您可能还需要参考DOM2DOM3规范。
TJ Crowder

28

属性位于HTML 文本文档/文件中(==想象这是您对html标记进行解析的结果),而
属性位于HTML DOM树中(==基本上是JS意义上某个对象的实际属性)。

重要的是,其中许多同步(如果更新class属性,则classhtml中的属性也将更新;否则)。但是某些属性可能会同步到意外的属性-例如,attribute checked对应于property defaultChecked,因此

  • 手动选中一个复选框将更改.prop('checked')值,但不会更改.attr('checked').prop('defaultChecked')
  • 设置$('#input').prop('defaultChecked', true)也会更改.attr('checked'),但是在元素上不可见。

经验法则是.prop()方法应用于布尔属性/属性以及html中不存在的属性(例如window.location)。所有其他属性(您可以在html中看到的属性)都可以并且应该继续使用该.attr() 方法进行操作。(http://blog.jquery.com/2011/05/10/jquery-1-6-1-rc-1-released/

这是一张表格,显示了.prop()首选位置(即使.attr()仍然可以使用)。

首选用法的表


在正式建议使用后者的情况下,为什么有时要使用.prop()而不是.attr()?

  1. .prop()可以返回任何类型-字符串,整数,布尔值;而.attr()总是返回一个字符串。
  2. .prop()据说比快2.5倍.attr()

事情已经改变了,像这样的:$('#myImageId').prop('src', 'http://example.com/img.png')var class = $('.myDivClass').prop('class')$('#myTextBox').prop('type', 'button')。依此类推...

@沃尔夫先生,对不起,我没明白你的意思。有什么“改变”?语法一直都是这样。
lakesare 2015年

我认为您的答案中的表格是不必要的。因为.prop()对所有属性都适用。您不想在.prop()列中标记所有属性,是吗?

@沃尔夫先生,我认为这是有必要的,因为正如已经说过的那样,它“显示出.prop()首选位置(即使.attr()仍然可以使用)”
lakesare

我通常使用.attr()事件定义什么.prop()。像这样:$('.myDiv').attr('onclick', 'alert("Hello world!")')。如果您将更.attr()改为.prop(),则将无法使用。总体来说,我认为没有理由使用.attr()来设置或获取的值id/class/href/checked/src.....。请注意,我并不是说您错了。

20

.attr()

  • 获取匹配元素集中第一个元素的属性值。
  • 给您元素的值,就像在页面加载时在html中定义的那样

.prop()

  • 获取匹配元素集中第一个元素的属性值。
  • 给出通过javascript / jquery修改的元素的更新值

13

通常,您需要使用属性。仅将属性用于:

  1. 获取自定义HTML属性(因为它未与DOM属性同步)。
  2. 获取与DOM属性不同步的HTML属性,例如,获取标准HTML属性的“原始值”,例如 <input value="abc">.

7

attributes -> HTML

properties -> DOM


8
我知道您想说什么,但是HTML是一种标记语言,而DOM是一种用HTML创建的表示形式。DOMElement同时具有属性属性
t.niese 2014年

@ t.niese,attirbutes也是NkS 的财产之一DOM
2014年

简短的答案很简单。
纳比·卡兹

6

在jQuery 1.6之前,该attr()方法有时在检索属性时考虑属性值,这会导致行为不一致。

prop()方法的引入提供了一种在检索属性的同时显式检索属性值的方法.attr()

文件:

jQuery.attr() 获取匹配元素集中第一个元素的属性值。

jQuery.prop() 获取匹配元素集中第一个元素的属性值。


3

轻轻提醒使用prop(),例如:

if ($("#checkbox1").prop('checked')) {
    isDelete = 1;
} else {
    isDelete = 0;
}

上面的函数用于检查是否选中了checkbox1,如果选中,则返回1;否则,返回0。如果不是,则返回0。函数prop()在此处用作GET函数。

if ($("#checkbox1").prop('checked', true)) {
    isDelete = 1;
} else {
    isDelete = 0;
}

上面的函数用于将checkbox1设置为选中状态,并始终返回1。现在将函数prop()用作SET函数。

别搞砸了

P / S:当我检查Image src属性时。如果src为空,则prop返回页面的当前URL(错误),而attr返回空字符串(右)。


您在此示例中错了:<img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">。它应该可以工作并返回图像位置。


0

1)属性在DOM中;HTML中的一个属性被解析为DOM。

2)$(elem).attr(“ checked”)(1.6.1+)“ checked”(String)将随着复选框状态而变化

3)$(elem).attr(“ checked”)(1.6之前)true(布尔值)更改为复选框状态

  • 通常,我们要用于DOM对象,而不要使用像这样的自定义属性data-img, data-xyz

  • 也有一些区别的访问时checkbox价值hrefattr()prop()作为东西变化与DOM输出, prop()从完整链接originBoolean为复选框值 (pre-1.6)

  • 我们只能与prop其他元素一起访问DOM元素undefined


0

在prop()与attr()中没有更多注意事项:

  • 应该检索selectedIndex,tagName,nodeName,nodeType,ownerDocument,defaultChecked和defaultSelected..etc并使用.prop()方法进行设置。这些没有相应的属性,而仅仅是属性。

  • 对于输入类型复选框

       .attr('checked') //returns  checked
       .prop('checked') //returns  true
       .is(':checked') //returns true
  • prop方法返回布尔值,用于检查,选择,禁用,readOnly..etc等,而attr返回定义的字符串。因此,您可以在if条件中直接使用.prop('checked')。

  • .attr()在内部调用.prop(),因此.attr()方法比通过.prop()直接访问它们要慢一些。


-2

如果代码是以这种方式编写的,那么Gary Hole答案对于解决问题非常相关

obj.prop("style","border:1px red solid;")

由于prop函数返回CSSStyleDeclaration对象,因此上述代码在某些浏览器中无法正常工作(IE8 with Chrome Frame Plugin在我的情况下已通过测试)。

因此将其更改为以下代码

obj.prop("style").cssText = "border:1px red solid;"

解决了问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.