javascript与DOM -- 深入理解javascript

/*
    一、文档对象模型Document Object Model
    DOM(Document Object Model,文档对象模型)是一个通过和JavaScript进行内容交互的API
*/
/*
    注意事项
    1. window对象作为全局对象
        a. 所有全局属性、方法都存放在window下
    2. DOM带有层级效果
        a. Element:  表示一个元素
        b. Text:    所有文本相关元素
        c. Document: 整个文档
*/
/*
    二、Web上的JavaScript
*/
//  1. Script元素
        //<script type="text/javascript">             
        // <![CDATA[     --用来告诉支持XHTML的浏览器                
        // ]]>
        //</script>

//  2. Defer属性  --defer属性告诉浏览器加载完HTML文档以后再执行JS代码,但这个属性只能在IE下使用。

//  3. 连接外部脚 ---<script type="text/javascript" src="my-script.js"></script>

//  4. JavaScript必备  --JavaScript有几种数据类型:Number, String, Boolean, Object, Undefined and Null。

//  5. Number --JavaScript里所有的Number都是浮点型
// 注:使用var类声明变量
var leftSide = 100;
var topSide = 50;
var areaOfRectangle = leftSide * topSide; // = 5000 

//  6. String

//  7. Boolean -- ===也是比较操作符,不仅比较数值,还比较类型

//  8. Function
(function () {
    // 这里自调用函数
})();

//  9. Array
// 2种方式声明数组
// 字面量:  
var fruit = ['apple', 'lemon', 'banana'];
// Array构造函数:  
var fruit = new Array('apple', 'lemon', 'banana');
fruit[0]; // 访问第1个项(apple)  

//  10. Object --一个对象是一个key-value的集合
// 2种类型定义Object对象
// 字面量(大括号)
var profile = { name: 'Bob', age: 99, job: 'Freelance Hitman' };
// 使用Object构造函数
var profile = new Object();
profile.name = 'Bob';
profile.age = 99;
profile.job = 'Freelance Hitman';

//  11. IF/Else语句
//  12. JavaScript操作符
//  13. Loop循环

/*
    三、DOM正文
*/
//  1. 访问DOM节点
var introParagraph = document.getElementById('intro');  // 现在有了该DOM节点,这个DOM节点展示的是该信息段落
var allUnorderedLists = document.getElementsByTagName('ul');  // 'getElementsByTagName'返回的是一个节点集合// - 和数组有点相似

//  2. getElementsByTagName
// 访问无序列表: [0]索引
var unorderedList = document.getElementsByTagName('ul')[0];
// 获取所有的li集合:  
var allListItems = unorderedList.getElementsByTagName('li');
// 循环遍历
for (var i = 0, length = allListItems.length; i < length; i++) {    
    // 弹出该节点的text内容    
    alert(allListItems[i].firstChild.data);
}

