当前位置: 首页 > 面试题库 >

jQuery数据与Attr?

水昊阳
2023-03-14
问题内容

使用之间$.data$.attr使用时的用法有什么区别data-someAttribute

我的理解是$.data存储在jQuery的内部$.cache,而不是DOM。因此,如果要$.cache用于数据存储,则应使用$.data。如果要添加HTML5数据属性,则应使用$.attr("data-attribute", "myCoolValue")


问题答案:

如果要将数据从服务器传递到DOM元素,则应在该元素上设置数据:

<a id="foo" data-foo="bar" href="#">foo!</a>

然后可以.data()在jQuery中使用访问数据:

console.log( $('#foo').data('foo') );
//outputs "bar"

但是,当您使用数据在jQuery中的DOM节点上存储数据时,变量将存储在node 对象上。这是为了容纳复杂的对象和引用,因为将数据存储在节点元素上作为属性将仅容纳字符串值。

从上面继续我的示例:

$('#foo').data('foo', 'baz');

console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed

console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object

同样,数据属性的命名约定也有一些隐藏的“陷阱”:

HTML:

<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>

JS:

console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd

连字符的键仍然可以使用:

HTML:

<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"

但是,返回的对象.data()将没有设置连字符的键:

$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work

因此,我建议避免在javascript中使用连字符键。

对于HTML,请继续使用连字符形式。HTML属性应该得到ASCII-小写自动,所以<div data-foobar></div><DIV DATA-FOOBAR></DIV><dIv DaTa-FoObAr></DiV>被认为被视为是相同的,但最好的相容性下壳体形式应是优选的。

.data()如果该值匹配可识别的模式,则该方法还将执行一些基本的自动广播:

HTML:

<a id="foo"
    href="#"
    data-str="bar"
    data-bool="true"
    data-num="15"
    data-json='{"fizz":["buzz"]}'>foo!</a>

JS:

$('#foo').data('str');  //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num');  //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`

这种自动广播功能对于实例化小部件和插件非常方便:

$('.widget').each(function () {
    $(this).widget($(this).data());
    //-or-
    $(this).widget($(this).data('widget'));
});

如果您绝对必须具有原始值作为字符串,则需要使用.attr():

HTML:

<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>

JS:

$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers

$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6

这是一个人为的例子。为了存储颜色值,我曾经使用数字十六进制表示法(即0xABC123),但值得注意的是,在1.7.2之前的jQuery版本中无法正确解析十六进制,并且Number从jQuery 1.8 rc 1起不再将其解析为a 。

jQuery 1.8 rc 1更改了自动广播的行为。之前,任何有效表示a的格式Number都将转换为Number。现在,只有数值表示形式保持不变时,才会自动广播数值。最好用一个例子来说明。

HTML:

<a id="foo"
    href="#"
    data-int="1000"
    data-decimal="1000.00"
    data-scientific="1e3"
    data-hex="0x03e8">foo!</a>

JS:

                              // pre 1.8    post 1.8
$('#foo').data('int');        //    1000        1000
$('#foo').data('decimal');    //    1000   "1000.00"
$('#foo').data('scientific'); //    1000       "1e3"
$('#foo').data('hex');        //    1000     "0x03e8"

如果计划使用其他数字语法访问数字值,请确保将值强制转换为Number第一个值,例如使用一元运算+符。

JS(续):

+$('#foo').data('hex'); // 1000


 类似资料:
  • 问题内容: 我对JQuery相当陌生,也许想尝试一些对初学者来说可能有点难的事情。但是,我试图创建一个自动完成功能,该功能将当前值发送到PHP脚本,然后返回必要的值。 这是我的Javascript代码 这是“ myscript.php”的后半部分 产生以下输出 谁能告诉我我要去哪里错了?开始变得很沮丧。输入框只是变成“白色”,没有显示任何选项。如果我指定一个值数组,该代码可以正常工作。 更新 我已

  • pre { white-space: pre-wrap; } jQuery EasyUI 插件 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目的是为了减少开发时间,且不要求开发人员具

  • pre { white-space: pre-wrap; } jQuery EasyUI 插件 通过 $.fn.tree.defaults 重写默认的 defaults。 树(tree)在网页中以树形结构显示分层数据。它向用户提供展开、折叠、拖拽、编辑和异步加载功能。 依赖 draggable droppable 用法 树(tree)定义在 <ul> 元素中。该标记可定义叶节点和子节点。节点将是

  • 数据与数据结构 1. 数据 1.1 数据(data) 数据:是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 1.2 数据大致分的两类:(1)数值性数据;(2)非数值数据 数值性数据:主要包括整数、浮点数、复数、双精度数等,主要用于工程和科学计算,以及商业事务处理。 非数值数据:主要包括字符和字符串,以及文字、图形、图像、语音等数据。 1.3

  • 问题内容: 假设我有一个页面,该页面会随着时间的流逝缓慢地返回一堆数据。例如,例如: 我想显示所有数据,因此它将“实时”更新。就像这样,一旦发送了一行数据,它将允许我解析并显示数据吗? 有没有办法通过jQuery做到这一点?抱歉,以前是否有人问过这个问题 谢谢你的时间!:) 问题答案: 当然,建立一个基本的彗星风格的长轮询非常简单: PHP: JavaScript:

  • 问题内容: 我有此代码(如下)。 我正在使用它将数据传递到Web服务,但是问题是其中是否有任何字符(,/?:@&= + $#)。我放入了一个很好的encodeURIComponent,然后在Web服务中再次将它们放回去。 我要问的是,是否有更好的方法可以做到这一点?我每次都要对字符串进行编码,然后才能通过,这似乎有点疯狂。 谢谢 问题答案: 该Web服务属于您还是您使用其他人的Web服务?Web服