妙味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昨天就过期
}

 

posted @ 2018-03-20 15:53  言叶以上  阅读(225)  评论(0编辑  收藏  举报