JavaScript DOM

DOM开篇

  1. 什么是DOM?
  • 文档对象模型,是关于如何获取、修改、添加或删除 HTML 元素的标准
  1. 什么是document文档对象?
  • 是系统提供的一个对象,这个对象就是DOM对象,这个对象以树的形式保存了界面上所有的内容
  1. 标签, 元素都是 HTML标签的称呼

获取界面上的元素

  1. 自定义对象
function Person() {}
var per = new Person();
  1. 内置对象
Array/String/Boolean/Number/...
  1. 宿主对象
  • 简单的可以理解为浏览器提供的对象
  • DOM和BOM中的对象都是宿主对象

通过标签名称获取界面上的元素

  1. 通过ID获取界面上的元素
  • 会将id名称为指定名称的的元素返回给我们
  • 注意点:如果id名称重复,返回的是第一个找到的元素(返回宿主对象)
    var oDiv = document.getElementById("father");
    console.log(oDiv);
    console.log(oDiv);
  1. 通过类名获取界面上的元素
  • 找到==所有==类名为指定名称的元素, 放到一个集合对象中返回给我们
  • 这个集合对象是一个伪数组(对象)
  • 注意点:有兼容性问题,IE9才支持
    var oDiv = document.getElementsByClassName("son");
    console.log(oDiv);
    console.dir(oDiv);
  1. 通过标签名称获取界面上的元素
  • 找到==所有==指定标签的元素, 放到一个集合对象中返回给我们
    var oDiv = document.getElementsByTagName("div");
    console.log(oDiv);
  1. 通过name属性名称来获取界面上的元素
  • 注意点:在不同浏览器执行结果可能不同
  • 找到==所有==指定name的元素
    var oDiv = document.getElementsByName("pp");
    console.log(oDiv);
  1. 根据选择器来获取界面上的元素
  • CSS中所有的选择器都可以在这里使用
  • 注意点:会返回第一个找到的元素
  • IE8才能用
var oDiv = document.querySelector("div>.son");
console.log(oDiv);
var oDiv = document.querySelectorAll("div");//找到所有的

文档加载过程

  • window.onload和将script标签写在body最后的区别:
    • window.onload执行时,不仅DOM对象准备好了,网页上所有资源也都准备好了
    • body后的script标签执行时, 仅仅代表DOM对象准备好了, 而网页上的其它资源不一定准备好
    • 综上所述:body后的script标签的效率高于window.onload

节点

获取元素

  1. 获取子元素
    var oDiv = document.querySelector(".son1");
    console.log(oDiv);
  1. 通过子元素获取父元素
    • 一般情况下在JS中带Element单词的属性或者方法都有兼容性问题
    • parentElement: 获取父元素
    • arentNode:获取父节点,拿到的不一定是一个元素(DOM节点(标签节点/属性节点/文本节点))
    // var oDiv = document.querySelector(".son1");
    var oDiv = document.querySelector("html");
    var oFDiv = oDiv.parentElement; //null(父元素)
    // var oFDiv = oDiv.parentNode; //#document(父节点)
    console.log(oFDiv);
  1. 通过指定元素找到上/下一个元素
    var oDiv = document.querySelector(".son1");
    //上一个元素
    // var oPDiv = oDiv.previousElementSibling || oDiv.previousSibling;
    // console.log(oPDiv);
    //下一个元素
    var oNDiv = oDiv.nextElementSibling || oDiv.nextSibling;
    console.log(oNDiv);
  1. 通过指定元素找到所有的子节点/子元素
    var oDiv = document.querySelector("#father");
    // var oCDiv = oDiv.childNodes;//[text, p, text, div.son1, text, p, text, div.son2, text]
    var oCDiv = oDiv.children;// [p, div.son1, p, div.son2, hh: p, pp: p]
    console.log(oCDiv);

节点之间的增删改查

  1. 创建一个元素:createElement
  2. 添加到界面上:
    • appendChild()添加到指定元素中的末尾
    • insertBefore(,)将第一个参数的元素插入到第二个参数元素的前面
  3. 删除指定的元素: parentNode.removeChild();只能通过父节点调用removeChild删除子节点
    var oDiv = document.querySelector(".son1");
    var oA = document.createElement("a");
    // oDiv.appendChild(oA);
    var op = document.querySelector(".pp");
    oDiv.insertBefore(oA,op);
    op.parentNode.removeChild(op);

