DOM (Document Object Model)

2019-04-27  本文已影响0人  啃香菜的花萝萝

DOM是一套编程接口,让js能操作html和xml。

1. DOM选择器

1.1 document.getElementById()

1.2 getElementsByTagName()

<div>
  <span>sun</span>
</div>
<span></span>

<script>
  var div = document.getElementsByTagName('div')[0];
  var span = div.getElementsByTagName('span')[0];
</script>
getElementsByTagName()

1.3 getElementsByName()

1.4 getElementsByClassName()

1.5 querySelector()querySelectorAll()

<div>
  <span>
    <strong class="demo"><strong>
  </span>
</div>

<script>
  var strong = document.querySelector('div > span strong.demo')
</script>

2. 遍历节点树

<div>
  <strong></strong>
  <span></span>
  <em></em>
</div>

<script>
  var strong = document.getElementsByTagName('strong')[0];
</script>
parentNode
<div>
  <strong>
    <span></span>
  </strong>
  <span></span>
  <em></em>
</div>

<script>
  var div= document.getElementsByTagName('div')[0];
</script>
childNodes

需要注意的是,这个东西选出来的子节点们,是会把所有类型的子节点都选出来。什么 文本节点,注释节点,元素节点... ...(节点的类型在后文会有写)

<div>
  <strong>
    <span></span>
  </strong>
  <span></span>
  <em></em>
</div>
<script>
  var strong = document.getElementsByTagName('strong')[0];
</script>
nextSibling 可以看到 strong的下一个兄弟节点是文本节点,再下一个兄弟节点是 span ... ...

3. 基于元素节点树的遍历

下面这些方法遍历时,是基于真正的元素节点;即文本节点,注释节点等等都不会识别了。
注意: 下面的 ie不兼容 指的是 ie9 和 ie9 以下的。

<div>
  sun
  <!-- 嘤嘤嘤 -->
  <strong></strong>
  <span></span>
</div>
<script>
  var strong = document.getElementsByTagName('strong')[0];
</script>

需要明白的是,document自成一个节点,不是元素节点。也就是 parentElement 和 上面那个parentNode出来结果不一样的地方。

parentElement
<div>
  <!-- 嘤嘤嘤 -->
  <strong></strong>
  <span></span>
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>
children
<div>
  <strong></strong>
  <span></span>
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>
firstElementChild/ lastElementChild

3.1 节点的四个属性

<div>
   sun
  <!--嘤嘤嘤-->
  <strong></strong>
  <span></span>
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>
nodeName

3.2 节点的类型

3.4 节点的一个方法Node.hasChildNodes()
返回值: true / false

<div>
  <strong></strong>
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>
hasChildNodes()
注意: 是找有没有节点,不是有没有元素节点,所以下列两种情况皆返回 true
<!--这坨div中含有注释节点-->
<div>
  <!--嘤嘤嘤-->
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>
<!--这坨div中含有文本节点-->
<div>
</div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>

下面这种情况返回 false:

<div></div>
<script>
  var div= document.getElementsByTagName('div')[0];
</script>

4. DOM结构树 (表示一种继承关系)

DOM结构树

即: HTMLDocument.prototype = { __proto__: Document.prototype}


5. DOM 基本操作

5.1 增

5.2 插

<body>
    <script>
        var div = document.createElement('div');
        document.body.appendChild(div);
    </script>
</body>
appendChild()

如果把页面中已经存在的一个部分,appendChild去另一个部分,做的是 剪切 操作。

<body>
    <div></div>
    <span></span>

    <script>
        var div = document.getElementsByTagName('div')[0];
        var span = document.getElementsByTagName('span')[0];
        div.appendChild(span);
    </script>
</body>
效果
<body>
    <div>
        <span></span>
    </div>
   
    <script>
        var div = document.getElementsByTagName('div')[0];
        var span = document.getElementsByTagName('span')[0];
        var strong = document.createElement('strong');
        div.insertBefore(strong, span);
    </script>
</body>
效果

5.3 删

<body>
    <div>
        <span></span>
        <i></i>
        <strong></strong>
    </div>
   
    <script>
        var div = document.getElementsByTagName('div')[0];
        var i = document.getElementsByTagName('i')[0];
        div.removeChild(i);
    </script>
