元素相关

获取元素

根据标签id

document.getElementById();
image.png

根据标签名

document.getElementByTagName();

返回的是获取过来的元素对象集合,以伪数组的形式存储,可以采取遍历的方式来获取伪元素中的对象,得到的元素对象是动态

还可以获取父元素内部所有指定标签名的子元素

父元素必须是单个对象,获取时不包括父元素自己

html5新增 获取元素

根据类名获取

document.getElementByClassName();

根据选择器

document.querySelector()

.ClassName

idName

方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。 如果找不到匹配项,则返回null。

document.querySelectorAll()

指定选择器的所有元素对象

获取特殊元素body html

document.body()

document.documentElement()

事件基础

事件是可以被js侦测到的行为

触发—相应机制

三要素

事件源:事件被触发的对象

事件类型:如何触发

事件处理程序:通过函数赋值完成

  1. <body>
  2. <button id="btn">我是一个按钮</button>
  3. <script>
  4. var btn = document.getElementById('btn');
  5. btn.onclick =function () {
  6. alert('你好牛,真的按到我了呢!');
  7. }
  8. </script>
  9. </body>

执行事件的过程

  1. 获取事件源
  2. 注册事件、绑定事件
  3. 添加事件处理程序

image.png

操作元素

element.innerText()

从起始位置到终止位置的内容,不包括html标签,去除空格和换行

element.innerHtml()

W3C标准

起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行

这两个元素可读写

例子

如果是要按按钮触发图片的更换,应该也获取图片这一元素

图片地址后面要加.jpg

  1. <button id="hh">我是按钮1</button>
  2. <button id="xx">我是按钮2</button>
  3. <img src="./pic/abcd.jpg" alt="">
  4. <script>
  5. var img =document.querySelector('img');
  6. var hhh = document.getElementById('hh');
  7. hhh.onclick = function() {
  8. img.src = './pic/pic2.jpg';
  9. }
  10. var xxx = document.getElementById('xx');
  11. xxx.onclick = function() {
  12. img.src = './pic/pic1.jpg';
  13. }
  14. </script>
  1. <img src="./pic/morning.png" alt="">
  2. <div>Happy Everyday</div>
  3. <script>
  4. var img = document.querySelector('img');
  5. var div = document.querySelector('div');
  6. var date = new Date();
  7. var h = date.getHours();
  8. if(h<12) {
  9. img.src = './pic/morning.png';
  10. div.innerHTML = '早上好哦宝贝';
  11. }
  12. else if(h < 18) {
  13. img.src = './pic/fighting.png';
  14. div.innerHTML = '下午好哦宝贝'
  15. } else {
  16. img.src = './pic/evening.png';
  17. div.innerHTML = '晚上好哦宝贝'
  18. }
  19. </script>
  1. <body>
  2. <button>我是一个可爱的按钮(●'◡'●)</button>
  3. <input type="text" value="你要输入啥呢">
  4. <script>
  5. var btn = document.querySelector('button');
  6. var input = document.querySelector('input');
  7. btn.onclick = function() {
  8. //input.innerHTML=''; 这个是普通盒子比如div标签元素里面的内容,表单里面的值是通过value修改的
  9. input.value='哎呀,我被点击了!';
  10. btn.disabled = true ;
  11. }
  12. btn.onmouseout = function() {
  13. input.value='不要走,嘤嘤嘤';
  14. }
  15. </script>
  16. </body>

btn.disabled = true ;表单禁用

this.disabled = true ;this指向的是表单的调用者 btn

样式属性操作

我们可以通过js修改元素的大小颜色和样式

element.style : 样式比较少,功能简单

element.className : 将样式写入CSS,js只用添加这个样式即可,会直接覆盖原先的类名,要想保留,就两个类名都写上,中间用空格隔开(多类名选择器)

this.className = 'change' ;

  1. js里面的样式采取驼峰命名法
  2. js修改style的样式产生的是行内样式,CSS权重比较高

例子:搜索栏
  1. <style>
  2. input {
  3. color: #999;
  4. }
  5. </style>
  6. </head>
  7. <body>
  8. <input type="text" value="手机" name="" id="">
  9. <script>
  10. var text = document.querySelector('input');
  11. // 获得焦点事件
  12. text.onfocus = function () {
  13. if(text.value === '手机') {
  14. this.value = ' ';
  15. }
  16. //获得焦点把文本框颜色变深
  17. this.style.color = '#333';
  18. }
  19. text.onblur = function () {
  20. if(text.value === ' ') {
  21. this.value = '手机';
  22. }
  23. this.style.color = '#999';
  24. }
  25. </script>
  26. </body>

