.prop()VS .val()。使用jQuery设置输入文本值

阅读(有趣的) .prop()vs .attr()和jQuery Performance:属性怀疑在我的脑海中出现了什么更好用:.prop()或.val()? 我想设置一个输入文本值。

jQuery .prop()页面说了以下内容:

属性通常会影响DOM元素的动态状态,而不会更改序列化的HTML属性。 示例包括输入元素的value属性,输入和按钮的disabled属性或复选框的checked属性。 应该使用.prop()方法来设置disabled和checked而不是.attr()方法。 应该使用.val()方法来获取和设置值

但是关于性能.prop()似乎比.val()设置值更好: .prop()vs .attr()vs .val()

所以我没有答案。 我该做什么?

$('#element').prop('value', 'Example'); 

要么

 $('#element').val('Example'); 

EDIT1: .prop()总是优于.val() 在此处输入图像描述在此处输入图像描述在此处输入图像描述

编辑2:我现在尝试获取一个值 ,也.prop()更快 在此处输入图像描述

EDIT3:正如@BeatAlex所说,如果我们想要性能本机js 非常快

 var x = document.getElementById('element').value; 

在此处输入图像描述

正如你们中的一些人说它可能会更快,但如果存在.val(),我们就会使用它。

PS:当我写这篇文章时,当前的jQuery版本是1.11或2.1

你想使用val() 。 这就是函数的用途,特别是对于输入的值。

编写起来也更快,更容易理解,使用val ,如果需要,可以多次更改值。

你的图表说

越高越好

val()更高。

另外,就像你已经引用的那样,

应该使用.val()方法来获取和设置值。

这意味着除非您正在处理禁用的属性,否则请使用:

 $('input').val(); 

另外作为旁注,运行测试后发布的链接显示val()prop()更快。

既然你喜欢展示一些图形和图片,我将添加一些:

取自此链接

纯JS更好

如果你在争论超速,纯粹的JS会更好。

伙计,你无法将道具val进行比较,这没有任何意义!

val旨在设置/获取当前所选节点的属性“value”。 这是您用例所需的唯一方法。 (我想设置输入文本值)。

当然,您可以使用attr(’value’)prop(’value’)来解决val ,但为什么要制作样板代码呢?

你似乎对道具的设计感到困惑。 那么让我解释一下。

prop旨在解决从所选DOM节点检索类布尔属性的问题。 应将其与attr方法进行比较,而不是val

考虑以下四种情况

     
  • 您将永远不会使用val()获取输入的状态选中/取消选中
  • 如果使用attr(’checked’)检索它,则不确定控件的已检查状态是什么。 这会给你一个字符串。
  • 如果在if语句中使用attr(’checked’)的结果,则可能会出现误报,例如if(’false’)

始终将检查状态从控件中取出的唯一方法是使用prop方法。

因此,如果您想进行真正的比较,请将其与attr进行比较,而不是与val进行比较

您的图表表明prop() val()在性能方面优于val()

val()可以在内部使用prop()的相同逻辑以及一些额外的代码语句来完成实际操作(例如:设置值), val()附加代码可能导致性能低于prop()

使用val()来设置一个元素的值可能就是这个函数的意思,这通常会优先使用特定于操作的函数而不是使用generics函数。

在你的情况下,如果你不想在性能上稍微变化,那么请使用prop()本身。

其他答案很好地解释了主要的差异与一个例外。

由于jQuery“规范化”浏览器差异,因此val()会删除回车符。

这会影响IE 8及更低版本中的 textareas。

示例:对于textarea输入

 HEL


 LO

.val()为您提供字符串"HEL\n\nLO" ,长度为7

.prop("value")为您提供长度为9的字符串"HEL\r\n\r\nLO"

这不是性能问题,它们实际上是针对完全不同的东西而制作的。 jQuery似乎决定处理“超出规范”的用例,可能是有充分理由的。

  • attr()用于访问元素的HTML属性。 更可能是页面加载时的初始值。 它虽然已经被attr()的写版本或任何其他属性操作函数所改变
  • prop()是在解析并显示元素之后访问元素的DOM属性。
  • val()用于访问表单元素值。

使用prop()时还有一个bug。 在IE 11下,以下代码不会设置值:

 var props = {'value':'test', 'type':'radio'}; var input = $('').prop(props); $(document.body).append(input);