日常整理

1: 图片加链接后有的浏览器默认蓝色边框, 消除方法

    img{border:0;}或者 img{border:none;}
   img虽然没有border,但是这种情况可以解决遇到a标签包裹的时候出现的问题。


2 3条以上 ie 和 ff 的脚本兼容问题

 

一、脚本差异:

1、事件绑定:addEventListener 与 attachEvent  事件处理函数中this指向不同, IE中指向window
2、获取事件对象 :事件处理函数     window.event 
3、获取触发事件的DOM元素: target  srcElement
4、阻止默认行为: e.preventDefault()   e.returnValue= false
5、阻止冒泡:e.stopPropagation()  e.cancelBubble = true;
6、获取样式信息:getComputedStyle(obj,null).width  currentStyle.width
7、实例化XHR对象  new XMLHttpRequest()  newActiveXObject()
8、获取dom元素: parentNode parentElement  
 
 
二、css差异
 
1、!important  优先级最高,在IE6以下异常。
 
 


3 XHTML与HTML区别是什么?

html:超文本标记语言 (Hyper Text Markup Language)

xhtml:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上更加严格。XHTML 元素必须被正确地嵌套

     XHTML 元素必须被关闭,空标签也必须被关闭,如 <br> 必须写成 <br />
     XHTML 标签名必须用小写字母
     XHTML 文档必须拥有根元素
     XHTML 文档要求给所有属性赋一个值
     XHTML 要求所有的属性必须用引号""括起来
     XHTML 文档需要把所有 < 、>、& 等特殊符号用编码表示
     XHTML 文档不要在注释内容中使“--”
     XHTML 图片必须有说明文字
     XHTML 文档中用id属性代替name属性


4 构建一个自定义版本的foeach函数


5 slice方法返回字符串的片段。 
strObj.slice(start[,end]) 
说明: 
start下标从0开始的strObj指定部分其实索引。如果start为负,将它作为length+start处理,此处length为字符串的长度。 
end小标从0开始的strObj指定部分结束索引。如果end为负,将它作为length+end处理,此处length为字符串的长度。 
例如: 
012345 
var str = "ABCDEF"; 
str.slice(2,4); 
结果:CD 
slice(start,end) 从某个已有的数组返回选定的元素
请注意,该方法并不会修改数组,而是返回一个子数组

substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。  一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。

 

6 jQuery事件绑定on()、bind()与delegate() 方法详解

 

bind   

给匹配到的元素直接绑定事件(不推荐,1.7以后的jQuery版本被on取代)

第一个参数:事件类型

第二个参数:事件处理程序

$("p").bind("click mouseenter", function(e){

    //事件响应方法

});

优点:可以同时绑定多个事件,比如:bind(“mouseenter  mouseleave”, function(){})

缺点:仍然无法给动态创建的元素绑定事件

 

delegate方式

作用:给匹配到的元素绑定事件,对支持动态创建的元素有效(特点:性能高,支持动态创建的元素)

// 第一个参数:selector,要绑定事件的元素

// 第二个参数:事件类型

// 第三个参数:事件处理函数

$(".parentBox").delegate("p", "click", function(){

    //为 .parentBox下面的所有的p标签绑定事件

});

与前两种方式最大的优势:减少事件绑定次数提高效率,支持动态创建出来的元素绑定事件

on

我们现在用on的方式来绑定事件(最现代的方式,强烈建议使用的方式)

jQuery1.7版本后,jQuery用on统一了所有的事件处理的方法

作用:给匹配的元素绑定事件,包括了上面所有绑定事件方式的优点

 

 

  事件解绑

unbind() 方式

作用:解绑 bind方式绑定的事件

$(selector).unbind(); //解绑所有的事件

$(selector).unbind(“click”); //解绑指定的事件

 

undelegate() 方式

作用:解绑delegate方式绑定的事件

$( selector ).undelegate(); //解绑所有的delegate事件

$( selector).undelegate( “click” ); //解绑所有的click事件

 

 

 

off解绑on方式绑定的事件(重点)

// 解绑匹配元素的所有事件

$(selector).off();

// 解绑匹配元素的所有click事件

$(selector).off(“click”);

// 解绑所有代理的click事件,元素本身的事件不会被解绑

$(selector).off( “click”, “**” );

 

1.选择器匹配到的元素比较多时,不要用bind()迭代绑定

2.用id选择器时,可以用bind()

3.需要给动态添加的元素绑定时,用delegate()或者on()

4.用delegate()和on()方法,dom树不要太深

5.尽量使用on()

  事件触发(重点)

简单事件触发

$(selector).click(); //触发 click事件

trigger方法触发事件

$(selector).trigger(“click”);

triggerHandler触发 事件响应方法,不触发浏览器行为

比如:文本框获得焦点的默认行为

$(selector).triggerHandler(“focus”);

 

 

