JS练习代码库(不定期更新)

来源:互联网 发布:js组合sophia病逝 编辑:程序博客网 时间:2024/06/04 08:51
目录

0.常用代码
1.点击屏幕更换背景颜色【开关灯】
2.列表隔行变色
3.输出九九乘法表
4.任意数求和
5.数组去重(四种方法)
6.JS图片库【DOM编程艺术】
7.JS图片库改进版【DOM编程艺术】
8.1-100不能被3整除的数相加【递归】
9.1-10能被2整除的数相乘【递归】
10.给列表中标题下方第一行的内容加粗【DOM】
11.数组的冒泡排序
12.数组的快速排序
13.数组的插入排序
14.编写位置改变动画函数【DOM编程艺术】
15.DOM动画实例【DOM编程艺术】
16.类数组转为数组
17.HTML创建视频控件【DOM编程艺术】
18.把JSON格式的字符串转换为JSON格式的对象
19.【DOM方法扩展】children——作用:获取某一个容器中所有的元素子节点(还可以筛选出指定标签名)
20.【DOM方法扩展】getElementsByClass——作用:通过元素的样式类名获取一组元素集合(兼容所有浏览器)
21.【DOM方法扩展】获取上一个哥哥元素节点(prev)、获取下一个弟弟元素节点(next)、获取所有的哥哥元素节点(prevAll)、获取所有的弟弟元素节点(nextAll)、获取相邻的两个元素节点(sibling)、获取所有的兄弟元素节点(siblings)
22.【DOM方法扩展】获取第一个元素子节点(firstChild)、获取最后一个元素子节点(lastChild)
23.【DOM方法扩展】获取当前元素索引(index)
24.【DOM方法扩展】prepend——作用:增加到某一个容器的开头(与appendChild对应)
25.【DOM方法扩展】insertAfter——作用:增加到容器中某一个元素的后面(与insertBefore对应)
26.【DOM方法扩展】hasClass——作用:判断是否存在某一个样式类名
27.【DOM方法扩展】removeClass——作用:删除样式类名
28.【DOM方法扩展】addClass——作用:给元素增加样式类名
29.【DOM方法扩展】getCss、setCss、setGroupCss获取/设置/批量设置css
30.【DOM方法扩展】css
31.js中简易选项卡的实现(3种方法实现样式的封装)

0.常用代码

1.类数组转为数组:

ary = Array.prototype.slice.call(类数组);

2.删除数组中的某一项:

ary.splice(i, 1);

3.判断是否为IE浏览器:

if(/MSIE (6|7|8)/i.test(navigator.userAgent))

4.正则,以多个空格开头或以多个空格结尾:

var reg = /(^ +| +$)/g;

5.将字符串按照空格拆分成数组:

var str = "this is my book"str.split(" ");  //["this", "is", "my", "book"]
1.点击屏幕更换背景颜色【开关灯】

需求:点击屏幕,更换整体的背景颜色
分析:通过改变 this.style.backgroundColor的值,并且运用switch-case语句来实现
完整代码如下:

<!doctype html><html lang="lang"><head>    <meta charset="UTF-8">    <title>JS中判断的应用【开关灯】</title>    <style type="text/css">        html, body {            margin: 0;            padding: 0;            cursor: pointer;            width: 100%;            height: 100%;        }    </style></head><body id="body"><script type="text/javascript">    var oBody = document.getElementById("body");    oBody.onclick = function () {        var bgColor = this.style.backgroundColor;        switch (bgColor) {            case "black":                this.style.backgroundColor = "green";                break;            case "green":                this.style.backgroundColor = "#294738";                break;            default:                this.style.backgroundColor = "black";        }    };</script></body></html>
2.列表隔行变色

需求:实现列表的奇偶行变色,并且鼠标移入也变色(js实现)
样式图:
这里写图片描述
完整代码如下:

