(17.05.02)***js的组成部分、dom操作、dom树、获取(元素信息、非行间样式、元素定位、定位父级)、js创建、插入和删除、鼠标事件、浏览器默认行为、事件(冒泡、绑定、解绑、委托)、事件流、if简写、window.onload替代

javascript 组成部分
    1.ECMAScript
        javascript的核心解释器

    2.DOM
        Document Object Modle    文档对象模型
    DOM操作
        获取元素
        改变样式
        改变内容
    3.BOM
        浏览器对象模型
        浏览器操作
            window.navigator.userAgent
            window.open()
            window.close()


DOM操作
    获取元素
        document.getElementById()
            通过id获取一个元素
        document.getElementsByTagName()
            通过标签名获取一组元素
        document.getElementsByClassName()
            通过class获取一组元素
        document.querySelector()
            获取第0个
        document.querySelectorAll()
            获取一组


节点===标签===元素
    DOM树 页面结构关系

    获取子节点
        oEle.children
            只能获取一层
    获取父节点
        oEle.parentNode
            获取结构父级
        oEle.offsetParent
            获取定位父级
    获取兄弟节点
        获取上一个兄弟节点
            oEle.previousElementSibling
        获取下一个兄弟节点
            oEle.nextElementSibling
        注意:不兼容低版本IE浏览器
    获取首尾子节点
        首子节点
            aEle[0]
            oPrent.firstElementChild
        尾子节点
            aEle[aEle.length-1]
            oPrent.lastElementChild

    获取标签名
        oEle.tagName

获取元素信息
    盒子模型
        width/height+padding+border
    盒子模型的宽高
        盒子模型的宽
            oEle.offsetWidth
        盒子模型的高
            oEle.offsetHeight

获取非行间样式

            function getStyle(obj,sName){
                return 
              (obj.currentStyle||getComputedStyle(obj,false))[sName];
            }

获取元素的定位
    oEle.offsetLeft
    oEle.offsetTop

获取定位父级
    oEle.offsetParent


    创建
        document.createElement('标签名');

    插入
        后面添加
        父级.appendChild(要添加的子级)
        某一个子级前面插入
        父级.insertBefore(要插入的元素,插入谁之前);
    删除
        父级.removeChild(要删的元素);


事件
    事件对象 触发事件时的详细信息

    需求:
        点击页面,弹出鼠标在页面中的位置

    获取鼠标在可视区中的位置
        ev.clientX      鼠标X轴可视区中的位置
        ev.clientY      鼠标Y轴可视区中的位置

    获取鼠标在页面中的位置
        ev.pageX        鼠标X轴页面中的位置
        ev.pageY        鼠标Y轴页面中的位置

    需求:
        页面中有一个div,当鼠标移动的时候,div跟着鼠标动。

        新的事件
            onmousemove         当鼠标移动的时候触发

拖拽 drag
    事件

            onmousedown             鼠标按下
                获取鼠标在div中的位置
                var disX = ev.pageX-oDiv.offsetLeft
                var disY = ev.pageY-oDiv.offsetTop
            onmousemove             鼠标移动
                改变div的left和top
                oDiv.style.left = ev.pageX-disX+'px';
                oDiv.style.top = ev.pageY-disY+'px';
            onmouseup               鼠标抬起
                把onmousemove干掉
                把onmouseup干掉

    
        问题一:
            鼠标没点就懂了
            解决:
                把onmousemove放在onmousedown里面
        问题二:
            鼠标移动过快,就移出div了
            解决:
                1.把div放大        不靠谱,设计和产品会找你拼命
                以下方法靠谱
                把onmousemove事件加给document
        问题三:
            鼠标抬起依然能动
            解决:
                正在onmouseup中把onmousemove干掉
        问题四:
            鼠标拖拽的时候,会选中页面内容
            解决:
                在onmousedown中把默认事件阻止
                return false;   注意一定要放在最后

扩展:

        限制范围拖拽
        得到l和t
        var l = ev.pageX-disX;
        var t = ev.pageY-disY;
        限制l和t的范围
        if(l<0){
            l = 0;
        }else if(l>document.documentElement.clientWidth-oDiv.offsetWidth){
            l = document.documentElement.clientWidth-oDiv.offsetWidth;
        }
        if(t<0){
            t = 0;
        }else if(t>document.documentElement.clientHeight-oDiv.offsetHeight){
            l = document.documentElement.clientHeight-oDiv.offsetHeight;
        }

浏览器默认行为,浏览器默认事件
    return false;

    鼠标右键
        oncontextmenu

    document.documentElement      html
    document.body      body

获取可视区宽高
    可视区宽度
        document.documentElement.clientWidth
    可视区高度
        document.documentElement.clientHeight

事件冒泡
    取消冒泡
        ev.cancelBubble = true;

    平时没事的情况下不要取消。如果出现问题了才取消