</body>
效果
<body>
    <div>
        <span></span>
        <i></i>
        <strong></strong>
    </div>
   
    <script>
        var div = document.getElementsByTagName('div')[0];
        var span = document.getElementsByTagName('span')[0];
        span.remove();
    </script>
</body>
效果

5.4 替换

<body>
    <div>
        <span></span>
        <i></i>
        <strong></strong>
    </div>
   
    <script>
        var div = document.getElementsByTagName('div')[0];
        var span = document.getElementsByTagName('span')[0];
        var p = document.createElement('p'); 
    </script>
</body>
Example

5.4 Element 节点的一些属性

<body>
    <div>
        <span>sun</span>
        <p>sweet</p>
    </div>
   
    <script>
        var div = document.getElementsByTagName('div')[0];
    </script>
</body>
Example

5.5 Element 节点的一些方法

<body>
    <div></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        div.setAttribute('class', 'test');
    </script>
</body>
效果

6. date对象

日期对象 Date()。打印当前是何年何月何日何时,几分几秒。

var date = new Date();
Result
  1. getDate()
    这个方法会返回今天是这个月中的第几天 (今天是5月1)


    getDate()
  2. getDay()
    这个方法会返回今天是一周中的第几天(0~6)

    注意: 周天是第一天 getDay()
  3. getMonth()
    这个方法会返回当前是几月(0 ~11)

    注意: 从0开始计算,1月为0 getMonth()
  4. getFullYear()

    这个方法会返回当前是几几年 getFullYear()
  5. getHours()/ getMinutes()/ getSeconds()
    返回Date对象的小时/分钟/秒数

    注意:这个返回的是创建时候那个时刻的时分秒 (我电脑的时间是 14:01) result
  6. getTime() 重点嗷~~~

<script>
  var firstTime = new Date().getTime();
  for(var i=0; i<1000000; i++) {}  
  var lastTime = new Date().getTime();
  console.log(lastTime - firstTime);
</script>
getTime()
  1. setDate()

    这个方法可以设置Date对象中 月的某一天(1~31) setDate()
  2. toString()
    把 Date对象转换为字符串


    toString()

7. js定时器

注意:都是全局对象 window 上的方法,内部函数 this 指向 window。

  1. setInterval()
var timer = setInterval(function() {
  console.log('sun');
}, 1000) ;
  1. setTimeout()
var timer = setTimeout(function () {
  console.log('sun');
}, 1000);
  1. clearInterval()
    清除定时器
var i = 0;
var timer = setInterval(function() {
  console.log(i ++);
  if (i > 10) {
    clearInterval(timer);
  }
}, 10) ;
  1. clearTimeout()
var timer = setTimeout(function() {
  console.log('a');
}, 1000);
clearTimeout(timer);

8. 用dom获取界面尺寸

1. 查看滚动条的滚动距离
语法: window.pageXOffset/ pageYOffset (IE及IE8以下不兼容)
语法: document.body/documentElement.scrollLeft/ scrollTop(IE8及IE8以下用这个方法去求滚动条的滚动距离)
注意: IE8和IE8以下以下的浏览器, document.body.scrollLeft/Topdocument.documentElement.scrollLeft/Top这两个由于兼容性问题,只有一个会生效。所以说以后用的话直接把两个加一加。

document.body.scrollLeft + document.documentElement.scrollLeft
result

封装一个方法,使滚动条的滚动距离能兼容所有浏览器

function getScrollOffset() {
  if(window.pageXOffset) {
    return {
      x: window.pageXOffset,
      y: window.pageYOffset
    }
  } else {
      return {
        x: document.body.scrollLeft + document.documentElement.scrollLeft,
        y: document.body.scrollTop + document.documentElement.scrollTop
      }
    }
}
效果

2. 查看可视区窗口的尺寸
可视区窗口其实就是 html 文档的部分。
语法:window.innerWidth/innerHeight (IE8及IE8以下不兼容)
语法:document.documentElement.clientWidth/clientHeight (标准模式下,任意浏览器都兼容; IE8及IE8以下是可以兼容的)
语法: document.body.clientWidth/clientHeight (怪异/ 混杂模式模式下; IE8及IE8以下是可以兼容的)

