js、jquery的属性操作方法总结

目录

  • 属性分为三种:
  • js原生属性操作方法
    • 获取属性
    • 设置属性
    • 删除属性
    • 自定义数据属性 dataset
      • 获得自定义属性的值
      • 设置自定义属性的值
      • 删除自定义属性
      • 判断是否有此属性
      • dataset的问题
        • 兼容问题
        • 值类型问题
    • dataset与attribute的比较
  • jquery属性方法操作
    • 获取和设置属性 attr()
      • 获取属性
      • 设置属性
    • 删除属性 removeAttr()
    • 获取和设置特性 prop()
      • 获取属性
      • 设置属性
    • 删除属性 removeProp()
    • 特别说明(prop必看)
      • 输出比较表(未完)
    • 获取和设置自定义属性 data()
      • 获取自定义属性
      • 设置自定义属性
        • 设置单个属性值
        • 设置多个属性值
    • 删除自定义属性 removeData()
  • 总结
    • 取属性出来有没有被强制转化为字符串
    • 没有此属性,返回值是什么?
    • attr()与data()
    • 元素集(未完)
    • attr的input中的checked属性问题

属性分为三种:

  1. html标签特性,例如普通的class,input中的name等
  2. 用户自定义属性,div中设置的cmd、time属性等
  3. 用户自定义data-属性,这个是DOMStringMap的一个实例。区别于上面的。

js原生属性操作方法

  • 获取属性 getAttribute()
  • 设置属性 setAttribute()
  • 删除属性 removeArrtibute()
  • 自定义数据属性 dataset
  • dataset与attribute的比较
<div id="example"></div>

获取属性

方法

domObj.getAttribute(attribute);

  • dom元素调用方法
  • 参数是属性名
  • 该方法是js原生方法去获得DOM属性值
  • 返回的值不管之前是什么,都返回string字符串格式

栗子

    var domObj = document.getElementById("example");
    var id = domObj.getAttribute("id");  //"example"
    typeof id //"string"

设置属性

方法

domObj.setAttribute(attribute,value);

  • dom元素调用方法
  • 参数1是属性名
  • 参数2是设置的值
  • 如果有此属性,直接更改覆盖原属性值
  • 如果无此属性,创建属性,并设置属性值

栗子

    var domObj = document.getElementById("example");
    domObj.getAttribute("title");  //null  不存在属性便会返回null
    domObj.setAttribute("title","good");
    domObj.getAttribute("title"); //"good"

删除属性

方法

domObj.removeAttribute(attribute);

  • dom元素调用方法
  • 参数1是属性名
  • 如果传多个参数或者不传参数会报错,只能一个属性一个属性的删除

栗子

    var domObj = document.getElementById("example");
    domObj.removeAttribute("class");
    domObj.getAttribute("class"); //null

自定义数据属性 dataset

HTML5新增的用户自定义属性,并规定形式为"data-",目的是为元素提供与渲染无关的信息,或者提供语义信息。 很多时候,我们会把一些信息定义到dom元素中,以供使用。
形式如下:

<div class="add" data-id="12" data-type-name="normal"></div>

而定义了自定义属性之后,可以通过元素的dataset属性来访问自定义属性的值,也可以进行设置。

dataset属性的值是DOMStringMap的一个实例,其中有映射关系,

规则如下:

  • data-name在dataset对象中属性是name。
  • data-id-name在dataset对象中属性是idName
  • data自定义属性设置之后还是会==返回string字符串格式==

获得自定义属性的值

var example = document.getElementById("example");
var id = example.dataset.id;  //12
var type = example.dataset.typeName;  //normal

设置自定义属性的值

var example = document.getElementById("example");
example.dataset.id = 12345;  //12345
example.dataset.typeName = 'special';  //special

删除自定义属性

var example = document.getElementById("example");
//删除属性和值
delete example.dataset.typeName;   //true
example.dataset.typeName   //undefined
//只删除值
example.dataset.typeName = "";

判断是否有此属性

var example = document.getElementById("example");
if(example.dataset.id){
    alert("hello");
}

dataset的问题

1. 兼容问题
兼容问题

一些浏览器如IE11-,andriod 2.3-,ios10-是没有dataset这个对象的,所以如果要兼容低版本的浏览器,需要加上兼容代码:

if(example.dataset){
    example.dataset.idName='12';
}else{
    example.setAttribute('data-id-name','12');
}
2. 值类型问题

dataset和attribute设置的数值就算是true、123、[1,2,3],在读取的时候仍然是==字符串类型==

var example = document.getElementById("example");

example.dataset.idName = 123;
typeof example.dataset.idName;  //"string"

example.dataset.idName = true;
typeof example.dataset.idName; //"string"

example.setAttribute("time",123456);
example.setAttribute("ok",true);

typeof example.getAttribute("time"); //"string"
typeof example.getAttribute("ok"); //"string"

