zoukankan      html  css  js  c++  java
  • 妙味JS学习记录(一)

    在学习过程中零碎的知识点记录以及一些想法,加深印象,强化记忆。

    零、预热课程

    常见的JS效果实现原理:

    ~鼠标移入:display:'block'-->'none' ;上下移动轮播:改变ul的top值;左右轮播:改变left值;网页换肤:更换link便签的href;点击菜单展开收缩:用if来判断display;   

    ~首先想好修改的属性,其次考虑加什么事件;

    ~函数加括号为调用该函数,返回值为函数返回值;
    函数不加括号可认为是查看函数完整信息,即查看整个函数体,返回值即整个函数体,不加括号传参相当于传入函数整体。

    ~

    实例:

    0-1鼠标移入显示提示框-->改变display的值。将事件添加给外层包裹的label标签效果会更好。

    0-2 改变class 因为class在JS中是个关键字,所以要用className对象,取消class也可用空字符串。

    0-3 网页换肤 准备几套样式表,点击按钮时改变href值。

    0-4 改变DIV样式 需要注意CSS的优先级。

    0-5 输入法菜单展开,同lx-2。

    0-6 点击全选 input.check = 'true'; 实现选中。

    0-7 选项卡 首先头部的选项卡设置移入变色,其它默认:鼠标移入后先用for循环清除所有.active ,再给this添加.active。 给头部卡片指定当前 i 为index值,隐藏其他div 显示第[index]个DIV。

    0-8 简易年龄,底部的文字变化,12个月定义成数组,给li绑定index ,调用当前第(li的this.index)个数组。

    0-9 数码时钟 一串数字相加是求和,如果在最前方+空字符串,就能组合成为字符串;charAt(i),提取字符串中第i个字符;因为setInterval是延迟1秒才开始加载,所以需要先单独调用一遍该时间函数 

    0-10 延时提示框 鼠标移出红框时,让灰框暂时不消失。所以红框onmouseout时添加setTimeout延时器,鼠标移入灰框时清楚延时器,让灰框一直存在。

    0-11运动基+0-12无缝滚动   绝对定位后,oUl.style.left = oUl.offsetLeft + speed +'px';  将现有li*2:oUl.innerHTML += oUl.innerHTML;

    练习:

    lx-1 论坛头像 通过display block>none; 修改。

    lx-2 播放列表展开  右边的倒三角可以用修改class 来改变背景图像,也可以用CSS3 的rotate颠倒180deg 。

    lx-3 多层选项卡菜单 移到第一个显示第二个,移到第二个显示第三个,注意mouseover 和 mouseout的关系就行 。

    lx-4 星星评分效果  用无序列表写,给所有li设置索引,循环比鼠标移入的当前索引小的全变色,比当前索引大的不变色。

    lx-5  展开菜单,先给li设置索引,display:none>block; 点击时先要none其他的菜单,然后将当前索引的菜单展开,再点击 block>none;

    lx-6 改变输入法展开文字 点击展开菜单li 时改变 标题的innerHTML,同时隐藏菜单就好了。

    lx-7 同0-9 时间的样式可以在CSS中写好,在innerHTML中套上标签。

    lx-8 简单图片展示效果 首先实现一个小图环绕大图的布局,点击小图,把当前的innerHTML 传给大图就好了(当然也可以改变大图的src)

    lx-9 按下鼠标列表上下滚动,松开停止  同0-12 点击时用onmousedown设定速度,松开onmouseup 速度清零

    lx-10 站长之家导航条 将标题导航和子菜单直接写到一个li里,那样无论鼠标移入哪里都可以保持不消失,移入显示,移出延时隐藏,可以用push()方法获取那些元素组中的元素。

    一、基础课程

    ~ JS 组成:

    ECMAScript:解释器、翻译;提供语言的基本功能;

    DOM:Document Object Model;给了JS操作页面元素的能力 (document.xxx);

    BOM:Browser Object Model:给了JS操作浏览器的能力 (window.xxx);

    ~ 变量类型

    typeof xxx ——检测变量类型  变量类型是由它里面存的东西决定的;

    基本类型:number,string,boolean,undefined,null;

    引用类型:object、Array、RegExp、Date、Function、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)。object是由基本对象组成的。

    原则:一个变量应该只存放一种类型的数据;

     ~ 类型转换

    显式转换(强制转换)—— parseInt() 字符串转整形(从字符串中提取数字);parseFloat() 字符串转浮点型;

    NaN 与自身不相等;isNaN(值) 检测NaN;

    隐式转换 —— ‘==’ 先转换一样类型再比较;‘-’减法,先转换再相减;'*'乘法;'/'除法;

    ~ 变量作用域(变量作用范围)

    全局变量:不定义在任何一个函数里,可以在任何地方去用;

    局部变量:定义在一个函数里,只能在这个函数里使用;

    ~ 闭包  

    function aaa(){  //父函数
        var a= 12;
            function bbb(){  //子函数
            alert(a);
        }
            bbb();
    }    
        aaa();        

    子函数可以使用父函数的局部变量;变量作用域的一种形式;

    ~ JS命名规范

    可读性 规范性  匈牙利命名法:类型前缀:首字母大写

    数组  a  Array

    布尔值  b  Boolean

    浮点数  f  Float

    函数  fn  Function

    整数  i  Integer

    对象  o  Object

    正则  re  RegExp

    字符串  s  String

    变体变量  v  Variant  不限定类型的变量

    ~ 运算符

    算术  +   -  *  /  %;

    赋值  =  +=  -=  /=  %=;

    关系  <  >  <=  >=  ==  ===  !=  !==;

    逻辑  &&  ||  !

    ~ 程序流程控制

    if  switch  xxx?xxx:xxx(三目)  while  for  break  continue

    真:true  非零数字  非空字符串  非空对象

    假:false  数字零  空字符串  空对象  undefined  null

     ~ JSON

     JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

    它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号

    var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
    var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
    

      

    对比内容 JSON Javascript 对象
    键名 必须是加双引号 可允许加单引号,双引号,也可以不加
    属性值 只能是数值(10进制) ,字符串(双引号),布尔值和null,也可以是数组,符合JSON的对象,不能是函数,NaN,Infinity,-Infinity和undefined javascript 中的任意值
    逗号问题 最后一个值后面不能有逗号 可以有逗号
    数值问题 前导不能为0,小数点后会有值

    都可以

    for (var in object) {

     执行的代码块
    }

    ~ 函数返回值

    函数的执行结果;可以没有return;一个函数应该只返回一种类型的值;

    arguments(不定参) 获取函数的参数;开发者无需明确指出参数名,就能访问它们。

    argument.length  传参的个数;argument[i] 访问第i个参数

    ~ jQuery css()函数

    封装一个函数获取属性,style只能获取行间样式 所以需要封装获取函数方法

    function getStyle(obj,attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr]; //兼容IE 
         }else{
           return getComputedStyle(obj,false)[attr]; //兼容火狐和谷歌
         }
    }
    function css(){
        if(arguments.length == 2){//获取
            return getStyle(arguments[0],arguments[1]);  //获取计算后的样式(当前样式、非行间)
        }else if(arguments.length == 3){//设置
                        arguments[0].style[arguments[1]] = arguments[2];
        }
    }

    ~ 数组

    var arr = [1,2,3,4];

    var arr = new Array(1,2,3,4);  

    快速清空数组:arr.length = 0;

    添加:  push(元素),从尾部添加  unshift(元素)从头部添加

    删除:  pop()从尾部删除  shift()从头部删除

    查找:  indexOf() 方法可返回某个指定的值在数组中首次出现的位置,如果没有查找到则返回-1

    颠倒顺序:reverse() 

    排序:  sort(比较函数);只认识字符串,只能把数字当作字符串;

        想排序数字需要添加比较函数:sort(function(num1 , num2) {return num1 - num2;}) //从小到大排序

        1.返回值小于0,num1,num2在数组中顺序不变

        2.返回值等于0,num1,num2在数组中顺序不变

        3.返回值大于0,num1,num2在数组中顺序交换

    转换:  concat(数组2);连接两个数组或两个字符串;  

        join(分隔符);将数组里的元素拼成一个大的字符串; 不能为空

        split(分隔符);大字符串拆解成数组,但其实还是小字符串,如果是数字需要转换  不能为空

    截取:   slice(起始索引,结束索引)   返回一个新数组,原数组不破坏

    万能的 splice:splice(开始位置,长度,要插入的那些元素)

    如: var arr = [1,2,3,4,5,6,7,8]

    删除:arr.splice(2,3) 从第二个位置删三个 ——> [1,2,6,7,8]

    中间插入: arr.splice(5,0,'a','b','c'); ——> [1,2,3,4,5,a,b,c,6,7,8]

    替换: arr.splice(1,2,'a','b') ——> [1,a,b,4,5,6,7,8]

    二、DOM

    ~ 创建插入删除元素  

    creatElement(元素名);  

    在末尾插入元素:父.appendChild(子节点);创建出来的元素和原来的没有区别;

    在xx之前插入子节点:父.insertBefore(子节点,在谁之前);

    删除一个节点: 父.removeChild(节点);  

    ~ 文档碎片

    创建文档碎片 document.creatDocumentFragment();仅仅在理论上能提高性能

    new Date().getTime() 获取时间戳 (以毫秒为单位的时间)

    ~ DOM节点

    childNodes 获取子节点     getAttributeNode()获取属性节点

    nodeType 节点类型   1:元素节点  2:属性节点  3:文本节点  8:注释节点

    children 兼容型,不会把空文本节点选中

    parentNode  获取父节点  offsetParent  获取该元素相对于谁定位

    firstChild  首个子节点(IE) || firstElementChild(FF)   处理兼容

    lastChild 最后一个子节点(IE)  ||  lastElementChild(FF)

    nextSibling  兄弟节点  ||  nextElementSibling 

    previousSibling  ||  previousElementSibling

    ~ 操作元素属性

    获取:getAttribute(名称)  设置:setAttribute(名称,值)  删除:removeAttribute(名称)

    用className选择元素:选出所有元素,通过className来筛选

     ~ BOM

    打开窗口:window.open(地址,target);  返回值为当前窗口

    document.write;清空当前页面,并输出内容

    代码点击运行实现:开个新页面,把文本域里的内容用document.write写到新页面去;文本域的内容支持HTML

    关闭窗口:window.close();  最好用来关闭open()出来的窗口;

    window.navigator.userAgent  查询当前浏览器版本

    window.location  读取当前URL,也可以跳转指定URL

    ~ 窗口尺寸 

    可视区尺寸

    document.documentElement.clientWidth;  document.documentElement.clientHeight;

    滚动距离(可视区距离)

    document.body.scrollTop; || document.documentElement.scrollTop;

    ~ 系统对话框

    alert();   confirm()是否框,返回布尔值;  prompt('输入内容');返回用户输入的文字或null

    ~ 常用事件

    window.onload;  window.onresize;调整窗口大小    window.onscroll;页面滚动时

    三、事件

    ~ event 对象

    用来获取事件的详细信息 鼠标位置、键盘按键...

    document其实是一个节点,一个最外层虚拟的父节点。

    获取event对象  var oEvent = ev || event;处理兼容性

    oEvent.clientX  oEvent.clientY 鼠标的'可视区'坐标;

    ~ 事件流

    事件冒泡,子级执行完事件会不断往父级传递;

    阻止冒泡,oEvent.cancelBubble = true,  要在子级设置阻止

    div鼠标跟随:给div绝对定位后,X轴把clientX赋给 left,Y轴需要用滚动距离(scrollTop)加上clientY

    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;

    var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;

    只要用到clientX和clientY 就一定要加滚动条;

    一串DIV跟随鼠标的效果:倒循环,从大到小,后一个跟着前一个的left和top;第一个的left和top跟随鼠标的位置

    ~ 键盘事件

    onkeydown + onkeyup = onkeypress  根据keyCode知道具体按了哪个键  可以用alert(oEvent.keyCode);

    ctrlKey  shiftKey  altKey  按住对应的按键返回true

    if(oEvent.ctrlKey && oEvent.keyCode == 13) 按住ctrl和回车发送

    键盘控制div移动,解决停顿问题:

    window.onload = function() {
        var oDiv = document.getElementById("div1");
        var timer = null;
        var left = false;
        var right = false;
        var top = false;
        var bottom = false;
        setInterval(function() {
            if(left) {
                oDiv.style.left = oDiv.offsetLeft - 10 + "px";
            } else if(top) {
                oDiv.style.top = oDiv.offsetTop - 10 + "px";
            } else if(right) {
                oDiv.style.left = oDiv.offsetLeft + 10 + "px";
            } else if(bottom) {
                oDiv.style.top = oDiv.offsetTop + 10 + "px";
            }
        }, 50);
        document.onkeydown = function(ev) {
            var ev = ev || event;
            var keyCode = ev.keyCode;
            switch(keyCode) {
                case 37:
                    left = true;
                    break;
                case 38:
                    top = true;
                    break;
                case 39:
                    right = true;
                    break;
                case 40:
                    bottom = true;
                    break;
            }
        }
        document.onkeyup = function(ev) {
            var ev = ev || event;
            var keyCode = ev.keyCode;
            switch(keyCode) {
                case 37:
                    left = false;
                    break;
                case 38:
                    top = false;
                    break;
                case 39:
                    right = false;
                    break;
                case 40:
                    bottom = false;
                    break;
            }
        }
    }

    ~ 默认行为(默认事件)

    浏览器自身就具备的功能

    阻止右键菜单:document.oncontextmenu = function(){return false;}  

    阻止文本框输入 text.onkeydown = function(){return false};

    自定义右键菜单:div的left 和 top 等于 clientX 和clientY

    拖拽原理:

    div.onmousedown :存储距离  document.onmousemove :根据距离,计算div最新的位置   document.onmouseup:清空onmousemove

    只有在鼠标点下去后,onmousemove才能发生 因此要把onmousemove事件写在onmousedown内

    防止鼠标从DIV中拖出去,直接给document加事件;

    四、COOKIE

    页面用来保存信息,比如自动登陆,记住用户名。

    特性:同一个网站中所有的页面共享一套Cookie;数量大小有限;有过期时间;存在客户端,可以更改。

    ~ cookie的使用:

    格式:名字=值;不会覆盖,’=‘为添加;没指定过期时间,那么一直到浏览器关闭为止

    function setCookie(name,value,iDay){//发送
        var oDate = new Date();
        oDate.setDate(oDate.getDate()+iDay);
        document.cookie = name+'='+value+';expires='+oDate;
    }
    
    function getCookie(name){//获取
        var arr = document.cookie.split('; ');
        for (var i = 0; i < arr.length; i++) {
            var arr2 = arr[i].split('=');
            if (arr2[0]==name) {
                return arr2[1];
            }
        }
        return '';
    }
    
    function removeCookie(){//删除COOKIE
        setCookie(name,'1',-1);//让cookie昨天就过期
    }
  • 相关阅读:
    7.python常用模块
    7.python3实用编程技巧进阶(二)
    7.Flask文件上传
    7.Django CSRF 中间件
    7.Ajax
    6.python内置函数
    6.python3实用编程技巧进阶(一)
    6.jQuery(实例)
    PhpStorm 10.0.1破解激活步骤
    PyCharm 2018.1破解激活步骤
  • 原文地址:https://www.cnblogs.com/anqwjoe/p/8581608.html
Copyright © 2011-2022 走看看