科普:混杂模式启用方法
<!DOCTYPE html> 这句话删了就启用了混杂模式了。写了这句话就是标准模式。
封装一个方法,获取可视区窗口的尺寸,兼容所有浏览器

function getViewportOffset() {
  if(window.innerWidth) {
    return {
      w: window.innerWidth,
      h: window.innerHeight
    }
  }  else {
      if (document.compatMode === "BackCompat") {
        return {
          w: document.body.clientWidth,
          h: document.body.clientHeight
        }
      } else {
        return {
          w: document.documentElement.clientWidth,
          h: document.documentElement.clientHeight
        }
      }
   }
}

3. 查看元素的几何尺寸
该方法兼容性很好。 任何一个dom元素都有这个方法。
语法: domEle.getBoundingClientRect()
该方法返回一个对象。需要注意的是,这个返回的结果并不是实时的。(讲道理,这个方法没什么用,稍微看一看。)

<body>
    <div style="width: 50px; height: 50px; background-color: pink; 
    position: absolute; left: 100px; top: 100px;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
    </script>
</body>
效果

4. 查看元素尺寸
语法: dom.offsetWidth, dom.offsetHeight

查看元素尺寸

5. 查看元素的位置
语法:dom.offsetLeftdom.offsetTop
注意:这个方法会忽略元素自身是否是定位元素,求得值是距离它有定位的父级的坐标。如果对于无定位父级的元素,则返回的值是相对文档的坐标。
语法:dom.offsetParent
该方法能求出相对于最近的有定位的父级,如果没有,就返回body

6. 让滚动条滚动
window上有三个方法:

<div style="width: 5000px; height: 5000px; 
border: 1px solid black"></div>
效果

9. 脚本化 CSS

  1. 读写元素css属性
<body>
  <div style="width: 50px; height: 50px; background-color:pink;"></div>
  <script>
    var div = document.getElementsByTagName('div')[0];
    div.style.backgroundColor = 'red';
    div.style.width = '200px';
  </script>
</body>
效果
  1. 查询计算样式
    获取的是当前元素所展示出的一切css的显示值

所以IE8和IE8以下的浏览器,查询样式使用的方法如下:

封装兼容性方法获取css style

function getStyle(elem, prop) {
  if(window.getComputedStyle) {
    return window.getComputedStyle(elem, null)[prop];
  } else {
    return elem.currentStyle[prop];
  }
}

10. 事件

1. 绑定事件的几种方法

<div></div>
... ...
var div = document.getElementsByTagName('div')[0];
div.onclick = function() {
  this.style.backgroundColor = 'green';
}
div.addEventListener('click', function() {
  
} , false);

div.attachEvent('onclick', function() {
  handle.call(div);
})
function handle() {
  this.xxx = xxxxxxxxx;
}

封装兼容性方法 addEvent(elem, type, handle)

function addEvent(elem, type, handle) {
  if (elem.addEventListener) {
    elem.addEventListener(type, handle, false);
  } else if(elem.attachEvent) {
    elem.attachEvent('on' + type, function () {
      handle.call(elem);
    })
  } else {
    elem['on' + type] = handle;
  }
}

2. 解除事件处理程序
注意:如果绑定的是匿名函数,则无法解除。

var div = document.getElementsByTagName('div')[0];
// 只执行一次事件
div.onclick = function() {
  console.log('a');
  this.onclick = null;
}
var div = document.getElementsByTagName('div')[0];
function test() {
  console.log('sun');
}
div.addEventListener('click', test, false);
div.removeEventListener('click', test, false);

11. 事件处理模型

一个对象的一个事件类型只能遵循一种模型。
如果一个对象的一个事件类型上绑定了两个函数,两个函数分别遵循捕获和冒泡,那么执行顺序为 先捕获后冒泡

1. 事件冒泡
<style>
  .wrapper{
    width: 300px;
    height: 300px;
    background-color: red;
  }
  .content {
    width: 200px;
    height: 200px;
    background-color: green;
  }
  .box {
    width: 100px;
    height: 100px;
    background-color: yellow;
  }