dataset与attribute的比较

  • dataset在运行速度上面没有attribute快,但是就其数量时间几乎可以忽略不计,而他可以让我们省去很多attribute带来的麻烦,具有较强的可读性,尤其在添加一些不可见的数据以便进行其他处理,使用自定义属性比较好。但是如果需要兼容低版本,dataset是有兼容问题的。
  • dataset设置的属性,getAttribute是可以访问的,:
example.dataset.idName = 'hello';
example.getAttribute("data-id-name"); //"hello"

jquery属性方法操作

  • 获取和设置属性 attr()
  • 删除属性 removeAttr()
  • 获取和设置特性 prop()
  • 删除特性 removeProp()
  • 获取和设置自定义属性 data()

获取和设置属性 attr()

获取属性

方法

$div.attr(attribute);

  • 传一个参数是获取元素属性的值
  • 参数是“属性名”
  • 用attr获取的属性值,无论设置的时候是什么,都返回string字符串类型

栗子

var $div = $("#example");
var titleValue = $div.attr("title"); //获取title属性值
//如果读取的是data-属性
var dataTitleValue = $div.attr("data-title"); //获取data-title属性值

设置属性

方法

设置单个属性值

$div.attr(attribute,value);

  • 传两个参数是设置元素属性的值
  • 参数1是要设置的属性名
  • 参数2是要设置的属性值

设置多个属性值

$div.attr({attribute1:value,attribute2:value});

  • 传一个json对象,里面的属性分别是键/值

栗子

var $div = $("#example");
$div.attr({"title":"good","time":10,"ok",false});
var titleValue = $div.attr("title");
//"good"
typeof titleValue;
//"string"
var timeValue = $div.attr("time");
//"10"
typeof timeValue;
//"string"
var okValue = $div.attr("ok");
//"false"
typeof okValue;
//"string"


//设置data-属性值
var dataTitleValue = $div.attr("data-title","ohhh");
//"ohhh"

删除属性 removeAttr()

方法1

$div.removeAttr(attribute);

  • 传一个参数是删除特定属性
  • 参数是“属性名”

方法2

$div.removeAttr(attribute1 attribute2);

  • 传一个参数并用空格隔开可以删除多个属性
  • 参数是“属性名1 属性名2 ...”

栗子

var $div = $("#example");
//<div id="example" data-title="hello" title="good" class="add"></div>

//if:
$div.removeAttr("title");
//<div id="example" data-title="hello" class="add"></div>
var titleValue = $div.attr("title");
//undefined

//else if
$div.removeAttr("title class");
//<div id="example" data-title="hello"></div>

//删除自定义属性值
$div.removeAttr("data-title");
//<div id="example"></div>

与attr("title","")的区别

removeAttr("title")是删除整个“title”属性,而attr("title","")是删除“title”属性的值:

//<div id="example" title="hello"></div>
removeAttr("title");
//<div id="example"></div>
attr("title","")
//<div id="example" title></div>

获取和设置特性 prop()

获取属性

方法

$div.prop(property);

  • 传一个参数是获取元素属性的值
  • 参数是“属性名”
  • 用attr获取的属性值,无论设置的时候是什么,都==返回string字符串类型==

栗子

var $div = $("#example");
var titleValue = $div.prop("title"); //获取title属性值

设置属性

方法

设置单个属性值

$div.prop(property,value);

  • 传两个参数是设置元素属性的值
  • 参数1是要设置的属性名
  • 参数2是要设置的属性值

设置多个属性值 (zepto不支持)

$div.prop({property1:value1,property2:value2});

  • 传一个json对象,里面的属性分别是键/值

栗子

var $div = $("#example");
$div.prop("title","good");
var titleValue = $div.prop("title");
//"good"

删除属性 removeProp()

方法1

$div.removeProp(property);

  • 传一个参数是删除特定属性
  • 参数是“属性名”
  • 删除之后此属性值为undefined;

栗子

var $div = $("#example");
$div.removeProp("title");
var titleValue = $div.prop("title");
//"undefined"

特别说明(prop必看)

prop()方法主要针对于html的固有属性,所以就会有在读取属性值的时候,很多时候是读不到的。那我们可以用prop读的范围有哪些?

标签 property
html lang,id,class,style,title,tabIndex
div id,class,style,title,tabIndex
input id,class.style,title,tabIndex

例如:

属性 attr prop 说明
div-->class can can 固有属性
div-->name can undefined 自定义属性
div-->data-time can undefined 自定义data属性
input -->type can can 固有属性
input-->time can undefined 自定义属性
input-->data-type can undefined 自定义data属性

输出比较表(未完)

