2017-3-18 JS学习笔记

三大家族属性

  • client/scroll/offset
  • clientLeft 表示当前标签距离左侧的 border 值
    clientTop 表示当前标签距离顶部的 border 值
    clientW = width + padding
  • offsetWidth = width + padding + border
    offsetHeight = height + padding + border
  • scrollWidth 表示滚动内容的宽度
    scrollHeight 表示滚动内容的高度
    scrollTop 表示垂直滚动的距离
    scrollLeft 表示水平滚动的距离
  • offsetLeft 表示距离它的 offsetParent 左侧的距离

获取浏览器窗口的宽度

  • ie9 及以上
window.innerHeight;
window.innerWidth;
  • 一般浏览器符合 w3c
document.documentElement.clientWidth;
document.documentElement.clientHeight;
  • 其他浏览器
document.body.clientWidth;
document.body.clientHeight;
//兼容写法
var screenW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;

封装

function client(){
        if(window.innerWidth){
                  return {
                            width:window.innerWidth,
                            height:window.innerHeight
                  }
        }
       else if(document.compatMode ='CSS1Compat'){
                return {
                          width:document.documentElement.clientWidth,
                          height:document.documentElement.clientHeight
                }
        }
        else{
                return {
                          width:document.body.clientWidth,
                          height:document.body.clientHeight
                }
        }
}
//调用函数
var screenW = client().width;

窗口改变事件

window.onresize = function(){
        alert(0);
}

窗口改变事件应用

//程序运行时就触发颜色改变
changeBg();
//对于事件源触发事件后面的事情指令如果封装成方法不加括号
var bgColor = '';
window.onresize = changeBg;
//封装一个函数用来改变颜色
function changeBg(){
        var screenW = client().width;
        if(screenW > 900){
                  bgColor = 'red';
        }else if(screenW > 600){
                  bgColor = 'green';
        }else if(screenW > 300){
                  bgColor = 'blue';
        }        document.body.style.background:bgColor;
}

事件冒泡

  • 如果一个控件实现了某个功能,那么这个事件会依次把这个事件向上传递给他的父对象,如果父对象也实现对应的事件那么,父对象会自动触发对应的事件
   btn.onclick = function(){
            alert('我是按钮');
        }
        father.onclick = function(){
            alert('我是父亲');
        }
        document.onclick = function(){
            alert('我是最大事件源');
        }
//alert 会弹出来三次

阻止事件冒泡

  • 应该子标签中阻止冒泡
//普通浏览器阻止冒泡方法
event.stopPropagation();
//ie 
event.cancelBubble = true;

冒泡事件的应用

  • 获取点击区域的事件源的 id 的方法
    普通浏览器event.target
    ie 浏览器event.srcElement
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>冒泡事件的应用</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            border:none;
        }
        html,body{
            width:100%;
            height: 3000px;
        }
        #panel{
            width:100%;
            height:100%;
            position: absolute;
            left:0;
            top:0;
            background: #000;
            opacity: 0.4;
            /*用来兼容ie浏览器*/
            filter: alpha(opacity:40);
            display: none;
        }
        
        #login{
            width:200px;
            height: 200px;
            position: absolute;
            left:50%;
            top:50%;
            transform: translate(-50%,-50%);
            background: skyblue;
            display: none;
        }
    </style>
</head>
<body>
<button id="btn">登录</button>
<div id="panel"></div>
<div id="login"></div>
<script>
    window.onload = function(){
        /*0.抽取获取标签的函数*/
        function $(tagId){
            return typeof tagId ==='string'?document.getElementById(tagId):tagId;

        }
        /*1.获取标签*/
        var btn = $('btn');
        var panel = $('panel');
        var login  = $('login');
        /*2.点击按钮让对应的div显示*/
        btn.onclick = function(event){

            /*2.0为了达到我们想要的效果,我们需要阻止事件冒泡*/
            var event = event ||window.event;
            if(event &&event.stopPropagation){

                event.stopPropagation();
            }else {
                event.cancelBubble = true;
            }
            panel.style.display = 'block';
            login.style.display = 'block';

            /*2.1让对应的滚动条隐藏*/
            document.body.style.overflow = 'hidden';

        }
        /*3.点击最大事件源让对应的div隐藏*/
        document.onclick = function(event){

            /*当点击最大事件源的时候,让出来登录div其余的区域才会隐藏,我们需要判断点击的区域
            * 通过拿到事件的事件源的id来判断*/

            /*3.1获取事件对象*/
            var event = event ||window.event;
            /*3.2获取点击区域的事件源的id*/
            /*普通浏览器*/
//            event.target
//            ie
//            event.srcElement
            var targetId = event.target?event.target.id:event.srcElement.id;

            /*3.3判断对应的id*/
            if(targetId !='login'){
                panel.style.display = 'none';
                login.style.display = 'none';

                /*3.4让滚动条出现*/
                document.body.style.overflow  ='auto';
            }
        }
    }
</script>
</body>
</html>

获取选中内容

  • 获取选中内容的事件对象
    一般浏览器window.getSelection()
    ie 浏览器document.selection.createRange().text