</style>
... ...
<body>
    <div class="wrapper">
        <div class="content">
            <div class="box"></div>
        </div>
    </div>
    
    <script>
        var wrapper = document.getElementsByClassName('wrapper')[0];
        var content = document.getElementsByClassName('content')[0];
        var box = document.getElementsByClassName('box')[0];

        wrapper.addEventListener('click', function() {
            console.log('wrapper');
        }, false);
        content.addEventListener('click', function() {
            console.log('content');
        }, false);
        box.addEventListener('click', function() {
            console.log('box');
        }, false);
    </script>
</body>
事件冒泡
2. 事件捕获
<style>
  .wrapper{
    width: 300px;
    height: 300px;
    background-color: red;
  }
  .content {
    width: 200px;
    height: 200px;
    background-color: green;
  }
  .box {
    width: 100px;
    height: 100px;
    background-color: yellow;
  }
</style>
... ...
<body>
    <div class="wrapper">
        <div class="content">
            <div class="box"></div>
        </div>
    </div>
    
    <script>
        var wrapper = document.getElementsByClassName('wrapper')[0];
        var content = document.getElementsByClassName('content')[0];
        var box = document.getElementsByClassName('box')[0];

        wrapper.addEventListener('click', function() {
            console.log('wrapper');
        }, true);
        content.addEventListener('click', function() {
            console.log('content');
        }, true);
        box.addEventListener('click', function() {
            console.log('box');
        }, true);
    </script>
</body>
事件捕获
3. 阻止事件冒泡
<style>
  .wrapper {
    width: 300px;
    height: 300px;
    background-color: red;
  }
</style>
... ...
<body>
    <div class="wrapper"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        document.onclick = function() {
            console.log('点我干啥');
        }
        div.onclick = function(e) {
            e.stopPropagation();
            this.style.background = "orange";
        }
    </script>
</body>
<body>
    <div class="wrapper"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        document.onclick = function() {
            console.log('点我干啥');
        }
        div.onclick = function(e) {
            e.cancelBubble = true;
            this.style.background = "orange";
        }
    </script>
</body>
function stopBubble(event) {
  if (event.stopPropagation) {
    event.stopPropagation();
  } else {
    event.cancelBubble = true;
  }
}
4. 阻止默认事件

默认事件 —— 表单提交, a标签跳转, 右键菜单等。
科普科普,右键出菜单事件 document.oncontextmenu = function() {}

document.oncontextmenu = function() {
  console.log('a');
  return false;
}
document.oncontextmenu = function(e) {
  console.log('a');
  e.preventDefault();
}
document.oncontextmenu = function(e) {
  console.log('a');
  e.returnValue = false;
}
// 使用
document.oncontextmenu = function(e) {
  console.log('sun');
  cancelHandler(e);
};
// 封装的函数
function cancelHandler(e) {
  if (e.preventDefault) {
    e.preventDefault();
  } else {
    e.returnValue = false;
  }
}
5. 事件对象
<script>
  var div = document.getElementsByTagName('div')[0];
  div.onclick = function(e) {
    var event = e || window.event;
    console.log(event);
  }
</script>
6. 事件委托
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
    
    <script>
        var ul = document.getElementsByTagName('ul')[0];
        ul.onclick = function(e) {
            var event = e || window.event;
            var target = event.target || event.srcElement;
            console.log(target.innerText);
        }
    </script>
</body>

12. 事件分类

1. 鼠标事件
document.onmousedown = function(e) {
  console.log(e);
  if (e.button == 2) {
    console.log('right');
  } else if (e.button == 0) {
    console.log('left');
  }
}
左键点击,button为0
右键点击,button为2
var firstTime = 0;
var lastTime = 0;
var key = false;

document.onmousedown = function() {
  firstTime = new Date().getTime();
}
document.onmouseup = function() {
  lastTime = new Date().getTime();
  if (lastTime - firstTime < 300) {
    key = true;
  }
}
document.onclick = function() {
  if (key) {
    console.log('click');
    key = false;
  } 
}
2. 键盘事件
<script>
  document.onkeypress = function (e) {
    console.log(String.fromCharCode(e.charCode));
  }
</script>
3. 移动端事件
4. 事件分类
<input type="text">
... ...
// 但凡文本有变化,就会触发input事件
var input = document.getElementsByTagName('input')[0];
input.oninput = function (e) {
  console.log(this.value);
}