节点属性的操作

  1. 获取取节点的属性
    1. 直接获取(通过DOM查询到对应的元素之后,返回给我们的是一个对象)
    2. 通过getAttribute方法获取
    var oImg = document.querySelector("img");
    // console.log(oImg.alt); //这是alt
    // console.log(oImg.title); //这是title
    // console.log(oImg.src); //http://localhost:63342/Js/%E7%BB%83%E4%B9%A0/images/ad1.jpg
    // console.log(oImg.yzf); //undefined
    console.log(oImg.getAttribute("src")); //images/ad1.jpg
    console.log(oImg.getAttribute("title")); //这是title
    console.log(oImg.getAttribute("alt")); //这是alt
    console.log(oImg.getAttribute("yzf")); //hello
  • 为什么系统要提供两种方式来获取元素的属性?
    • 第一种方式 元素.属性 只能获取标签自带的属性
    • 第二种方式元素.getAttribute(属性) 既可以获取自带的属性也可以获取自定义属性
  1. 删除属性
    1. 直接删除(不能删除自定义属性)
    2. 通过removeAttribute方法来删除
var oImg = document.querySelector("img");
oImg.alt = "";
oImg.removeAttribute("yzf");
  1. 设置属性的值
    1. 直接设置
    2. 通过setAttribute方法来设置
    3. 注意:有就修改,没有就新增
oImg.title = "修改后的title";
oImg.yzf = "修改后的yzf";//不能修改自定义属性
oImg.setAttribute("yzf", "修改后的yzf");
oImg.setAttribute("zx", "新增的zx属性")

innerHTML属性

  • 作用:获取或者设置调用者中的内容
    • 如果是获取,会原封不动的将调用者中的内容返回给我们(包含标签)
    • 如果是设置,会利用设置的值覆盖调用调用者中所有的内容,如果设置的值中包含了HTML标签,也会解析创建之后再添加
var oDiv = document.querySelector(".son1");
console.log(oDiv.innerHTML);//<p class="pp">我是段落</p>
oDiv.innerHTML = "<p class=\"p\">我是修改后的段落</p>";
console.log(oDiv.innerHTML);

innerText属性

  • 作用:获取或者设置调用者中的内容
    • 如果是获取,会去掉调用者中的标签, 将其它的内容返回给我们, 并且会去除两端的空格
    • 如果是设置,会利用设置的值覆盖调用调用者中所有的内容,如果设置的值中包含了HTML标签,不会解析和创建, 会原样添加
  • 有兼容性的问题,不能很好的支持所有的浏览器
var oDiv = document.querySelector(".son1");
console.log(oDiv.innerText);//我是段落
oDiv.innerText = "<a>我是a标签</a>";
console.log(oDiv.innerText);//<a>我是a标签</a>

textContent属性

  • 作用:获取或者设置调用者中的内容
    • 如果是获取,会去掉调用者中的标签, 将其它的内容返回给我们, 但是不会去除两端的空格
    • 如果是设置,会利用设置的值覆盖调用调用者中所有的内容,如果设置的值中包含了HTML标签,不会解析和创建, 会原样添加
  • 有兼容性的问题,不能很好的支持所有的浏览器
var oDiv = document.querySelector(".son1");
console.log(oDiv.textContent);//          我是段落1
oDiv.textContent = "<a>我是a标签</a>";
console.log(oDiv.textContent);//<a>我是a标签</a>
  • 兼容处理
var oDiv = document.querySelector(".son1");
//兼容处理
function setInnerText(obj,ctx) {
    if("textContent" in obj){
        obj.textContent = ctx;
    }else {
        obj.innerHTML = ctx;
    }
}
setInnerText(oDiv, "<a>我是a标签</a>");

注意点:

  • innerHTML,innerText,textContent用于获取或者设置==双标签==中的内容
  • 如果想获取或者设置input中的内容, 需要使用value属性
<input type="hello" value="这是value">
var oInput = document.querySelector("input");
console.log(oInput.innerHTML);//空
console.log(oInput.innerText);//空
console.log(oInput.textContent);//空

console.log(oInput.value);//这是value
console.log(oInput.getAttribute("value"));//这是value

设置节点的样式

  1. 通过style属性来设置
    • 如果是设置宽度和高度,需要添加单位, 否则会报错
    • CSS中用-连接的属性名称, 都会去掉-,将后面一个单词的首字母大写
var oDiv = document.querySelector(".father1");
oDiv.style.width = "100px";
oDiv.style.height = "100px";
oDiv.style.backgroundColor = "red";
console.log(oDiv.style.width); //返回一个字符串
  1. 通过className属性来设置
    • 默认情况下通过元素对象操作元素的属性时,都是自带的是什么名称, 操作的时候就是什么名称
    • class是js的一个关键字,所以这里就将HTML标签的class属性的名称改为了className
var oImg = document.querySelector("img");
console.log(oImg.alt);
oImg.className = "box";//不能写.box
  1. 如果是操作个别的样式,那么推荐使用style属性
  2. 如果是操作多个的样式,那么推荐使用className属性
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容