<script>
    window.onload = function(){
        /*1.获取标签*/
        var word1 = document.getElementById('word1');
        var word2 = document.getElementById('word2');
        var share_text = document.getElementById('share_text');
        var share_weibo = document.getElementById('share_weibo');
        /*2.当选中内容后,在鼠标抬起后出发对应的事件*/
        word1.onmouseup= function(event){
            /*2.0获取事件对象*/
            var event = event||window.event;
            /*2.1获取选中内容*/
            /*一般*/
//            window.getSelection()
            /*ie*/
//            document.selection.createRange().text;

            /*2.11设置变量用来记录选中的内容*/
            var content_text = '';
            if(window.getSelection){
              content_text = window.getSelection();
            }else {
               content_text = document.selection.createRange().text;
            }

            /*2.12设置div显示以及设置他的位置和文字*/
            share_text.innerHTML = content_text;
            share_text.style.left = event.clientX +'px';
            share_text.style.top = event.clientY +'px';
            share_text.style.display = 'block';
        }
        var content_weibo = '';

        /*2.2当在word2中抬起的时候出发对应的事件*/
        word2.onmouseup = function(event){

            /*2.21获取事件对象*/
            var event = event||window.event;
            if(window.getSelection){
                content_weibo = window.getSelection();
            }else {
                content_weibo = document.selection.createRange().text;
            }
         /*2.22让对应的微博图片显示*/
            share_weibo.style.display = 'block';
            share_weibo.style.left = event.clientX +'px';
            share_weibo.style.top = event.clientY +'px';
        }

        /*3.当点击document的时候,让对应的盒子隐藏而且让选中的内容不选中*/
        document.onmousedown = function(event){
            /*3.1让对应的盒子隐藏*/

            /*3.11让除了显示内容的区域点下去的时候隐藏,所以位哦们获取点击的区域的id*/
            var event = event ||window.event;
            var targetId = event.target?event.target.id:event.srcElement.id;
            if(targetId !='word1'){

                share_text.style.display = 'none';
            }
            if(targetId!='share_weibo'){
                share_weibo.style.display = 'none';

            }else {
                /*表示点击了微博,跳转分享界面*/
                window.location.href = 'http://v.t.sina.com.cn/share/share.php?searchPic=false&title=' + content_weibo + '&url=https://www.baidu.com'

            }
            /*3.2让选中的内容不选中*/
            window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
        }
    }
</script>

匀速动画改造注意点

  • 用 offsetLeft 来代替 begin
box.style.left = box.offsetLeft + speed +'px';
  • 判断结束条件的补全
if(target - box.offsetLeft < speed){
        clearInterval(timer);
        box.style.left = target + 'px';
}
//当 target 小于 boxoffsetLeft 时
if(Math.abs(target2 - box.offsetLeft) < Math.abs(speed2){
        clearInterval(timer2);
        box.style.left = target2 + 'px';
}
  • 其中数学公式Math.abs()是取绝对值

抽取匀速动画函数

function constant(obj,target,speed){
        clearInterval(timer);
        obj.timer = setInterval(function(){
                var mySpeed = target > obj.offsetLeft ? speed:-speed;
                obj.style.left = obj.offsetLeft + mySpeed +'px';
                if(Math.abs(target - obj.offsetLeft) < Math.abs(mySpeed)){
                clearInterval(timer);
                obj.style.left = target + 'px';
                }
        },20)
}

无限轮播图

<script>
    window.onload = function(){

        /*0.设置一个值用来记录将要显示的图片*/
        var currentIndex = 0;
        /*0.1设置一个值用来表示小圆点显示第几个*/
        var indicateIndex = 0;
        /*1.获取标签*/
        var oul = document.getElementById('oul');
        var ol = document.getElementById('ol');
        /*1.0获取oul中原来的个数*/
        var lis = oul.children;
        /*1.1添加最后的图片*/
        oul.appendChild(oul.children[0].cloneNode(true));



        /*2.添加小的圆点*/
        for(var i = 0;i < lis.length -1;i++){

            var oli = document.createElement('li');
            ol.appendChild(oli);
        }

        /*2.1s设置第一个为红色*/
        ol.children[0].className = 'curr';

        /*2.2当移动到小圆点上的时候,让对应的小圆点的颜色发生变化,就是一拍他思想*/


        for(var i = 0;i < ol.children.length;i++){
            /*2.2扩展属性用来记录i*/
            ol.children[i].index = i;
           ol.children[i].onmouseover = function(){
               for(var j =0;j < ol.children.length;j++){
                   ol.children[j].className = '';
               }

              ol.children[this.index].className = 'curr';

               /*2.3让对应的图片动起来*/
               constant(oul,-this.index *750,20);

               /*2.4当移动到小圆点的时候,应该切换对应的currIndex以及indicateIndex*/
               currentIndex = this.index;
               indicateIndex = this.index;
           }
        }

        /*3.让自动动起来*/
        var timer = setInterval(auto_play,1000);
        function  auto_play(){
            currentIndex ++;
            if (currentIndex > lis.length -1)
            {
                currentIndex = 1;
                oul.style.left = 0;
            }

            /*动起来*/
            constant(oul,-currentIndex*750,20);

            /*设置小圆点的颜色*/
            indicateIndex ++;
            if (indicateIndex > ol.children.length  -1){
                indicateIndex  = 0;
            }
            for(var i = 0;i < ol.children.length;i++){

                ol.children[i].className = '';
            }
           ol.children[indicateIndex].className = 'curr';
        }
    }
</script>

克隆节点

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

推荐阅读更多精彩内容

  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 1,832评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • 以下是常用的代码收集,学习用。转自豪情博客园 1. PC - js 返回指定范围的随机数(m-n之间)的公式 re...
    自由加咖啡阅读 992评论 0 1
  • 真正的私房菜,大多都是隐匿在民房小楼之中,无招牌、无跑堂、无固定Menu,若不事先预订和设计菜单,是吃不上的,甚至...
    隐藏菜单阅读 5,031评论 11 67
  • ——魏君学习非暴力沟通心得 魏老师,我对“需要从来不会相冲突”这句话有点困惑。虽然说需要是人类共同的,但是不同的人...
    魏君NVC阅读 879评论 1 5