// 聚焦,改变内容,失去焦点,触发change事件
input.onchange= function (e) {
  console.log(this.value);
}
window.onscroll = function () {
  console.log(window.pageXOffset + ' ' + window.pageYOffset);
}
window.onload = function () {
  // 没事情别用这个瓜皮方法
} 

小知识:
浏览器有个时间线:
(html和css是并行解析的)
html在解析的时候会形成一个 domTree;所有的dom解析完毕,不是下载完。
css在解析的时候会形成一个 cssTree;
这俩会形成一个 renderTree;


练习
  1. 遍历元素节点树 (在原型链上编程)
  2. 封装函数,返回元素e的第n层祖先元素节点
function retParent(elem, n) {
 while(elem && n) {
    elem = elem.parentElement;
    n--;
  }
  return elem;
}
  1. 封装函数,返回元素e的第n个兄弟元素节点,n为正,返回后面的兄弟元素节点,n为负,返回前面的,n为0,返回自己。
function retSibling(e, n) {
  while(e && n) {
    if(n > 0) {
      e = e.nextElementSibling;
      n--;
    } else {
      e = e.previousElementSibling;
      n++;
    }
    return e;
  }
}
function retSibling(e, n) {
  while(e && n) {
    if(n > 0) {
      if(e.nextElementSibling) {
        e = e.nextElementSibling;
      } else {
        for(e=e.nextSibling; e && e.nodeType  != 1; e = e.nextSibling);
      }
      n--;
    } else {
      if(e.previousElementSibling) {
        e = e.previousElementSibling;
      } else {
        for(e = e.previousSibling; e && e.nodeType != 1; e = e.previousSibling);
      }
      n++;
    }
    return e;
  }
}
  1. 编辑函数,封装myChildren功能,解决以前部分浏览器的兼容性问题。(找该元素的子元素节点)
Element.prototype.myChildren = function() {
  var child = this.childNodes;
  var len = child.length;
  var arr = [];
  for(var i=0; i<len; i++) {
    if(child[i].nodeType ==1) {
      arr.push(child[i]);
    }
  }
  return arr;
}
  1. 自己封装hasChildren()方法,不可用children属性。
Element.prototype.myChildren = function() {
  var child = this.childNodes;
  var len = child.length;
  for(var i=0; i<len; i++) {
    if(child[i].nodeType ==1) {
      return true;
    }
  }
  return false;
}
  1. 请编写一段 JavaScript脚本生成下面这段DOM结构。要求,使用标准的DOM方法或属性。
    <div class="example">
    <p class="content"></p>
    </div>
<body>
    <script>
        var div = document.createElement('div');
        var p = document.createElement('p');
        div.setAttribute('class', 'example');
        p.setAttribute('class', 'content');
        p.innerHTML = '这里是仙女萝';
        div.appendChild(p);
        document.body.appendChild(div);
    </script>
</body>
效果
  1. 封装函数 insertAfter();功能类似 insertBefore();
<body>
    <div>
        <i></i>
        <b></b>
        <span></span>
    </div>

    <script>
        Element.prototype.insertAfter = function(targetNode, afterNode) {
            var beforeNode = afterNode.nextElementSibling;
            if(beforeNode == null) {
                this.appendChild(targetNode);
            } else {
                this.insertBefore(targetNode, beforeNode);
            }            
        }
        var div = document.getElementsByTagName('div')[0];
        var i = document.getElementsByTagName('i')[0];
        var b = document.getElementsByTagName('b')[0];
        var span = document.getElementsByTagName('span')[0];
        var p = document.createElement('p');
    </script>
</body>
效果
  1. 将目标节点内部的节点顺序逆序
    example: <div><a></a><em></em></div>
    <div><em></em><a></a></div>
<body>
    <div>
        <i></i>
        <b></b>
        <span></span>
    </div>

    <script>
        var div = document.getElementsByTagName('div')[0];
        Element.prototype.reverseChild = function() {
            var arr = this.children;
            for(let i = arr.length-1; i > 0; i --) {
                // console.log(arr[i-1]);
                this.appendChild(arr[i-1]);
            }
        }
    </script>
</body>
效果
  1. 计时器,到三分钟停止