事件绑定(事件监听)
    给同一个元素加同一个事件可以加多次。
    解决事件冲突

   不兼容低版本浏览器
    oEle.addEventListener('click', function(){

    }, false);
    低版本浏览器
        oEle.attachEvent('onclick',function(){});

    切记:
        addEventListener中 return false失效了
        ev.preventDefault();
        不兼容低版本浏览器

事件解绑

    oEle.removeEventListener('click',function(){},false);

    切记:不能使用匿名函数


    事件流 事件在程序中的走向
    DOM事件流 高级浏览器的事件流
        事件冒泡 事件捕获
        (冒泡阶段) (捕获阶段)
    addEventListener第三个参数决定是什么?
        false 冒泡
        true 捕获
        捕获阶段只有addEventListener第三个参数是true才触发

    IE事件流 低版本IE的事件流
        事件冒泡
        (冒泡阶段)


事件流有几种?
    DOM事件流
    IE事件流
事件流的区别?
    DOM事件流有冒泡阶段和捕获阶段
    IE事件流有冒泡阶段


if的简写

    if(条件){
        语句
    }
    简写
    条件&&语句;

    true&&alert(1);
    false&&alert(1);

    &&并且,两边的条件都是真的才算是真的

    true&&alert(1);


    true||alert(1);             不能弹
    false||alert(1);            能弹

    (obj.currentStyle||getComputedStyle(obj,false))[sName]

onmouseover和onmouseout的bug
    onmouseover     移入
    onmouseout      移出
换事件
    onmouseenter     移入
    onmouseleave     移出


事件委托(事件委派、事件派生)
    1.动态创建的元素加事件     解决
    2.循环加事件太麻烦     解决

    核心:
    1. 给父级加事件
    2. 获取事件源
        var oSrc = ev.srcElement||ev.target;


window.onload
    当所有资源都加载完成之后触发

DOMReady             推荐
    当html,css,js加载完毕执行
    给document添加事件
        DOMContentLoaded事件        不兼容低版本浏览器

    DOM事件
        特点以DOM开头
        必须用事件绑定

    事件
        DOM2事件
            onclick
            onmouseover
        DOM3事件      必须用事件绑定
            DOMContentLoaded

DOMReady另一种玩法

    document.onreadystatechange = function(){
        document.readyState
            interactive         准备
            complete            完成
        需要判断readyState是否是complete
        if(document.readyState=='complete'){
            //执行我们的代码
        }
    };

总结:

    javascript的组成部分:
        ECMAScript          核心解释器
        DOM                 文档对象模型
        BOM                 浏览器对象模型
    DOM操作
        DOM树
            document
                html
                    head
                        title
                        made
                        style
                        link
                        script
                    body
                        div
                            p
                                a
                            a
                            ul
                        div
                        div
                        section
        获取子节点
            父级.children         获取第一层子节点    √
            父级.childNodes   不推荐用        ×
        获取父节点
            获取结构父级
                子级.parentNode
            获取定位父级
                子级.offsetParent
        获取兄弟节点
            上一个
                obj.previousElementSibling
            下一个
                obj.nextElementSibling
        获取首尾子节点
            首
                父级.firstElementChild
                父级.children[0];
            尾
                父级.lastElementChild
                父级.children[父级.children.length-1]

        获取信息
            盒子模型的宽高
                obj.offsetWidth         盒子模型宽度
                obj.offsetHeight        盒子模型高度
            获取相对位置
                obj.offsetLeft
                obj.offsetTop
            获取可视区宽高
                document.documentElement.clientWidth
                document.documentElement.clientHeight
--------------------------------------------------------------
    事件
        事件对象
            包含了事件的详细信息
            切记:只能获取鼠标和键盘的
        获取鼠标在可视区中的位置
            ev.clientX/clientY
        获取鼠标在页面中的位置
            ev.pageX/ev.pageY
        事件绑定(事件监听)
            防止事件冲突
            obj.addEventListener('sEv',fn,false);
            事件解绑
            obj.removeEventListener('sEv',fn,false);
        阻止默认事件
            return false;
            但是遇到addEventListener不好使.
            用:  ev.preventDefault&&ev.preventDefault();
        事件流:
            DOM事件流
                冒泡阶段        捕获阶段
            IE事件流
                冒泡阶段
        onmosueover和onmouseout的bug
            解决:
                onmouseenter
                onmouseleave
        事件委托(事件派生,事件委派)
            给动态元素加事件
            1.给父级加事件
            2.获取事件源
                var oSrc = ev.srcElement||ev.target;
        DOMReady
            比window.onload快
            第一种         推荐
                document.addEventListener('DOMContentLoaded',function(){
                    //你的代码
                },false);
            第二种
                document.onreadystatechange = function(){
                    if(document.readyState=='complete'){
                        //你的代码
                    }
                };

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容