例子:密码框明文密文转换
  1. <style>
  2. .box {
  3. position: relative;
  4. width: 400px;
  5. /* border : 1px solid #ccc; */
  6. margin: 100px;
  7. }
  8. .box input {
  9. width: 370px;
  10. height: 30px;
  11. border: 0;
  12. outline: none;
  13. }
  14. .box img {
  15. position: absolute;
  16. top: 2px;
  17. right: 2px;
  18. width: 24px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="box">
  24. <label for="">
  25. <img src="./pic/images1/close.png" alt="" id="eye">
  26. </label>
  27. <input type="password" id="pwd">
  28. </div>
  29. <script>
  30. var eye =document.getElementById('eye');
  31. var pwd =document.getElementById('pwd');
  32. // 元素多用id获取元素
  33. let flag=0;
  34. eye.onclick = function () {
  35. if(flag == 0) {
  36. pwd.type ='text';
  37. eye.src ='./pic/images1/open.png';
  38. flag=1;
  39. } else {
  40. pwd.type ='password';
  41. eye.src ='./pic/images1/close.png';
  42. flag=0;
  43. }
  44. }
  45. </script>
  46. </body>

排他思想

如果有同一组元素,要实现某个同样的样式,需要用到循环的排他思想算法

  1. 所有元素全部清除样式
  2. 给当前元素设置样式
  3. 注意不能颠倒顺序

例子:按钮换色
  1. <body>
  2. <button>我是按钮</button>
  3. <button>我是按钮</button>
  4. <button>我是按钮</button>
  5. <button>我是按钮</button>
  6. <button>我是按钮</button>
  7. <script>
  8. var btn= document.getElementsByTagName('button');
  9. for(let i=0;i<btn.length;i++) {
  10. btn[i].onclick = function () {
  11. for(let j=0;j<btn.length;j++) {
  12. btn[j].style.backgroundColor='';
  13. // 这里不能留空。。。不然会设置颜色回默认失败
  14. }
  15. btn[i].style.backgroundColor='pink';
  16. }
  17. }
  18. </script>
  19. </body>

例子:换背景图

image.png

例子:表格高亮

image.png

例子:表单全选和取消全选
  1. <body>
  2. <div class="box">
  3. <table>
  4. <thead>
  5. <tr>
  6. <td><input type="checkbox" id="j_cbAll"></td>
  7. <th>goods</td>
  8. <th>price</td>
  9. </tr>
  10. </thead>
  11. <tbody id="j_tb">
  12. <tr>
  13. <td><input type="checkbox"></td>
  14. <td>iphone</td>
  15. <td>2000</td>
  16. </tr>
  17. <tr>
  18. <td><input type="checkbox"></td>
  19. <td>ipad</td>
  20. <td>3000</td>
  21. </tr>
  22. <tr>
  23. <td><input type="checkbox"></td>
  24. <td>MacBook</td>
  25. <td>2500</td>
  26. </tr>
  27. </tbody>
  28. </table>
  29. </div>
  30. <script>
  31. var j_cbAll = document.getElementById('j_cbAll');
  32. var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');
  33. j_cbAll.onclick = function() {
  34. console.log(this.checked) ;//得到当前复选框的选定状态
  35. for(let i=0;i<j_tbs.length;i++) {
  36. j_tbs[i].checked = this.checked;
  37. }
  38. }
  39. for(let j=0;j<j_tbs.length;j++) {
  40. j_tbs[j].onclick = function () {
  41. let flag=true;
  42. for(let k=0;k<j_tbs.length;k++) {
  43. if(!j_tbs[k].checked) {
  44. flag=false;
  45. break;
  46. }
  47. }
  48. j_cbAll.checked=flag;
  49. }
  50. }
  51. </script>
  52. </body>

自定义属性操作

获取

element.属性

获取内置属性值—元素本身自带的属性

element.getAttribute(‘属性’)

程序员自行添加的属性称为自定义属性(data-index)

设置

element.属性=’值’;

element.setAttribute(‘属性’,’值’)

修改clss时修改的是’Class’不是’ClassName’

移除

element.removeAttribute(‘属性’);

例子:tab栏切换
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. li {
  7. list-style-type: none;
  8. }
  9. .tab {
  10. width: 978px;
  11. margin: 100px auto;
  12. }
  13. .tab_list {
  14. height: 39px;
  15. border: 1px solid #ccc;
  16. background-color: #f1f1f1;
  17. }
  18. .tab_list li {
  19. float: left;
  20. height: 39px;
  21. line-height: 39px;
  22. padding: 0 20px;
  23. text-align: center;
  24. cursor: pointer;
  25. }
  26. .tab_list .current {
  27. background-color: #c81623;
  28. color: #fff;
  29. }
  30. .item_info {
  31. padding: 20px 0 0 20px;
  32. }
  33. .item {
  34. display: none;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <div class="tab">
  40. <div class="tab_list">
  41. <ul>
  42. <li class="current">商品介绍</li>
  43. <li>规格与包装</li>
  44. <li>售后保障</li>
  45. <li>商品评价(50000)</li>
  46. <li>手机社区</li>
  47. </ul>
  48. </div>
  49. <div class="tab_con">
  50. <div class="item" style="display: block;">
  51. <!-- <div class="item"> -->
  52. 商品介绍模块内容
  53. </div>
  54. <div class="item">
  55. 规格与包装模块内容
  56. </div>
  57. <div class="item">
  58. 售后保障模块内容
  59. </div>
  60. <div class="item">
  61. 商品评价(50000)模块内容
  62. </div>
  63. <div class="item">
  64. 手机社区模块内容
  65. </div>
  66. </div>
  67. </div>
  68. <script>
  69. var tab_list = document.querySelector('.tab_list');
  70. var lis = tab_list.querySelectorAll('li');
  71. var items = document.querySelectorAll('.item');
  72. for(let i=0;i<lis.length;i++) {
  73. lis[i].setAttribute('index',i);
  74. lis[i].onclick = function() {
  75. for(let j=0;j<lis.length;j++) {
  76. console.log('hi');
  77. lis[j].className=' ';
  78. //这里需要空格来置空or不留空格都行。。,注意Class的写法qwq
  79. }
  80. this.className='current';
  81. var index=this.getAttribute('index');
  82. for(let j=0;j<items.length;j++) {
  83. items[j].style.display='none';
  84. }
  85. items[index].style.display='block';
  86. }
  87. }
  88. </script>

html5自定义属性

为了保存并使用数据,有些数据可以保存到页面中而不可以保存到数据库里

h5规定自定义属性以data-开头为属性名并赋值

dataset是一个集合,存放了所有以data-开头的自定义属性,ie11才开始使用

element.dataset.index

element.dataset[‘index’]

如果自定义属性里面有多个链接的单词采用驼峰命名法

节点操作

父节点

node.parentNode 可以返回某节点的父节点,是距离最近的一个父节点,如果指定节点没有父节点,则返回null

子节点

node.childNodes (换行属于文本节点)包括所有子节点,包括文本(nodeType3)、元素结点(nodeType1)

node.children 是一个只读属性,返回所有子元素结点,其余节点不返回

第一个和最后一个子元素

node.firstChild:返回的是子节点,不管是文本还是元素结点

node.lastChild:返回的是子节点,不管是文本还是元素结点

node.firstElementChild:返回的是子元素节点,ie9以上使用

node.LastElementChild

实际使用:

node.children[0]

node.children[node.children.length-1]

例子:下拉菜单
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. li {
  7. list-style-type: none;
  8. }
  9. a {
  10. text-decoration: none;
  11. font-size: 14px;
  12. }
  13. .nav {
  14. margin: 100px;
  15. }
  16. .nav>li {
  17. position: relative;
  18. float: left;
  19. width: 80px;
  20. height: 41px;
  21. text-align: center;
  22. }
  23. .nav li a {
  24. display: block;
  25. width: 100%;
  26. height: 100%;
  27. line-height: 41px;
  28. color: #333;
  29. }
  30. .nav>li>a:hover {
  31. background-color: #eee;
  32. }
  33. .nav ul {
  34. display: none;
  35. position: absolute;
  36. top: 41px;
  37. left: 0;
  38. width: 100%;
  39. border-left: 1px solid #FECC5B;
  40. border-right: 1px solid #FECC5B;
  41. }
  42. .nav ul li {
  43. border-bottom: 1px solid #FECC5B;
  44. }
  45. .nav ul li a:hover {
  46. background-color: #FFF5DA;
  47. }
  48. </style>
  49. </head>
  50. <body>
  51. <ul class="nav">
  52. <li>
  53. <a href="#">微博</a>
  54. <ul>
  55. <li>
  56. <a href="">私信</a>
  57. </li>
  58. <li>
  59. <a href="">评论</a>
  60. </li>
  61. <li>
  62. <a href="">@我</a>
  63. </li>
  64. </ul>
  65. </li>
  66. <li>
  67. <a href="#">微博</a>
  68. <ul>
  69. <li>
  70. <a href="">私信</a>
  71. </li>
  72. <li>
  73. <a href="">评论</a>
  74. </li>
  75. <li>
  76. <a href="">@我</a>
  77. </li>
  78. </ul>
  79. </li>
  80. </ul>
  81. <script>
  82. var nav = document.querySelector('.nav');
  83. var lis = nav.children;
  84. for(let i=0;i<lis.length;i++) {
  85. lis[i].onmouseover =function () {
  86. this.children[1].style.display ='block';
  87. }
  88. lis[i].onmouseout =function () {
  89. this.children[1].style.display ='none';
  90. }
  91. }
  92. </script>

兄弟节点

node.nextSibling:返回当前元素下一个兄弟节点,找不到则返回null,同样也是包含所有节点

node.previousSibling

node.nextElementSibling

node.previousElementSibling

兼容性问题:自己封装一个兼容性函数

  1. function getNextElementSibling(element) {
  2. var el =element;
  3. while(el=el.nextSibling) {
  4. if(el.nodeType == 1) {
  5. return e1;
  6. }
  7. }
  8. return null;
  9. }

创建节点

document.createElement(‘ ‘);创建由tagName指定的HTML元素,因为这些元素原先不存在,是根据我们需求动态生成的,因此也成为动态创建元素节点

添加节点

node.appendChild(child);将一个节点添加到指定父元素的子节点列表末尾

node.insertBefore(child,指定元素)

例子:评论发布
  1. <textarea name="" id=""></textarea>
  2. <button>发布</button>
  3. <ul></ul>
  4. <script>
  5. var btn = document.querySelector('button');
  6. var text = document.querySelector('textarea');
  7. var ul = document.querySelector('ul');
  8. btn.onclick = function() {
  9. if(text.value == '') {
  10. alert('发布的内容不能为空');
  11. return false;
  12. } else {
  13. let li =document.createElement('li');
  14. li.innerHTML = text.value;
  15. ul.insertBefore(li,ul.children[0]);
  16. }
  17. }
  18. </script>

删除节点

node.removeChild(child)
image.png

阻止链接跳转

javascript:;

javascript:void(0);

例子:评论删除
  1. <script>
  2. var btn = document.querySelector('button');
  3. var text = document.querySelector('textarea');
  4. var ul = document.querySelector('ul');
  5. btn.onclick = function() {
  6. if(text.value == '') {
  7. alert('发布的内容不能为空');
  8. return false;
  9. } else {
  10. let li =document.createElement('li');
  11. li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";
  12. ul.insertBefore(li,ul.children[0]);
  13. }
  14. var as = document.querySelectorAll('a');
  15. // 这个不能写在里面,因为每点击一次发布就得检索按钮的个数;写在外面的话程序运行一次就结束了,没有检索到按钮的个数
  16. for(let i=0;i<as.length;i++) {
  17. as[i].onclick = function() {
  18. // a所在的li即是a的父节点
  19. ul.removeChild(this.parentNode);
  20. }
  21. }
  22. }
  23. </script>

删除按钮不能正常运行的原因:因为每点击一次发布就得检索按钮的个数;写在外面的话程序运行一次就结束了,没有检索到按钮的个数

复制节点

node.cloneNode();

该方法返回调用该方法的结点的一个副本

如果括号为空或者里面为false则为浅拷贝,只复制节点本身,不克隆里面的子节点

参数为true则为深拷贝

例子:动态生成表格
  1. <body>
  2. <table>
  3. <thead>
  4. <tr>
  5. <th>姓名</th>
  6. <th>科目</th>
  7. <th>成绩</th>
  8. <th>操作</th>
  9. </tr>
  10. </thead>
  11. <tbody></tbody>
  12. </table>
  13. <script>
  14. var datas =[{
  15. name : '黄小迪',
  16. subject : 'java',
  17. score :100
  18. },{
  19. name : '黄小瑜',
  20. subject : 'javascript',
  21. score :100
  22. },{
  23. name : '黄小鱼',
  24. subject : 'C++',
  25. score :100
  26. }]
  27. console.log(datas.length);
  28. var tbody =document.querySelector('tbody');
  29. for(let i=0;i<datas.length;i++) {
  30. // 创建行
  31. var tr =document.createElement('tr');
  32. tbody.appendChild(tr);
  33. for(let j in datas[i]) {
  34. // 行里面创建单元格
  35. let td = document.createElement('td');
  36. // 把对象里面的属性值 给td
  37. td.innerHTML = datas[i][j];
  38. tr.appendChild(td);
  39. }
  40. let td = document.createElement('td');
  41. td.innerHTML='<a href="javascript:;">删除</a>'
  42. tr.appendChild(td);
  43. }
  44. var as = document.querySelectorAll('a');
  45. for(let i=0;i<as.length;i++) {
  46. as[i].onclick = function() {
  47. //点击a删除a所在的行,链接的父节点的父节点
  48. tbody.removeChild(this.parentNode.parentNode);
  49. }
  50. }
  51. </script>
  52. </body>

三种创建元素的方式区别:

document.write();

document.write(<div>111</div>)

直接将内容写入页面的内容流,文档流执行完毕,会导致页面重绘

innerHTML

将内容写入某个DOM结点,不会导致页面重绘,创建多个元素效率更高(不采用拼接字符串,而是数组形式拼接),结构稍微复杂

document.createElement()

创建多个元素效率稍低,但是结构清晰