forEach

    语法: 数组.forEach( callback )

    执行: 遍历数组中的每一个元素, 并且将每一个元素的处理过程交给回调函数

    回调函数中会传入两个参数, 一个是遍历的数组元素, 一个是当前的索引.

 

// 首先如果不提供参数, 那么 this 是 window

        // 如果提供一个对象 那么 这个对象就是 回调函数中的 this

        // 但是 forEach 这个方法执行一次, 也就是说这个对象是固定不变的

        // 也就表明回调函数中的 this 不会随着遍历元素的改变而改变, 它是固定的

 

    例如: 遍历打印数组中的每一个元素与索引号

    传统:

        for ( var i = 0; i < arr.length; i++ ) {

            console.log( i + ', ' + arr[ i ] );  // 打印, 索引号 与 当前元素

        }

    forEach:

        arr.forEach( function ( value, index ) { 

            console.log( index + ', ' + value );

        } );

    比较一下 jq 中的 each 方法

        $.each( arr, function ( i, v ) { ... } )

    为什么要这样抽象???

        由于大多数循环数组都是将数组全部遍历, 因此 forEach 默认就是将数组遍历出来

        我们遍历数组的重点是在操作数组中的 当前元素与当前索引. 因此我们将其抽象出来

        单独放到回调函数中处理. 那么我们的业务逻辑更加集中.

 

    思考: 为什么 jq 的 each 方法中回调函数的 参数是 i, v; 而数组中的参数是 v, i 呢?

        从实际开发中考虑, 统计上来说遍历数组的时候使用 i 多还是 v 多?

        js 中很多特征是动态的, 因此将回调函数写成 v, i 的形式, 如果不需要使用索引, 直接不提供 i 这个参数

 

        arr.forEach( function ( v, i ) { 

            // 在函数中只会用到 v 而不会用到 i

        } );

 

        // 如果在设计这个 api 的时候是将 i 放在前面, 那么使用的时候即使不使用 i 也得写

        arr.forEach( function ( i, v ) { 

            // 在函数中只会用到 v 而不会用到 i

        } );

 

        在 jq 中遍历 each 方法有两个, 一个是静态的, 一个是实例.

        $.each( arr, callback );

        $( 'div' ).each( callback );

        在 jq 中遍历每一个 dom 对象的时候 一般不是使用 参数 v 而是使用 this

 

        $( 'div' ).each( function ( i ) {

            this 直接就是 DOM 元素, 如果要使用 索引, 在参数中提供 i 即可

        });

 

 

 

 

map 函数

    语法:

        数组.map( 回调函数 )

    简单的来理解, map 也是在遍历数组. 这种理解不准确.

 

    map 原意 映射, 通俗的理解就是将一个集合按照特定的规律变成另一个集合.

    例如: 有数字构成的集合, 将其中 的数字扩大一倍.

 

    map 的实现逻辑

    1> map 函数要返回一个数组

    2> map 返回的这个数组的元素由 回调函数的返回值决定

 

    类比: 

        [ 1, 2, 3 ], []

        [ 1, 2, 3 ], [ 2 ]

        [ 1, 2, 3 ], [ 2, 4 ]

        [ 1, 2, 3 ], [ 2, 4, 6]

    map 函数也是如此, map 函数中的回调函数来实现我们的规则

        var newArr = arr.map( function ( v, i ) {

            return v * 2;

        });

    如果回调函数没有返回值, 注意默认返回了 undefined

 

    我们的要求是将数组中的元素转换成另一个东西, 那么这个转换的过程由回调函数来实现

 

    典型的案例:

        'a,b,c'.split( ',' ).map(function ( v ) {

            return '<td>' + v + '</td>';

        });

        // [ 'a', 'b', 'c' ] => [ '<td>a</td>', '<td>b</td>', '<td>c</td>' ]

 

    将箭头函数引入 map. 上面的案例就可以改良成

        'a,b,c'.split( ',' ).map( v => '<td>' + v + '</td>' );

 

7. jq 中 map 方法与数组 中提供的 map 的异同( 讨论 )

 