<!doctype html><html lang="lang"><head>    <meta charset="UTF-8">    <title>JS中判断的应用【开关灯】</title>    <style type="text/css">        html, body {            margin: 0;            padding: 0;            font-size: 15px;            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;        }        ul {            list-style: none;            border: 1px solid #5bc0de;            width: 600px;            margin: 0 auto;            padding: 0px;        }        li {            padding: 10px 30px;            cursor: pointer;        }        .c1 { /*奇数行颜色*/            background-color: #5bc0de;        }        .c2 { /*偶数颜色*/            background-color: #f7e1b5;        }        .c3 { /*移入颜色*/            background-color: #999;        }    </style></head><body><ul>    <li>NBA-正互动播湖人VS掘金 欧文首秀9+4+3绿军胜</li>    <li>传乔治明夏或考虑留俄城 | 沃尔缺阵奇才大胜广州29分</li>    <li>中网-彭帅苦战168分钟 2-1险胜罗杰斯挺进次轮</li>    <li>彭帅笑称签名时被叫阿姨 | 新科美网冠军再遇一轮游</li>    <li>热身赛-斯科拉20分马布里8分 山西末节逆转北控</li>    <li>18:30视频播WBA拳王争霸赛 | 20时视频直播WCA淘汰赛</li>    <li>中超-恒大与英劲旅争安胖 权健老总:德比绝没放水</li>    <li>里皮休假期与AC米兰高层接触 成红黑军新帅候选</li></ul><script type="text/javascript">    var oLi = document.getElementsByTagName("li");    for (var i = 0; i < oLi.length; i++) {        var oLis = oLi[i];        i % 2 === 0 ? (oLis.className = "c1" , oLis.old = "c1") : (oLis.className = "c2", oLis.old = "c2");        oLis.onmouseover = function () {            this.className = "c3";        };        oLis.onmouseout = function () {            this.className = this.old;        };    }</script></body></html>

也可以用闭包来实现:

<script type="text/javascript">    var oLi = document.getElementsByTagName("li");    for (var i = 0; i < oLi.length; i++) {        ~function (i) {            var oLis = oLi[i];            i % 2 === 0 ? (oLis.className = "c1" , oLis.old = "c1") : (oLis.className = "c2", oLis.old = "c2");            oLis.onmouseover = function () {                oLi[i].className = "c3";            };            oLis.onmouseout = function () {                oLi[i].className = oLi[i].old;            };        }(i);    }</script>
3.输出九九乘法表

样式:
这里写图片描述
完整代码如下:

<!doctype html><html lang="lang"><head>    <meta charset="UTF-8">    <title>九九乘法表</title>    <style type="text/css">        table {            margin: 0 auto;        }        tr {            border: 1px solid rgb(230, 189, 189);        }        td, tr {            padding: 5px 10px;            font-size: 14px;            color: rgb(177, 106, 104);        }        table tr:nth-child(odd) {            background: rgb(238, 211, 210)        }        table tr:nth-child(even) {            background: #FFF        }    </style></head><body><script type="text/javascript">    document.write("<table>");    var str = "";    for (var i = 1; i <= 9; i++) {        document.write("<tr>");        for (var j = 1; j <= i; j++) {            str += "<td>" + j + "*" + i + "=" + i * j + "</td>";        }        document.write(str);        document.write("</tr>");        str = "";    }    document.write("</table>");</script></body></html>
4.任意数求和

需求:编写一个函数sum,调用时无论传递多少个参数都能实现求和
js代码如下:

<script type="text/javascript">    function sum() {        var _sum = 0;        for (var i = 0; i < arguments.length; i++) {            var num = Number(arguments[i]);            if (!isNaN(num)) {                _sum += num;            }        }        return _sum;    }    console.log(sum(45, 66, "u", 77, 45)); //233</script>
5.数组去重方法一:遍历数组法

方法分析:新建一个空数组。遍历传入数组的每一项,如果在新建的数组中找到了传入数组的那一项,说明重复,如果找不到,就把当前项传入到新建的数组中。最后返回新建的数组即可。
代码如下:

function unique(arr) {    var ary = [];    for (var i = 0; i < arr.length; i++) {        if (ary.indexOf(arr[i]) === -1) {            ary.push(arr[i]);        }    }    return ary;}
方法二:对象键值对法

方法分析:创建一个空数组和一个空对象。遍历传入的数组,如果对象中没有,就把遍历的值当做属性,对应的值为1传入对象中,同时把该值push到数组中。
代码如下:

function unique(arr) {    var ary = [];    var obj = {};    for (var i = 0; i < arr.length; i++) {        if (!obj[arr[i]]) {            ary.push(arr[i]);            obj[arr[i]] = 1;        }    }    return ary;}
方法三:数组下标判断法

方法分析:利用indexOf在查找时只能找到第一个匹配位置的值的特点。如果传入的数组中的位置不等于循环的i,则说明该数是重复的。
代码如下:

function unique(arr) {    var ary = [];    for (var i = 0; i < arr.length; i++) {        if (arr.indexOf(arr[i]) === i) {            ary.push(arr[i]);        }    }    return ary;}
方法四:排序后相邻去除法

方法分析:对数组进行排序,然后比较相邻的数字是否相等。不过该方法会将原数组进行排序。
代码如下:

function unique(arr) {    var ary = [];    arr.sort(function (a, b) {        return a - b;    });    for (var i = 0; i < arr.length; i++) {        if (arr[i] !== arr[i + 1]) {            ary.push(arr[i]);        }    }    return ary;}
6.JS图片库【DOM编程艺术】

需求:点击列表中的链接下方会出现图片,并且页面不跳转,同时在图片下方显示图片说明
样式:
这里写图片描述
步骤:

  1. 构建基本布局
  2. 增加占位符图片
  3. 创建showPic函数,用来改变img标签的src属性
  4. 在a标签上增加点击事件,并防止跳转
  5. 增加p标签作为图片说明文字
  6. 绑定文字

完整代码如下:

<!doctype html><html lang="en"><head>    <meta charset="UTF-8">    <title>6.JS图片库【DOM编程艺术】</title>    <style type="text/css">        #img {            margin-top: 30px;            width: 200px;            height: 112px;            background-color: #eee;            text-align: center;            clear: both;        }        #placeholder {            vertical-align: middle;        }        span {            display: inline-block;            height: 100%;            vertical-align: middle;        }        li {            float: left;            list-style: none;            padding: 10px;        }        a {            text-decoration: none;        }    </style></head><body><h1>JS图片库</h1><ul>    <li><a href="img/1.jpg" title="flowers" onclick="showPic(this);return false;">flowers</a></li>    <li><a href="img/2.jpg" title="desert" onclick="showPic(this);return false;">desert</a></li>    <li><a href="img/3.jpg" title="city" onclick="showPic(this);return false;">city</a></li>    <li><a href="img/4.jpg" title="sea" onclick="showPic(this);return false;">sea</a></li>    <li><a href="img/5.jpg" title="bright" onclick="showPic(this);return false;">bright</a></li>    <div id="img"><img id="placeholder" src="img/default.gif" alt="placeholder"/><span></span></div>    <p id="text">图片的描述</p></ul><script type="text/javascript">    //改变img的src属性:    function showPic(whichPic) { //whichpic是一个元素节点        var source = whichPic.getAttribute("href");        document.getElementById("placeholder").setAttribute("src", source);        document.getElementById("text").firstChild.nodeValue = whichPic.getAttribute("title");    }</script></body></html>
7.JS图片库改进版【DOM编程艺术】

改进方面有如下几点:

  1. 将JavaScript代码,即onclick事件分离
  2. 如果没有占位符,则图片不能加载,所以最后的return false;应该由showPic函数来决定,即如果没有的话,则正常跳转页面来显示图片
  3. 链接可以转为缩略图

注意:按照实际情况来进行优化
效果图:
这里写图片描述
完整代码如下:

<!doctype html><html lang="en"><head>    <meta charset="UTF-8">    <title>6.JS图片库【DOM编程艺术】</title>    <style type="text/css">        #box {            margin-top: 30px;            width: 200px;            height: 112px;            background-color: #eee;            text-align: center;            clear: both;        }        #placeholder {            vertical-align: middle;        }        span {            display: inline-block;            height: 100%;            vertical-align: middle;        }        li {            float: left;            list-style: none;        }        a {            text-decoration: none;        }        a img {            width: 100px;            margin: 0 10px 20px 0;        }    </style></head><body><h1>JS图片库</h1><ul id="imagegallery">    <li>        <a href="img/1.jpg" title="flowers">            <img src="img/1.jpg" alt="flowers"/>        </a>    </li>    <li>        <a href="img/2.jpg" title="desert">            <img src="img/2.jpg" alt="desert"/>        </a>    </li>    <li>        <a href="img/3.jpg" title="city">            <img src="img/3.jpg" alt="city"/>        </a>    </li>    <li>        <a href="img/4.jpg" title="sea">            <img src="img/4.jpg" alt="sea"/>        </a>    </li>    <li>        <a href="img/5.jpg" title="bright">            <img src="img/5.jpg" alt="bright"/>        </a>    </li>    <div id="box"><img id="placeholder" src="img/default.gif" alt="placeholder"/><span></span></div>    <p id="text">图片的描述</p></ul><script type="text/javascript">    //改变img的src属性:    function showPic(whichPic) { //whichpic是一个元素节点        if (!document.getElementById("placeholder")) return false;        var source = whichPic.getAttribute("href");        document.getElementById("placeholder").setAttribute("src", source);        if (document.getElementById("text")) {            document.getElementById("text").firstChild.nodeValue = whichPic.getAttribute("title");        }        return true;    }    function prepareGallery() {        if (!document.getElementsByTagName) return false;        if (!document.getElementById) return false;        if (!document.getElementById("imagegallery")) return false;        var oLi = document.getElementsByTagName("a");        for (var i = 0; i < oLi.length; i++) {            oLi[i].onclick = function () {                showPic(this);                return !showPic(this);            }        }    }    window.onload = prepareGallery;</script></body></html>
8.1-100不能被3整除的数相加【递归】

代码如下:

function sum(n) {    if (n === 0) {        return 0;    }    if (n % 3 === 0) {        return sum(n - 1);    }    return n + sum(n - 1);}console.log(sum(100));
9.1-10能被2整除的数相乘【递归】

代码如下:

function sum(n) {    if (n === 1) {        return 1;    }    if (n % 2 === 0) {        return sum(n - 1);    }    return n * sum(n - 1);}console.log(sum(10));
10.给列表中标题下方第一行的内容加粗【DOM】

原网页效果如图:

对应HTML代码:

<h1>军事新闻</h1><li>轰-20近期密集露面?美国披露中国战略计划 中美战略平衡将被打破</li><li>日本又背后搞事!这次竟盯上了中国刚列装的歼20</li><li>美友军又击落一架俄武装直升机,专家称俄叙联军这次轻敌代价太大</li><li>又一黑科技在中国成为现实,即将运用到军事上</li><h1>体育新闻</h1><li>周琦8+2火箭狂胜上海 书豪16分篮网胜</li><li>世预赛-明2:45播西班牙 阿根廷0-0跌第6</li><li>经纪人证实安帅或赴中国 权健辟谣将换帅</li><li>曝皮克夏奇拉分手 皇马挖凯恩热刺拒谈判</li><h1>娱乐新闻</h1><li>定了!《战狼2》竞争本届奥斯卡“最佳外语片”</li><li>吴绮莉发文祝福出柜女儿:不管怎样永远爱你</li><li>与毛晓彤分手因劈腿?曝陈翔出轨孙骁骁闺蜜</li><li>教子有方!张柏芝从小就教育儿子乐于助人</li>

要给列表中标题下方第一行的内容加粗,加粗后效果图:


js代码如下:

var oH1 = document.getElementsByTagName("h1");function h1_nextNode(node) {    if (node.nodeType === 1) {        return node;    } else {        return h1_nextNode(node.nextSibling);    }}for (var i = 0; i < oH1.length; i++) {    var oLi = h1_nextNode(oH1[i].nextSibling);    oLi.style.fontWeight = "bold";}
11.数组的冒泡排序

算法分析:
冒泡排序的基本思想是每次比较两个相邻的元素,如果顺序错误就把他们交换过来
两次循环,外面的循环表示需要循环多少轮,里面的循环表示每一轮中需要比较的次数。外层循环需要循环长度减一次,内层循环次数参考外层,是长度减去外层循环的次数。
代码如下:

function bubbleSort(arr) {    for (var i = 0; i < arr.length - 1; i++) {        for (var j = 0; j < arr.length - i - 1; j++) {            if (arr[j] > arr[j + 1]) {                arr[j] += arr[j + 1];                arr[j + 1] = arr[j] - arr[j + 1];                arr[j] -= arr[j + 1];            }        }    }    return arr;}
12.数组的快速排序

算法分析:
在数组中找一个基准点(一般为数组的中间项),用基准点与数组中其他项进行比较。重复上面的步骤,直到每边只有一个时停止。
代码如下:

function quickSort(arr) {    if (arr.length <= 1) return arr;    var pointIndex = Math.floor(arr.length / 2); //找到基准点索引    var pointValue = arr.splice(pointIndex, 1)[0]; //删除基准点,并获得该值    var left = [];    var right = [];    for (var i = 0; i < arr.length; i++) {        arr[i] < pointValue ? left.push(arr[i]) : right.push(arr[i]);    }    return quickSort(left).concat([pointValue], quickSort(right));}
13.数组的插入排序

算法分析:
首先将数组第1个数看成是一个有序序列。将数组的第2个数按照关键字大小插入到这个有序序列中,插入后得到了一包含两个数的有序序列。接下来再重复上面的步骤将第3,第4……第n-1个数分别插入到该有序序列中,最终得到一个包含n个数的有序序列。
代码如下:

function insertSort(arr) {    var newArr = [];    newArr.push(arr[0]); //把第一项放进空数组中    for (var i = 1; i < arr.length; i++) {        var cur = arr[i]; //从第二项开始遍历        for (var j = newArr.length - 1; j >= 0;) { //循环新建的数组            if (cur < newArr[j]) { //如果数组中的值比新建数组中的值小,就跟新建数组中的下一项比较                j--;                if (j === -1) {                    newArr.unshift(cur); //把该值加入到数组开头                }            } else {                newArr.splice(j + 1, 0, cur); //把cur加在索引是j+1数字的前面                j = -1; //退出循环,或者break;            }        }    }    return newArr;}
14.编写位置改变动画函数【DOM编程艺术】

moveElement函数传入元素id,位置及时间,可产生动画效果
positionMessage函数来设置元素初始位置(如果原来有可忽略)
addLoadEvent函数用来执行
代码如下

/* 参数说明: * elementID:打算移动元素的ID, * final_x:该元素的目的地的“左”位置, * final_y:该元素的目的地的“上”位置, * interval:两次移动之间的停顿时间 */ function moveElement(elementID, final_x, final_y, interval) {    var ele = document.getElementById(elementID);    var xpos = parseInt(ele.style.left);    var ypos = parseInt(ele.style.top);    if (xpos === final_x && ypos === final_y) return true;    if (xpos < final_x) xpos++;    if (xpos > final_x) xpos--;    if (ypos < final_y) ypos++;    if (ypos > final_y) ypos--;    ele.style.left = xpos + "px";    ele.style.top = ypos + "px";    movement = setTimeout(function () {        moveElement(elementID, final_x, final_y, interval);    }, interval);}function positionMessage() {    var ele = document.getElementById("p");    ele.style.position = "absolute";    ele.style.left = "10px";    ele.style.top = "20px";    moveElement("p", 200, 200, 1);}addLoadEvent(positionMessage);function addLoadEvent(f) {    var oldonload = window.onload;    if (typeof window.onload != 'function') {        window.onload = f;    } else {        window.onload = function () {            oldonload();            f();        }    }}
15.DOM动画实例【DOM编程艺术】

有如下页面:
这里写图片描述
代码如下:

<h1>Web Design</h1><p>These are the things you should know.</p><ol id="linklist">    <li>        <a href="structure.html">Structure</a>    </li>    <li>        <a href="presentation.html">Presentation</a>    </li>    <li>        <a href="behavior.html">Behavior</a>    </li></ol>

在列表的下面插入一张缩略图图片:
这里写图片描述
效果是鼠标在三个列表链接上滑动时,图片也跟着运动
首先插入图片:

<div id="slideshow">    <img src="img/topics.gif" alt="building blocks of web design" id="preview"/></div>

效果如下:
这里写图片描述

图片是400*100的,然而只想显示其中100*100的部分,需要用到CSS来处理。

#slideshow {    width: 100px;    height: 100px;    position: relative;    overflow: hidden;}

此时只显示了第一张图片。接下来通过DOM来实现左右移动。
可以使用上面写好的moveElement函数。
首先创建一个 prepareSlideshow函数来设定图片的样式并为mouseover事件添加动画,代码如下:

function prepareSlideshow() {    //设定图片的位置    var preview = document.getElementById("preview");    preview.style.position = "absolute";    preview.style.left = "0px";    preview.style.top = "0px";    //获得列表中的链接    var list = document.getElementsByTagName("a");    //为mouseover事件添加动画    list[0].onmouseover = function () {        moveElement("preview", -100, 0, 10);    };    list[1].onmouseover = function () {        moveElement("preview", -200, 0, 10);    };    list[2].onmouseover = function () {        moveElement("preview", -300, 0, 10);    };}

此时,由于变量作用域的问题,当鼠标在链接之间快速移动的时候,因为movement是全局作用域,不管moveElement函数是否执行完,都会进行下一项操作,此时moveElement函数会试图把图片拉向两个方向,甚至会出现滞后停止的情况,为了消除该影响,可以使用自定义属性的方式来解决,解决后的moveElement函数代码如下:

function moveElement(elementID, final_x, final_y, interval) {    var ele = document.getElementById(elementID);    //改进的代码:    if (ele.movement) {        clearTimeout(ele.movement);    }    var xpos = parseInt(ele.style.left);    var ypos = parseInt(ele.style.top);    if (xpos === final_x && ypos === final_y) return true;    if (xpos < final_x) xpos++;    if (xpos > final_x) xpos--;    if (ypos < final_y) ypos++;    if (ypos > final_y) ypos--;    ele.style.left = xpos + "px";    ele.style.top = ypos + "px";    //改进的代码:    ele.movement = setTimeout(function () {        moveElement(elementID, final_x, final_y, interval);    }, interval);}

该元素在moveElement执行的时候会获得一个movement属性,但是如果在开始执行的时候就有movement属性的话就说明上一次已经执行过动画,用setTimeOut进行复位。
此时moveElement在移动时,每次只移动一个像素,移动较慢。为了加快移动速度,可以进行如下改进:当元素距离其目的地较远的时候,移动步数较大;较近时,移动步数较小。
改进后代码如下:

function moveElement(elementID, final_x, final_y, interval) {    var ele = document.getElementById(elementID);    if (ele.movement) {        clearTimeout(ele.movement);    }    var xpos = parseInt(ele.style.left);    var ypos = parseInt(ele.style.top);    var dist = 0;    if (xpos === final_x && ypos === final_y) return true;    if (xpos < final_x) {        dist = Math.ceil((final_x - xpos) / 10);        xpos += dist;    }    if (xpos > final_x) {        dist = Math.ceil((xpos - final_x) / 10);        xpos -= dist;    }    if (ypos < final_y) {        dist = Math.ceil((final_y - ypos) / 10);        ypos += dist;    }    if (ypos > final_y) {        dist = Math.ceil((ypos - final_y) / 10);        ypos -= dist;    }    ele.style.left = xpos + "px";    ele.style.top = ypos + "px";    ele.movement = setTimeout(function () {        moveElement(elementID, final_x, final_y, interval);    }, interval);}

改进moveElement函数:如果传入id对应元素的位置没有被设置,那么函数会出错,为了避免该错误,可以加入以下代码:

if (!ele.style.left) {    ele.style.left = "0px";}if (!ele.style.top) {    ele.style.top = "0px";}

该案例的完整代码如下:(可以增加浏览器兼容的安全判断)

<!doctype html><html lang="lang"><head>    <meta charset="UTF-8">    <title>Explaining the Document Object Model</title>    <style type="text/css">        #slideshow {            width: 100px;            height: 100px;            position: relative;            overflow: hidden;        }    </style></head><body><h1>Web Design</h1><p>These are the things you should know.</p><ol id="linklist">    <li>        <a href="structure.html">Structure</a>    </li>    <li>        <a href="presentation.html">Presentation</a>    </li>    <li>        <a href="behavior.html">Behavior</a>    </li></ol><div id="slideshow">    <img id="preview" src="img/topics.gif" alt="building blocks of web design"/></div><script type="text/javascript">    /* 参数说明:     * elementID:打算移动元素的ID,     * final_x:该元素的目的地的“左”位置,     * final_y:该元素的目的地的“上”位置,     * interval:两次移动之间的停顿时间     */    function moveElement(elementID, final_x, final_y, interval) {        var ele = document.getElementById(elementID);        if (ele.movement) {            clearTimeout(ele.movement);        }        if (!ele.style.left) {            ele.style.left = "0px";        }        if (!ele.style.top) {            ele.style.top = "0px";        }        var xpos = parseInt(ele.style.left);        var ypos = parseInt(ele.style.top);        var dist = 0;        if (xpos === final_x && ypos === final_y) return true;        if (xpos < final_x) {            dist = Math.ceil((final_x - xpos) / 10);            xpos += dist;        }        if (xpos > final_x) {            dist = Math.ceil((xpos - final_x) / 10);            xpos -= dist;        }        if (ypos < final_y) {            dist = Math.ceil((final_y - ypos) / 10);            ypos += dist;        }        if (ypos > final_y) {            dist = Math.ceil((ypos - final_y) / 10);            ypos -= dist;        }        ele.style.left = xpos + "px";        ele.style.top = ypos + "px";        ele.movement = setTimeout(function () {            moveElement(elementID, final_x, final_y, interval);        }, interval);    }    function prepareSlideshow() {        //设定图片的位置        var preview = document.getElementById("preview");        preview.style.position = "absolute";        preview.style.left = "0px";        preview.style.top = "0px";        //获得列表中的链接        var list = document.getElementsByTagName("a");        //为mouseover事件添加动画        list[0].onmouseover = function () {            moveElement("preview", -100, 0, 10);        };        list[1].onmouseover = function () {            moveElement("preview", -200, 0, 10);        };        list[2].onmouseover = function () {            moveElement("preview", -300, 0, 10);        };    }    addLoadEvent(prepareSlideshow);    function addLoadEvent(f) {        var oldonload = window.onload;        if (typeof window.onload != 'function') {            window.onload = f;        } else {            window.onload = function () {                oldonload();                f();            }        }    }</script></body></html>
16.类数组转为数组
function listToArray(likeAry) {    var ary = [];    try {        ary = Array.prototype.slice.call(likeAry);    } catch (e) {        for (var i = 0; i < likeAry.length; i++) {            ary[ary.length] = likeAry[i];        }    }    return ary;}
17.HTML创建视频控件【DOM编程艺术】

效果图:
这里写图片描述

HTML代码:

<!doctype html><html lang="lang"><head>    <meta charset="UTF-8">    <title></title>    <link rel="stylesheet" href="HTML5.css"/></head><body><div class="video-wrapper">    <video id="movie" controls>        <source src="video/oceans-clip.mp4"/>        <source src="video/oceans-clip.webm" type='video/webm,codecs="vp8,vorbis"'/>        <source src="video/oceans-clip.ogv" type='video/ogg; codecs="theora, vorbis"'/>        <p>Download movie as            <a href="video/oceans-clip.mp4">mp4</a>            <a href="video/oceans-clip.webm">webm</a>            <a href="video/oceans-clip.ogv">ogv</a>        </p>    </video></div><script src="HTML5.js"></script></body></html>

JavaScript代码:

//对video元素应用addControls函数function createVideoControls() {    var vids = document.getElementsByTagName("video");    for (var i = 0; i < vids.length; i++) {        addControls(vids[i]);    }}//删除原来的controls属性,添加播放暂停功能function addControls(vid) {    vid.removeAttribute("controls"); //删除原来的controls属性    //设置视频的宽高尺寸    vid.height = vid.videoHeight;    vid.width = vid.videoWidth;    vid.parentNode.style.height = vid.videoHeight + "px";    vid.parentNode.style.width = vid.videoWidth + "px";    //新建一个div元素,class属性是controls    var controls = document.createElement("div");    controls.setAttribute("class", "controls");    //新建一个按钮元素,title属性为play,按钮的内容是►    var play = document.createElement("button");    play.setAttribute("title", "play");    play.innerHTML = "&#x25BA;";    //把按钮放在div中    //在video元素的父元素后添加div元素,位于video元素之前    controls.appendChild(play);    vid.parentNode.insertBefore(controls, vid);    //给按钮添加点击事件    play.onclick = function () {        //如果播放结束,视频中的当前播放位置为0        if (vid.ended) {            vid.currentTime = 0;        }        //如果点击暂停按钮,开始播放视频,否则暂停        if (vid.paused) {            vid.play();        } else {            vid.pause();        }    };    vid.addEventListener("play", function () {        play.innerHTML = "&#2590;&#2590;";        play.setAttribute("paused", true);    }, false);    vid.addEventListener("pause", function () {        play.removeAttribute("paused");        play.innerHTML = "&#x25BA;";    }, false);    vid.addEventListener("ended", function () {        vid.pause();    }, false);}window.onload = function () {    createVideoControls();}
18.把JSON格式的字符串转换为JSON格式的对象

JSON.parse:把JSON格式的字符串转换为JSON格式的对象
JSON.stringify:把JSON格式的对象转换为JSON格式的字符串
但是,在IE6和7中,window下没有JSON对象,parse和stringify都不存在
故,兼容模式代码:

function json(jsonStr) {    return 'JSON' in window ? JSON.parse(jsonStr) : eval("(" + jsonStr + ")");}
19.【DOM方法扩展】children——作用:获取某一个容器中所有的元素子节点(还可以筛选出指定标签名)

children方法在非标准浏览器下不兼容
算法分析:首先获取所有的子节点(childNode),在所有的子节点中,把元素节点过滤出来,即nodeType===1。如果多传一个标签名,进行二次筛选,获取指定标签名的集合。代码如下:

//curEle获取到的元素,tagName要筛选的标签名function children(curEle, tagName) {    var ary = [];    if (/MSIE (6|7|8)/i.test(navigator.userAgent)) {        var nodeList = curEle.childNodes;        for (var i = 0; i < nodeList.length; i++) {            nodeList[i].nodeType === 1 ? ary[ary.length] = nodeList[i] : null;        }    } else {        ary = Array.prototype.slice.call(curEle.children);    }    if (typeof tagName === "string") {        for (var j = 0; j < ary.length; j++) {            if (ary[j].nodeName.toLowerCase() !== tagName.toLowerCase()) {                ary.splice(j, 1);                j--;            }        }    }    return ary;}
20.【DOM方法扩展】getElementsByClass——作用:通过元素的样式类名获取一组元素集合(兼容所有浏览器)

getElementsByClassName()原方法:写一个样式类名的话,只要包含这个样式类名就可以;写两个的话,只要同时包含这两个就可以,但和样式的顺序以及中间有多少个空格是没有关系的;如果不写,结果是一个空的集合

思路图解:
这里写图片描述

var flag = "getComputedStyle" in window;//className:要获取的类名//context:上下文,不写默认为documentfunction getElementsByClass(className, context) {    context = context || document;    if (flag) {        return Array.prototype.slice.call(context.getElementsByClassName(className));    }    var ary = [],        classNameAry = className.replace(/(^ +| +$)/g).split(/ +/g); //classNameAry是多个class名字的数组    var nodeList = context.getElementsByTagName("*"); //nodeList是上下文中所有标签的集合    var isOk = true;    for (var i = 0; i < nodeList.length; i++) {        for (var j = 0; j < classNameAry.length; j++) {            var reg = new RegExp("(^| +)" + classNameAry[j] + "( +|$)");            if (!reg.test(nodeList[i].className)) {                isOk = false;                break;            }        }        if (isOk) {            ary[ary.length] = nodeList[i];        }    }    return ary;}
21.【DOM方法扩展】获取上一个哥哥元素节点(prev)、获取下一个弟弟元素节点(next)、获取所有的哥哥元素节点(prevAll)、获取所有的弟弟元素节点(nextAll)、获取相邻的两个元素节点(sibling)、获取所有的兄弟元素节点(siblings)

获取上一个哥哥元素节点(prev)

prev算法分析:首先获取当前元素的上一个哥哥节点,判断是否为元素节点,不是的话基于当前的继续找上面的哥哥节点,一直找到哥哥元素节点为止,如果没有哥哥节点,返回null。代码如下:

var flag = "getComputedStyle" in window;//curEle:要查找的元素function prev(curEle) {    if (flag) {        return curEle.previousElementSibling;    }    var pre = curEle.previousSibling;    while (pre && pre.nodeType !== 1) {        pre = pre.previousSibling;    }    return pre;}

获取下一个弟弟元素节点(next)

var flag = "getComputedStyle" in window;//curEle:要查找的元素function next(curEle) {    if (flag) {        return curEle.nextElementSibling;    }    var nex = curEle.nextSibling;    while (nex && nex.nodeType !== 1) {        nex = nex.nextSibling;    }    return nex;}

获取所有的哥哥元素节点(prevAll)

//curEle:要查找的元素function prevAll(curEle) {    var pre = prev(curEle);    var ary = [];    while (pre) {        ary.unshift(pre);        pre = prev(pre);    }    return ary;}

获取所有的弟弟元素节点(nextAll)

//curEle:要查找的元素function nextAll(curEle) {    var nex = next(curEle);    var ary = [];    while (nex) {        ary.push(nex);        nex = next(nex);    }    return ary;}

获取相邻的两个元素节点(sibling)

function sibling(curEle) {    var pre = this.prev(curEle);    var nex = this.next(curEle);    var ary = [];    pre ? ary.push(pre) : null;    nex ? ary.push(nex) : null;    return ary;}

获取所有的兄弟元素节点(siblings)

function siblings(curEle) {    return this.prevAll(curEle).concat(this.nextAll(curEle));}
22.【DOM方法扩展】获取第一个元素子节点(firstChild)、获取最后一个元素子节点(lastChild)

获取第一个元素子节点(firstChild)

function firstChild(curEle) {    var chs = this.children(curEle);    return chs.length > 0 ? chs[0] : null;}

获取最后一个元素子节点(lastChild)

function lastChild(curEle) {    var chs = this.children(curEle);    return chs.length > 0 ? chs[chs.length-1] : null;}
23.【DOM方法扩展】获取当前元素索引(index)

有几个哥哥索引就是几,代码如下:

function index(curEle) {    return this.prevAll(curEle).length;}
24.【DOM方法扩展】prepend——作用:增加到某一个容器的开头(与appendChild对应)

算法分析:把新的元素添加到容器中第一个子元素节点的前面,如果一个元素子节点都没有,就放在末尾即可

function prepend(newEle, container) {    var fir = this.firstChild(container);    if (fir) {        container.insertBefore(newEle, fir);        return;    }    container.appendChild(newEle);}
25.【DOM方法扩展】insertAfter——作用:增加到容器中某一个元素的后面(与insertBefore对应)
function insertAfter(newEle, oldEle) {    var nex = this.next(oldEle);    if (nex) {        oldEle.parentNode.insertBefore(newEle, nex);        return;    }    oldEle.parentNode.appendChild(newEle);}
26.【DOM方法扩展】hasClass——作用:判断是否存在某一个样式类名
//curEle:要查找的元素//className:样式名function hasClass(curEle, className) {    var reg = new RegExp("(^| +)" + className + "( +|$)");    return reg.test(curEle.className);}
27.【DOM方法扩展】removeClass——作用:删除样式类名
function removeClass(curEle, className) {    var ary = className.replace(/(^ +| +$)/g,"").split(/ +/g);    for (var i = 0; i < ary.length; i++) {        var curName = ary[i];        if (this.hasClass(curEle, curName)) {            var reg = new RegExp("(^| +)" + curName + "( +|$)", "g");            curEle.className = curEle.className.replace(reg, " ");        }    }}
28.【DOM方法扩展】addClass——作用:给元素增加样式类名29.【DOM方法扩展】getCss、setCss、setGroupCss获取/设置/批量设置css

getCss:获取css
setCss:设置css
setGroupCss:批量设置css

30.【DOM方法扩展】getCss、setCss、setGroupCss获取/设置/批量设置css31.js中简易选项卡的实现(3种方法实现样式的封装)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办 尿液浑浊气味重怎么办 经常便秘肚子胀怎么办 顺产满月后腰疼怎么办 化验尿蛋白质高怎么办 小孩子反复蛋白尿怎么办呢? 肾上张了个囊肿怎么办 同床后出血怎么办 药物引起胃不适怎么办