<body>
    minutes: <input type="text" value="0">
    seconds: <input type="text" value="0">

    <script>
        var minutesNode = document.getElementsByTagName('input')[0];
        var secondsNode = document.getElementsByTagName('input')[1];
        var minutes = 0, 
            seconds = 0;
        var timer = setInterval(function() {
            seconds ++;
            if(seconds === 60) {
                seconds = 0;
                minutes ++;
            }
            secondsNode.value = seconds;
            minutesNode.value = minutes;
            if(minutes == 3) {
                clearInterval(timer);
            }
        }, 1000);
    </script>
<body>

10 . 让小方块移动

<body>
    <div style="width: 100px; height: 100px; background-color:pink;
    position: absolute; left: 0; top: 0;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        
        function getStyle(elem, prop) {
            if(window.getComputedStyle) {
                return window.getComputedStyle(elem, null) [prop];
            } else {
                return elem.currentStyle[prop];
            }
        }

        var timer = setInterval(function() {
            div.style.left = parseInt(getStyle(div, 'left')) + 10 + 'px';
            if(parseInt(div.style.left) > 500) {
                clearInterval(timer);
            }
        }, 100)
    </script>
</body>
  1. 使用原生js,addEventListener,给每个li元素绑定一个click事件,输出他们的顺序。
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
  var liCol = document.getElementsByTagName('li');
  var len = liCol.length;
  for(var i=0; i<len; i++) {
    (function(i) {
      liCol[i].addEventListener('click', function() {
        console.log(i);
      }, false)
    }(i))
  }
</script>
  1. 取消a标签默认事件
var a = document.getElementsByTagName('a')[0];
a.onclick = function() {
  return false;
}
<a href="javascript:void(0)">demo</a>
  1. 小方块拖拽
<body>
    <div style="width: 100px; height: 100px; background-color: orange; 
    position:absolute; left: 0; top: 0;"></div>
    
    <script>
        var div = document.getElementsByTagName('div')[0];
        var disX,
            disY;

        div.onmousedown = function(e) {
            disX = e.pageX - parseInt(div.style.left);
            disY = e.pageY - parseInt(div.style.top);
            document.onmousemove = function (e) {
                var event = e || window.event;
                console.log(e.pageX + " " + e.pageY);
                div.style.left = event.pageX - disX + 'px';
                div.style.top = event.pageY -disY + 'px';
            }   
            document.onmouseup = function() {
                document.onmousemove = null;
            }
        }
    </script>
</body>
<script>
  // 阻止默认事件
  function cancelHandler(e) {
    if (e.preventDefault) {
      e.preventDefault();
    } else {
      e.returnValue = false;
    }
  }

  // 阻止冒泡
  function stopBubble(event) {
    if (event.stopPropagation) {
      event.stopPropagation();
    } else {
      event.cancelBubble = true;
    }
  }

  // 绑定事件
  function addEvent(elem, type, handle) {
    if (elem.addEventListener) {
      elem.addEventListener(type, handle, false);
    } else if(elem.attachEvent) {
      elem.attachEvent('on' + type, function () {
        handle.call(elem);
      })
    } else {
      elem['on' + type] = handle;
    }
  }

  // 鼠标移动时
 function mouseMove(e) {
    var event = e || window.event;
    elem.style.left = event.clientX - disX + 'px';
    elem.style.top = event.clientY - disY + 'px';
  }
  
  // 鼠标松开时
  function mouseUp(e) {
    var event = e || window.event;
    removeEvent(document, 'mousemove', mouseMove);
    removeEvent(document, 'mouseup', mouseUp);
  }

  // 鼠标拖拽
  function drag(elem) {
    var disX,
        disY;
    addEvent(elem, 'mousedown', function(e) {
        var event = e || window.event;
        disX = event.clientX - parseInt(getStyle(elem, 'left'));
        disY = event.clientY - parseInt(getStyle(elem, 'top'));
        addEvent(document, 'mousemove', mouseMove);
        addEvent(document, 'mouseup', mouseUp);
        stopBubble(event);
        cancelHandler(event);
    });
  } 
</script>
  1. 输入框功能完善
 <input typt="text" value="请输入用户名" 
    style="color: #999"
    onfocus="if(this.value == '请输入用户名'){this.value=''; this.style.color='#424242'}"
    onblur="if(this.value == ''){this.value='请输入用户名'; this.style.color='#999'}">
  1. 二阶菜单栏
上一篇 下一篇

猜你喜欢

热点阅读