//  3. DOM穿梭 --DOM查找节点
/*
1.Node.childNodes: 访问一个单元素下所有的直接子节点元素,可以是一个可循环的类数组对象。该节点集合可以保护不同的类型的子节点(比如text节点或其他元素节点)。
2.Node.firstChild: 与‘childNodes’数组的第一个项(‘Element.childNodes[0]‘)是同样的效果,仅仅是快捷方式。
3.Node.lastChild: 与‘childNodes’数组的最后一个项(‘Element.childNodes[Element.childNodes.length-1]‘)是同样的效果,仅仅是快捷方式。shortcut.
4.Node.parentNode: 访问当前节点的父节点,父节点只能有一个,祖节点可以用‘Node.parentNode.parentNode’的形式来访问。
5.Node.nextSibling: 访问DOM树上与当前节点同级别的下一个节点。
6.Node.previousSibling: 访问DOM树上与当前节点同级别的上一个节点。
*/
/*
    四、操作元素 
*/
document.getElementById('intro').style.paddingTop = '10em'; //如果带有-的话,就需要去除padding-top ==> paddingTop
document.getElementById('intro').style["paddingTop"]  // 使用[]来访问属性
//  Node节点 --创建元素可以通过createElement方法,而创建text节点可以使用createTextNode
// 添加内容
var myIntro = document.getElementById('intro');
var someText = 'This is the text I want to add';
var textNode = document.createTextNode(someText);
myIntro.appendChild(textNode);
/*
    五、Event事件
*/
//  1. 鼠标事件
/*
        1. ‘mousedown’ – 鼠标设备按下一个元素的时候触发mousedown事件。
        2. ‘mouseup’ – 鼠标设备从按下的元素上弹起的时候触发mouseup事件。
        3. ‘click’ – 鼠标点击元素的时候触发click事件。
        4. ‘dblclick’ – 鼠标双击元素的时候触发dblclick事件。
        5.‘mouseover’ – 鼠标移动到某元素上的时候触发mouseover事件。
        6. ‘mouseout’ – 鼠标从某元素离开的时候触发mouseout事件。
        7. ‘mousemove’ – 鼠标在某元素上移动但未离开的时候触发mousemove事件。
*/
//  2. 键盘事件
/*
        1.‘keypress’ – 按键按下的时候触发该事件。
        2.‘keydown’ – 按键按下的时候触发该事件,并且在keypress事件之前。
        3.‘keyup’ – 按键松开的时候触发该事件,在keydown和keypress事件之后。
*/
//  3. 表单事件
/*
        1.‘select’ – 文本字段(input, textarea等)的文本被选择的时候触发该事件。
        2.‘change’ – 控件失去input焦点的时候触发该事件(或者值被改变的时候)。
        3.‘submit’ – 表单提交的时候触发该事件。
        4.‘reset’ – 表单重置的时候触发该事件。
        5.‘focus’ – 元素获得焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
        6.‘blur’ – 元素失去焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
*/
//  4. 其它事件
/*
        1.‘load’ – 页面加载完毕(包括内容、图片、frame、object)的时候触发该事件。
        2.‘resize’ – 页面大小改变的时候触发该事件(例如浏览器缩放)。
        3.‘scroll’ – 页面滚动的时候触发该事件。
        4.‘unload’ – 从页面或frame删除所有内容的时候触发该事件(例如离开一个页面)。
*/
//  5. 事件处理
    //  <button onclick="return buttonClick()">Click me!</button> --这些处理函数都封装在单独的js文件
    //  1. 基本事件注册
    //  <button id="my-button">Click me!</button>
    //  JavaScript:  
    var myElement = document.getElementById('my-button');
    // 事件处理句柄:  
    function buttonClick() { alert('You just clicked the button!'); }
    // 注册事件
    myElement.onclick = buttonClick; //在事件名称前面添加前缀on作为DOM的属性就可以使用
    //  2. 高级事件注册
    function myEventHandler() { this.style.display = 'none'; }
    // 正常工作,this是代表该元素
    myIntro.onclick = myEventHandler;
    // 正常工作,this是代表该元素
    myIntro.addEventListener('click', myEventHandler, false);    //绑定多个处理函数到一个事件上
/*
    六、Event对象 
*/
    function myEventHandler(e) {   
        e = e || window.event;    // 兼容IE的代码
        // 防止默认行为    
        if (e.preventDefault) {
            e.preventDefault();  //取消默认的行为
        } else {
            e.returnValue = false; //取消默认的行为
            //例如,当你点击一个连接的时候,默认行为是导航到href里定义的地址,但有时候你想禁用这个默认行为
        }
    }
//  事件冒泡  --事件在一个目标元素上触发的时候,该事件将触发一一触发祖先节点元素,直到最顶层的元素:
//  阻止冒泡
    function myParagraphEventHandler(e) {    
        e = e || window.event;    
        // 停止向上冒泡    
        if (e.stopPropagation) {        
            // W3C实现         
            e.stopPropagation();    
        } else {        
            // IE实现          
            e.cancelBubble = true;
        }
    }
    // 使用我们自定义的addEvent函数将myParagraphEventHandler绑定到click事件上:  
    addEvent(document.getElementsByTagName('p')[0], 'click', myParagraphEventHandler);
//  事件委托 --将事件绑定在容器元素上,然后通过判断点击的target子元素的类型来触发相应的事件。
//  如大表格,在每个<tr>上绑定点击事件,性能是个大问题
//  
    var myTable = document.getElementById('my-table');
    myTable.onclick = function () {    
        // 处理浏览器兼容   
        e = e || window.event;    
        var targetNode = e.target || e.srcElement;    
        // 测试如果点击的是TR就触发    
        if (targetNode.nodeName.toLowerCase() === 'tr') {
            alert('You clicked a table row!');
        }
    }
//依赖于事件冒泡,如果事件冒泡到table之前被禁用的话,那上面的代码就无法工作

 

posted @ 2015-07-28 14:26  RyanRuan  阅读(305)  评论(0编辑  收藏  举报
View Code