前端JavaScrip之DOM对象
一 概述
DOM(Document Object Model)是当网页被加载时浏览器创建的页面文档对象模型。DOM用结构化的方式描述了标记语言的文件内容。JavaScript中几乎所有有意义的行为都是围绕DOM展开的,比如:读写页面元素、响应页面事件、进行表单验证等。
HTML DOM被构建为树结构,在DOM内部每个HTML页面被描述为一个以document为根节点的树,HTML中的每一个标记<..>都被表示为该树中的一个节点,比如如下一个HTML文件:

浏览器加载时生成的DOM树如下:

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。
- JavaScript 能够改变页面中的所有 HTML 元素
- JavaScript 能够改变页面中的所有 HTML 属性
- JavaScript 能够改变页面中的所有 CSS 样式
- JavaScript 能够对页面中的所有事件做出反应
二 DOM节点
2.1 节点类型
在 HTML DOM (文档对象模型)中,每个部分都是节点:
- 文档本身是文档节点(重点)
- 所有 HTML 元素是元素节点(重点)
- 所有 HTML 属性是属性节点
- HTML 元素内的文本是文本节点
- 注释是注释节点

2.2 节点关系
节点树中的节点彼此拥有层级关系。
父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
- 在节点树中,顶端节点被称为根(root)
- 每个节点都有父节点、除了根(它没有父节点)
- 一个节点可拥有任意数量的子节点
- 同胞是拥有相同父节点的节点
下面的图片展示了节点树的一部分,以及节点之间的关系:

访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素。
2.3 节点查找
2.3.1 直接查找节点
document.getElementById(“idname”) // id查找,返回对拥有指定id的第1个对象的引用 document.getElementsByTagName(“tagname”) // 标签名称查找,返回带有指定标签名的对象集合 document.getElementsByName(“name”) // 属性name查找,返回带有指定名称的对象集合 document.getElementsByClassName(“name”) // 属性classname查找,返回带有指定属性名的对象集合
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="d1"> <div class="c1">我的class是c1</div> <div class="c1" name="joe">我的class是c1,我的name是joe</div> <div id="d2">我的id是d2</div> <p>Hello World</p> </div> <script> var d = document.getElementById("d1"); // 标签<div id="d1">的节点 console.log(d); var d1 = document.getElementsByTagName("div"); // <div>节点的结合 console.log(d1); var n = document.getElementsByName("joe"); // 指定名称节点的结合 console.log(n); var c = document.getElementsByClassName("c1"); // 指定ClassName节点的结合 console.log(c); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1"> <div class="c1">我的class是c1</div> <div class="c1" name="joe">我的class是c1,我的name是joe</div> <div id="div2">我的id是d2</div> <p>Hello World</p> </div> <script> var div1 = document.getElementById("div1"); //支持 var ele1 = div1.getElementsByTagName("p"); alert(ele1.length); //支持 var ele2 = div1.getElementsByClassName("c1"); alert(ele2.length); //不支持 var ele3 = div1.getElementById("div2"); alert(ele3.length); //不支持 var ele4 = div1.getElementsByName("joe"); alert(ele4.length) </script> </body> </html>
注意:涉及到寻找元素,注意<script>标签的位置!
2.3.2 导航节点查找
parentElement // 父节点标签元素 children // 所有子标签 firstElementChild // 第一个子标签元素 lastElementChild // 最后一个子标签元素 nextElementtSibling // 下一个兄弟标签元素 previousElementSibling // 上一个兄弟标签元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1"> <h3>这是一个标题</h3> <div id="div2">我的class是c1</div> <div name="joe">我的class是c1,我的name是joe</div> <div id="div3">我的id是d2</div> <p>Hello World</p> </div> <script> var ele1 = document.getElementById("div2"); console.log(ele1); // <div id="div2">我的class是c1</div> var ele2 = ele1.nextElementSibling; // 下一个兄弟标签元素 console.log(ele2); // <div name="joe">我的class是c1,我的name是joe</div> var ele3 = ele1.previousElementSibling; // 上一个兄弟标签元素 console.log(ele3); // <h3>这是一个标题</h3> var parentEle = ele1.parentElement; // 父节点标签元素 console.log(parentEle); var childs = parentEle.children; // 所有子标签 console.log(childs); var fristChild = parentEle.firstElementChild; // 第一个子标签元素 console.log(fristChild); // <h3>这是一个标题</h3> var lastChild = parentEle.lastElementChild; // 最后一个子标签元素 console.log(lastChild); // <p>Hello World</p> </script> </body> </html>
注意:js中没有办法找到所有的兄弟标签
2.4 节点操作
2.4.1 创建节点
createElement(标签名) :创建一个指定名称的元素。
//示例
var tag = document.createElement("input");
tag.setAttribute("type","password");
2.4.2 增加节点
追加一个子节点(作为最后的子节点) somenode.appendChild(newnode) 把增加的节点放到某个节点的前边(添加兄弟节点) somenode.insertBefore(newnode,某个节点); // 不指定节点,则添加到最前面
2.4.3 删除节点
removeChild():获得要删除的元素,通过父元素调用删除
<script>
var parent = document.getElementById("div1");
var child = document.getElementById("div2");
parent.removeChild(child)
</script>
2.4.4 替换节点
somenode.replaceChild(newnode, 某个节点);
<script>
var parent = document.getElementById("div1");
var child = document.getElementById("div2");
var newTag = document.createElement("p");
parent.replaceChild(newTag, child);
</script>
2.5 节点属性操作
2.5.1 innerText/innerHTML
innerText:不管赋值还是取值,只能识别纯文本 innerHTML:既可以识别纯文本,也可以识别标签
<div id="d1">xxxx</div> <div id="d2"><p>oooo</p></div> <script> //innerText:不管赋值还是取值,只能识别纯文本 var a = document.getElementById('d1'); console.log(a); //取值操作 console.log(a.innerText); // xxxx console.log(a.innerHTML); // xxxx //赋值操作 // a.innerText = 'Hello World'; a.innerHTML = '<a href="">Hello World</a>'; //innerHtml:既可以识别纯文本,也可以识别标签 var b = document.getElementById('d2'); console.log(b); //取值操作 console.log(b.innerText); // oooo console.log(b.innerHTML); // <p>oooo</p> //赋值操作 // b.innerText = 'Hello JavaScript'; b.innerHTML = '<a href="">Hello JavaScript</a>'; </script>
注意:
- innerHTML 给节点添加html代码,不是w3c的标准,但是主流浏览器支持
- 使用innerHTML赋值时,语句一点要写在<body>中,否则报错。因为写在上面,在文件开始执行时,未加载到元素,会找不到需要操作的元素。
2.5.2 attribute操作
elementNode.setAttribute(name,value) // 设置属性 elementNode.getAttribute(属性名) // 获取属性值。等同于:elementNode.属性名(DHTML) elementNode.removeAttribute(属性名); // 删除属性
<body>
<div id="d1" class="c1">xxxx</div>
<script>
var a = document.getElementsByClassName('c1')[0];
// 获取属性值
// 方式一
var c = a.getAttribute("class");
console.log(c);
// 方式二:以成员变量的方式访问
var d1 = a.id; // 该方式不能获取class的属性值
console.log(d1);
// 属性赋值
// 方式一
a.setAttribute("class", "c11");
// 方式二:以成员变量的方式访问赋值
a.id = "d2"; // 该方式不能给class属性赋值
</script>
</body>
2.5.3 value获取当前选中的value值
- input
- select(selectedIndex)
- textarea
2.5.4 class相关操作
elementNode.className // 查询class elementNode.classList.add // 增加class elementNode.classList.remove // 删除calss
<body>
<div id="d1" class="c1 c2 c3"></div>
<script>
var a = document.getElementById("d1");
document.write(a.className); // c1 c2 c3
a.classList.add("c4");
document.write(a.className); // c1 c2 c3 c4
a.classList.remove("c1");
document.write(a.className); // c2 c3 c4
</script>
</body>
2.5.5 改变css样式
<body>
<div id="d1">Hello world</div>
<script>
document.getElementById("d1").style.color = "red";
document.getElementById("d1").style.fontSize = "24px";
</script>
</body>
注意:
- css属性名称中包含“-”,在此处变更为字母大写;
- 操作css属性一定是通过“style”去操作;
- 在后面的jQuery中为:$(selector).css.属性名称;
- 操作其他属性则不需要“style”,注意不要混淆。
三 DOM Event(事件)
3.1 事件类型
onclick 当用户点击某个对象时调用的事件句柄 ondblclick 当用户双击某个对象时调用的事件句柄 onfocus 元素获得焦点 练习:输入框 onblur 元素失去焦点 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证. onchange 域的内容被改变 应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动) onkeydown 某个键盘按键被按下 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交. onkeypress 某个键盘按键被按下并松开 onkeyup 某个键盘按键被松开 onload 一张页面或一幅图像完成加载 onmousedown 鼠标按钮被按下 onmousemove 鼠标被移动 onmouseout 鼠标从某元素移开 onmouseover 鼠标移到某元素之上 onmouseleave 鼠标从元素离开 onselect 文本被选中 onsubmit 表单提交时触发
3.2 绑定事件的方式
<input type="button" id="d1" onclick="func1(this)" value="点击"> <script> function func1(self){ // 形参不能是this; console.log("hello world"); console.log(self); //<input type="button" id="d1" onclick="foo(this)" value="点击"> } </script>
<input type="button" id="d1" value="点击"> <script> var ele = document.getElementById("d1"); ele.onclick = function () { console.log("hello world"); console.log(this); //<input type="button" id="d1" value="点击"> } </script>
3.3 事件详细介绍
onload
onload 属性开发中只给 body元素加。这个属性的触发标志着页面内容被加载完成。
应用场景:当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> // window.onload = function(){ // var ele = document.getElementById("d1"); // ele.onclick = function(){ // alert(123); // }; // }; function func() { var ele = document.getElementById("d1"); ele.onclick = function(){ alert(123); }; }; </script> </head> <body onload="func()"> // 放在其他元素中无效 <input type="button" id="d1" value="点击"> </body> </html>
事件传播
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="d1" style="background-color: gray; width:300px; height:300px;"> <div id="d2" style="background-color: blueviolet; width:200px; height:200px;"></div> </div> <script type="text/javascript"> document.getElementById("d1").onclick=function(){ alert('d1触发'); }; document.getElementById("d2").onclick=function(event){ alert('d2触发'); event.stopPropagation(); // 阻止事件向外层div传播 } </script> </body> </html>
提醒:何为事件传播,当一个区域有多个事件时,防止同时执行多个事件,加入了事件传播,从而只会执行内部事件。
onsubmit
当表单在提交时触发。该属性也只能给form元素使用。应用场景:在表单提交前验证用户输入是否正确。如果验证失败,在该方法中我们应该阻止表单的提交。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> window.onload = function(){ var ele = document.getElementById("form"); ele.onsubmit = function(event) { // 阻止表单提交方式一:onsubmit 命名的事件函数,可以接受返回值。其中返回false表示拦截表单提交,其他为放行 // alert("验证失败,表单不会提交!"); // return false; // 阻止表单提交方式二:event.preventDefault(); 通知浏览器不要执行与事件关联的默认动作。 alert("验证失败,表单不会提交!"); event.preventDefault(); }; }; </script> </head> <body> <form id="form"> <input type="text"/> <input type="submit" value="提交" /> </form> </body> </html>
onselect
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text"> <script> var ele = document.getElementsByTagName("input")[0]; ele.onselect = function(){ alert("文本被选中"); }; </script> </body> </html>
onchange
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <select id="d1"> <option value="">111</option> <option value="">222</option> <option value="">333</option> </select> <script> var ele = document.getElementById("d1"); ele.onchange = function(){ alert("内容已改变"); } </script> </body> </html>
onkeydown
Event 对象:Event 对象代表事件的状态,比如:事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数。
我们获得仅仅需要接收一下即可。比如:onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就是KeyCode。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="d1"/> <script> var ele = document.getElementById("d1"); ele.onkeydown = function(e){ e = e||window.event; var keynum = e.keyCode; var keychar = String.fromCharCode(keynum); alert(keynum+'---->'+keychar); }; </script> </body> </html>
onmouseout&onmouseleave
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #container{ width: 300px; } #title{ cursor: pointer; background: #ccc; text-align: center; line-height: 50px; font-size: 20px; } #list{ display: none; } #list div{ line-height: 30px; text-align: center; } #list .item1{ background-color: green; } #list .item2{ background-color: rebeccapurple; } #list .item3{ background-color: lemonchiffon; } </style> </head> <body> <p>先看下使用onmouseleave的效果:</p> <div id="container"> <div id="title">onmouseleave事件</div> <div id="list"> <div class="item1">第一行</div> <div class="item2">第二行</div> <div class="item3">第三行</div> </div> </div> <script> // 1.不论鼠标指针离开被选元素还是任何子元素,都会触发onmouseout事件 // 2.只有在鼠标指针离开被选元素时,才会触发onmouseleave事件 var container = document.getElementById("container"); var title = document.getElementById("title"); var list = document.getElementById("list"); title.onmouseover = function(){ list.style.display = "block"; }; // container.onmouseleave = function(){ // 改为onmouseout试一下 // list.style.display = "none"; // }; // 因为mouseout事件是会冒泡的,也就是onmouseout事件可能被同时绑定到了container的子元素title和list上 // 所以鼠标移出每个子元素时也都会触发我们的list.style.display="none"; // 思考:如果这样会产生什么效果 list.onmouseout=function(){ list.style.display="none"; }; // 为什么移出第一行时,整个list会被隐藏? // 其实是同样的道理,onmouseout事件被同时绑定到list和它的三个子元素item上,所以离开任何一个 // 子元素同样会触发list.style.display="none"; </script> </body> </html>
再次说明两者区别:
- 不论鼠标指针离开被选元素还是任何子元素,都会触发onmouseout 事件
- 只有在鼠标指针离开被选元素时,才会触发onmouseleave 事件
更多:www.runoob.com/tags/ref-eventattributes.html
四 实例练习
4.1 左侧菜单
重要知识点:
- classList的应用
- 除自己外其他兄弟标签的查找
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin: 0 auto; padding: 0; } .outer{ width: 80%; height: 315px; margin-top: 20px; } #left{ float: left; width: 20%; height: 315px; background-color: #7A77C8; } #right{ float: left; width: 80%; height: 315px; background-color: blueviolet; font-size: 30px; text-align: center; line-height: 315px; } .title{ font-size: 20px; height: 30px; line-height: 30px; padding-left: 20px; background-color: blue; margin-top: 5px; } .menu-list{ list-style-type: none; padding-left: 20px; color: white; line-height: 25px; } .hide{ display: none; } </style> </head> <body> <div class="outer"> <div id="left"> <div class="menu"> <div class="title">手机</div> <ul class="menu-list"> <li>华为</li> <li>一加</li> <li>小米</li> </ul> </div> <div class="menu"> <div class="title">电视</div> <ul class="menu-list hide"> <li>长虹</li> <li>康佳</li> <li>海信</li> </ul> </div> <div class="menu"> <div class="title">电脑</div> <ul class="menu-list hide"> <li>联想</li> <li>华硕</li> <li>华为</li> </ul> </div> </div> <div id="right">内容</div> </div> <script> var eles = document.getElementsByClassName("title"); for(i=0;i<eles.length;i++){ eles[i].onclick=function () { this.nextElementSibling.classList.remove("hide"); for(var j=0;j<eles.length;j++){ if (eles[j]!=this){ eles[j].nextElementSibling.classList.add("hide"); } } } } </script> </body> </html>
4.2 搜索框
重要知识点:
- onfocus&onblur的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input id="d1" type="text" value="请输入内容"> <script> var ele = document.getElementById("d1"); ele.onfocus = function() { if(ele.value == "请输入内容"){ ele.value = ""; } } ele.onblur = function() { if(!ele.value.trim()){ ele.value = "请输入内容"; } } </script> </body> </html>
4.3 模态对话框
重要知识点:
- 对相同属性名称的标签处理是动态的,在判断长度时需要注意
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .back{ background-color: white; height: 2000px; } .shade{ position: fixed; top: 0; bottom: 0; left:0; right: 0; background-color: grey; opacity: 0.4; } .hide{ display: none; } .models{ position: fixed; top: 50%; left: 50%; margin-left: -100px; margin-top: -100px; height: 200px; width: 200px; background-color: wheat; } </style> </head> <body> <div class="back"> <input class="c" type="button" value="click"> </div> <div class="shade hide handles"></div> <div class="models hide handles"> <input class="c" type="button" value="cancel"> </div> <script> var eles=document.getElementsByClassName("c"); var handles=document.getElementsByClassName("handles"); for(var i=0;i<eles.length;i++){ eles[i].onclick=function(){ if(this.value=="click"){ for(var j=0;j<handles.length;j++){ handles[j].classList.remove("hide"); } } else { for(var j=0;j<handles.length;j++){ handles[j].classList.add("hide"); } } } } </script> </body> </html>
4.4 全选&反选&取消
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> input{ margin-top: 10px; } button{ margin-left: 15px; } .select_all{ margin-left: 0px; } </style> </head> <body> <form> <input type="radio"> 选项一<br> <input type="radio"> 选项二<br> <input type="radio"> 选项三<br> <input type="radio"> 选项四<br> <input type="radio"> 选项五<br> </form> <br> <button class="select_all">全选</button> <button class="select_reverse">反选</button> <button class="cancel">取消</button> <script> var select_all = document.getElementsByClassName("select_all")[0]; var select_reverse = document.getElementsByClassName("select_reverse")[0]; var cancel = document.getElementsByClassName("cancel")[0]; var inputs = document.getElementsByTagName("input"); select_all.onclick = function () { for(i=0;i<inputs.length;i++){ inputs[i].checked=true; } } select_reverse.onclick = function () { for(i=0;i<inputs.length;i++){ if(inputs[i].checked){ inputs[i].checked=false; }else { inputs[i].checked=true; } } } cancel.onclick = function () { for(i=0;i<inputs.length;i++){ inputs[i].checked=false; } } </script> </body>
4.5 select正反移动
重要知识点:
- 节点的操作,父节点添加子节点,节点的相互移动等;
- for循环对数据长度进行判断时,注意其是否为动态的,以免造成错误;
- select标签中的option可以通过select.options获取。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin: 10px auto; padding: 0; } .outer { width: 500px; height: 370px; background-color: #c0cddf; } .left{ width: 200px; height: 350px; background-color: #cccccc; font-size: 20px; line-height: 30px; margin-top: 10px; margin-left: 10px; float: left; } option{ margin-top: 10px; padding-left: 5px; } .choice{ display: inline-block; width: 80px; height: 350px; text-align: center; float: left; margin-top: 10px; } .choice button{ display: inline-block; width: 50px; height: 25px; font-size: 20px; line-height: 25px; margin-top: 40px; } .right{ width: 200px; height: 350px; background-color: #cccccc; font-size: 20px; line-height: 30px; margin-top: 10px; float: left; } </style> </head> <body> <div class="outer"> <select class="left" multiple="multiple" size="10"> <option>choice1</option> <option>choice2</option> <option>choice3</option> <option>choice4</option> <option>choice5</option> <option>choice6</option> <option>choice7</option> <option>choice8</option> <option>choice9</option> <option>choice10</option> </select> <span class="choice"> <button class="choice_move">></button> <button class="all_move">>></button> <button class="reverse_choice_move"><</button> <button class="reverse_all_move"><<</button> </span> <select class="right" multiple="multiple" size="10"> </select> </div> <script> var choice_move = document.getElementsByClassName("choice_move")[0]; var all_move = document.getElementsByClassName("all_move")[0]; var reverse_choice_move = document.getElementsByClassName("reverse_choice_move")[0]; var reverse_all_move = document.getElementsByClassName("reverse_all_move")[0]; var right = document.getElementsByClassName("right")[0]; var left = document.getElementsByClassName("left")[0]; choice_move.onclick = function () { var left_options = left.options; for(i=0;i<left_options.length;i++){ if(left_options[i].selected){ right.appendChild(left_options[i]); i--; } } } all_move.onclick = function () { var left_options = left.options; for(i=0;i<left_options.length;i++){ right.appendChild(left_options[i]); i--; } } reverse_choice_move.onclick = function () { var right_options = right.options; for(i=0;i<right_options.length;i++){ if(right_options[i].selected){ left.appendChild(right_options[i]); i--; } } } reverse_all_move.onclick = function () { var right_options = right.options; for(i=0;i<right_options.length;i++){ left.appendChild(right_options[i]); i--; } } </script> </body> </html>
4.6 二级联动
重要知识点:
- js对象(类似py字典)不能通过索引获取key,可以通过for/in进行遍历,获取value通过objectname.key或者objectname[key]两种方式;
- 遍历数组对象时,为索引值;
- 节点的创建、添加;
- selectedIndex以及inneHTML的应用;
- [select].options.length=0的应用,清空select下的option标签。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> select{ height: 22px; margin-left: 10px; } </style> </head> <body> <select class="pro" name="province"> <option>请选择省份</option> </select> <select class="city" name="city"> <option>请选择城市</option> </select> <script> data={"河北省":["石家庄","廊坊","邯郸"], "河南省":["郑州","漯河","开封"], "湖北省":["武汉","黄冈","黄石"], "湖南省":["长沙","湘潭","娄底"], "四川省":["成都","绵阳","德阳"],}; var pro = document.getElementsByClassName("pro")[0]; var city = document.getElementsByClassName("city")[0]; for(var i in data){ var option_pro = document.createElement("option"); option_pro.innerHTML = i; pro.appendChild(option_pro); } pro.onchange = function () { // console.log(this); // console.log(this.options); // console.log(this.selectedIndex); province = (this.options[this.selectedIndex]).innerHTML; citys = data[province]; city.options.length=0; //清空 for(var i in citys){ var option_city = document.createElement("option"); option_city.innerHTML = citys[i]; city.appendChild(option_city); } } </script> </body> </html>
4.7 跑马灯
重要知识点:
- setInterval的使用;
- 字符串字符的查询与拼接等字符串操作。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .c1{ color: red; background-color: gray; text-align: center; line-height: 50px; font-size: 30px; } </style> </head> <body> <p class="c1">欢迎光临中国北京</p> <script> function test() { var ele = document.getElementsByClassName("c1")[0]; var connect=ele.innerText; var first_char = connect.charAt(); //默认为第一个字符 var other_char = connect.substr(1,connect.length); var new_str = other_char+first_char; ele.innerText = new_str; } setInterval(test,1500) </script> </body> </html>
参考:http://www.cnblogs.com/yuanchenqi/articles/6893904.html#_label5

浙公网安备 33010602011771号