8. every 和 some

    some 方法, 表示判断数组中的元素只要含有某一个条件即可

    every 方法, 表示判断数组中的每一个元素必须含有某个条件

 

    语法: 

        数组.方法名( 回调函数 ) -> boolean

    说明:

    1> 回调函数依旧是遍历数组的每一个元素

    2> 回调函数的参数依旧是 v, i

    3> 回调函数的作用是用来判断数组中的元素, 所以回调函数有返回值, 返回一个 boolean

    4> some 方法凡是发现满足了条件的元素就会停止遍历, 并返回 true, 否则返回 false.

    5> every 方法凡是发现了一个元素不满足条件就会停止遍历, 并返回 false, 否则返回 true.

 

    该方法与逻辑中断类似 是逻辑中断的升级版.

 

    ||  表达式1 || 表达式2

        如果表达式1为假, 才会判断表达式2, 如果表达式1已经真 那么不执行表达式2, 就得到结果

    &&  表达式1 && 表达式2

        如果表达式1为假, 那么不在判断表达式2, 直接得到结果为假, 如果表达式1为真, 再判断表达式2

 

    

    练习: 有一个数组, 判断该数组中是否含有数字.

        var arr = [ 'a', 'b', '12', 123 , 'd' ];

        arr.some( function ( v ) {

            return typeof v == 'number';

        });

    如果说练习是 判断数组中是否都为 DOM 元素( 潜规则, 判断元素是否含有属性 nodeType )

        arr.every( function ( v ) {

            // 如果是dom 元素应该返回 true

            // 如果不是 dom 元素 返回 false

            return v.nodeType;

        });

 

 

    ( 扩展 ) 有些项目中需要判断两个表达式, 但是还是要实现逻辑运算

 

    if ( ( v1 = xxxxxx ) || ( v2 = xxxxxxxxxx ) ) {

    }

 

    可以使用 按位或( | ) 与 按位与( & )

 

    注意在逻辑真假中 按位与 和 逻辑与, 以及 按位或与逻辑或 真值等价.

 

    按位与, 就是比较二进制数据中每一个二进制位 并且求 与

 

        0011 & 1100 = 0000 => 3 & 12 == 0

 

        0111 & 0100 = 0100 => 7 & 4 == 4

    

    位运算在前端领域一般在权限限制 状态操作等方面使用. 但是不是绝对的.

 

    算法: 在 a, b, c, d, e, f, g 这几个字符中, 随机的取出 3 个字符串来, 不允许重复 将所有的取法求出来.

 

 

 

9. 问题

    数组中遍历方法能不能使用 this.

    在 js 中这个 this 在函数中被称为上下文( 环境 ).

 

 

10. filter 函数

    功能: 将一个数组中符合某要求的所有元素筛选出来, 组成一个新的数组返回.

    语法: 数组.filter( 回调函数 ) -> 新数组

    回调函数的参数依旧是 v, i

    回调函数判断的时候, 判断元素 v 是否符合要求, 如果符合返回 true, 否则返回 false

    filter 就会将所有的符合元素组成新的数组

 

    案例: 将所有的数字中奇数取出来.

        var arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ];

        arr.filter( v => v % 2 == 1 );

 

        等价于

        arr.filter( function ( v ) {

            return v % 2 == 1;

        } );

 

 

 

 



 

forEach    语法: 数组.forEach( callback )    执行: 遍历数组中的每一个元素, 并且将每一个元素的处理过程交给回调函数    回调函数中会传入两个参数, 一个是遍历的数组元素, 一个是当前的索引.
// 首先如果不提供参数, 那么 this 是 window        // 如果提供一个对象 那么 这个对象就是 回调函数中的 this        // 但是 forEach 这个方法执行一次, 也就是说这个对象是固定不变的        // 也就表明回调函数中的 this 不会随着遍历元素的改变而改变, 它是固定的
    例如: 遍历打印数组中的每一个元素与索引号    传统:        for ( var i = 0; i < arr.length; i++ ) {            console.log( i + ', ' + arr[ i ] );  // 打印, 索引号 与 当前元素        }    forEach:        arr.forEach( function ( value, index ) {             console.log( index + ', ' + value );        } );    比较一下 jq 中的 each 方法        $.each( arr, function ( i, v ) { ... } )    为什么要这样抽象???        由于大多数循环数组都是将数组全部遍历, 因此 forEach 默认就是将数组遍历出来        我们遍历数组的重点是在操作数组中的 当前元素与当前索引. 因此我们将其抽象出来        单独放到回调函数中处理. 那么我们的业务逻辑更加集中.
    思考: 为什么 jq 的 each 方法中回调函数的 参数是 i, v; 而数组中的参数是 v, i 呢?        从实际开发中考虑, 统计上来说遍历数组的时候使用 i 多还是 v 多?        js 中很多特征是动态的, 因此将回调函数写成 v, i 的形式, 如果不需要使用索引, 直接不提供 i 这个参数
        arr.forEach( function ( v, i ) {             // 在函数中只会用到 v 而不会用到 i        } );
        // 如果在设计这个 api 的时候是将 i 放在前面, 那么使用的时候即使不使用 i 也得写        arr.forEach( function ( i, v ) {             // 在函数中只会用到 v 而不会用到 i        } );
        在 jq 中遍历 each 方法有两个, 一个是静态的, 一个是实例.        $.each( arr, callback );        $( 'div' ).each( callback );        在 jq 中遍历每一个 dom 对象的时候 一般不是使用 参数 v 而是使用 this
        $( 'div' ).each( function ( i ) {            this 直接就是 DOM 元素, 如果要使用 索引, 在参数中提供 i 即可        });

 

 

 

10 :    switch底层是===判断:如果数值相等数据类型不同,那么也不算。

posted @ 2017-07-29 07:01  浮生小梦  阅读(205)  评论(0编辑  收藏  举报