element 属性 example attr prop
全局属性 id <div id="hello"></div> hello hello
全局属性 class <div class="hello"></div> hello hello
全局属性 ==style== <div style="color:red;"></div> color:red; CSSStyleDeclaration对象
全局属性 title <div title="hello"></div> hello hello
全局属性(基本作用于<html>中,以下标签无效<base>,<br>,<frame>,<frameset>,<hr>,<iframe>,<param>,<script> lang <html lang="en"></html> en en
全局属性(作用在于div,a,input利用tab键获得焦点且有顺序) ==tabIndex== <div tabindex="0" onfocus='console.log("得到焦点!");'>ohhhh</div> "0"("string") 0("number")

获取和设置自定义属性 data()

获取自定义属性

方法

$div.data(attribute);

  • 传一个参数是获取元素属性的值,如果没有参数获取的是元素全部属性键值对组成的对象
  • 参数是“属性名”
  • 用attr获取的属性值,存的时候是什么类型的值,就是什么类型的值(包括数组和对象)

栗子


var $div = $("#example");
$div.data("title",12345);
var title = $div.data("title");
// 12345
typeof title
// "number"
$div.data("haha",true);
var value = $div.data();
// { title:12345 , haha:true }
console.log(value.title);
//12345
value.title = "houhou";
console.log($div.data());
// { title:"houhou" , haha:true }

设置自定义属性

设置自定义属性的时候,在DOM上不会有信息出现。但是已经临时存下了变量的值。

注意 undefined是不认可的属性值,如果第二个值传undefined,视为不传值,变为获取属性。

设置单个属性值

方法1

$div.data(key,value);

  • 传两个参数是设置元素属性的值
  • 参数1是要设置的==属性名==
  • 参数2是要设置的==属性值==,可以是的那个的值,也可以传obj

栗子

var $div = $("#example");
$div.data("title",{myData:"yoyo",count:40});
var titleValue = $div.data("title");
//{myData:"yoyo",count:40}
$div.data("time",true);
var timeValue = $div.data("time");
//true

方法2

$div.data(obj);

  • 传一个对象参数是设置元素属性的值
  • 参数中的键是要设置的==属性名==,值是要设置的==属性值==

栗子

var $div = $("#example");
$div.data({"title":{myData:"yoyo",count:40}});
var titleValue = $div.data("title");
//{ myData:"yoyo" , count:40 }
设置多个属性值

方法

$div.data({key1:value1,key2:value2});

  • 传一个json对象,里面的属性分别是键/值

栗子

var $div = $("#example");
$div.data({"title":{myData:"yoyo",count:40},"time":true});
var titleValue = $div.data("title");
//{ myData:"yoyo" , count:40 }
var timeValue = $div.data("time");
//true

删除自定义属性 removeData()

方法

$div.removeData(key);

  • 传一个参数是删除特定属性
  • 参数是“属性名”
  • 删除之后此属性值为undefined;

栗子

var $div = $("#example");
$div.removeData("title");
var titleValue = $div.data("title");
//"undefined"

总结

取属性出来有没有被强制转化为字符串

获取属性 是否强制转化
getAttribute("title") true
dataset.title true
attr("title") true
prop("title") true
data("title") false

没有此属性,返回值是什么?

获取属性 返回值
getAttribute("title") null
dataset.title undefined
attr("haha") null
attr("title") ""
prop("title") ""
prop("haha") undefined
data("title") undefined

attr()与data()

  1. attr设置的属性,data可以取到,但是data进行修改之后,两者取到的值会不一样。
var $div = $("#example");
$div.attr("data-houhou",123456);
$div.attr("data-houhou");
//"123456"  --> string
$div.data("houhou");
//123456 --> number

//用data修改houhou的值,attr取到的值不会变。
$div.data("houhou",789);
$div.attr("data-houhou");
//"123456"  --> string
$div.data("houhou");
//789 --> number
  1. data设置的属性值,attr()无法获取到
var $div = $("#example");
$div.data("houhou",123456);
$div.attr("data-houhou");
//null
$div.data("houhou");
//123456 --> number
  1. jquery和zepto已经做了很多兼容处理
    所以在没有兼容问题下,data()方法比attr()使用的效率更高,而且没有值被转化类型的风险,==所以推荐使用data()==。
  1. 是否显示在DOM上面
    在使用data()在html上面没有属性值的显示,可以通过data来取,attr()是会表现在html上面的。

元素集(未完)

上面的属性操作方法如果是获得的元素集。
那么是取第一个元素进行操作。

attr的input中的checked属性问题

在复选框的checked函数,没选中回返回undefined,选中返回checked,这个时候使用prop可以获取html标签中属性的值,复选框选中状态获取的true,未选中获取的是false

对于HTML元素本身就带有的固有属性,在处理时,使用prop(),removeProp()。

对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr(),removeAttr()。

attr与prop区别
http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html

@version1.0——2018-10-9——创建《js、jquery的属性操作方法总结》

©burning_韵七七

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容