知识点整理:JavaScript&&jquery

闭包的原理https://blog.csdn.net/Crazy_GirlLL/article/details/114528411

原型链的继承机制:每当代码读取某个对象的某个属性的时候,都会执行一次搜索。首先从对象实例本身开始,如果在实例中找到了该属性,则返回该属性的值,如果没有找到,则顺着原型链指针向上,到原型对象中去找,如果如果找到就返回该属性值。https://blog.csdn.net/weixin_30236595/article/details/95055391

JS类型的判断

 typeofinstanceofconstructorObject.prototype.toString.calljquery的$.type
原理typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型instanceof 是用来判断 A 是否为 B 的实例

constructor是原型对象的属性指向构造函数

可以取得对象的内部属性[[class]],并根据这个内部属性返回诸如"[object  Number]"的字符串其实$.type是基于ES5的Object.prototype.toString.call进一步封装.可以检测出所有的变量类型
使用方法

typeof('')

"string"小写

[] instanceof Arraystudent.prototype.constructor === 'Person'//true

Object.prototype.toString.call(num)

//     "[object  Number]"

$.type([])   //    "array"
能判断的类型string,number,boolean,undefined,functionarray,object,Date,Function,除了undefined和null都可以全都可以全部可以
不能判断的类型null,object,array,Date返回均为object

1,null和undefined会被检测为object

2,string,number,boolean是否能判断出来看是如何定义的
let num = new Number(1)

num instanceof Number   //    true

let num1 = 2

num1 instanceof Number  // false

undefined,null  

但是constructor指向的构造函数是可以被修改的

class Stuent = {
      constructor(age){
         this.age =age;
      }
}
Student.prototype = new Person('张三')
Student.prototype.constructor === 'Person'//true
————————————————
原文链接:https://blog.csdn.net/u010998803/article/details/80732942

浏览器内核

  1. IE:Trident 
  2. 苹果   :Webkit 
  3. 谷歌:Blink(webkit分枝)
  4. 火狐:Gecko 
  5. Opera :Blink

localStorage,sessionStorage,cookie

存储方式

存储位置

是否共享保存时间

存储数量及大小

api

cookie

浏览器和服务器间来回传递

同源共享
在所有同源的窗口中共享的
在设置的有效期内,和有无关闭窗口和浏览器无关

● 最好将cookie控制在4k以内,超出的数据会被忽略。

● IE6或更低版本最多存20个cookie; IE7及以上版本最多可以有50个;Firefox最多50个;chrome和Safari没有做硬性限制。

设置:$.cookie('name', 'value', { expires: 7, path: '/', domain: 'example.com', secure: false});

读取:$.cookie('name');

读取所有:$.cookie();

删除:$.removeCookie('name');

localStorage

●本地存储

 

同源共享

在所有同源的窗口中共享的

永久保存,除非用户手动清理客户端缓存。

5M左右,各浏览器的存储空间有差异。(感兴趣的同学可以自己试一下)。

设置:localStorage.setItem('key', 'value');

获取:localStorage.getItem('key');

删除:localStorage.removeItem('key');

删除所有:localStorage.clear();

sessionStorage

● 本地存储

 

同源共享,

但是不同浏览器之间不共享,即使同一个页面

关闭页面则数据失效

同localStorage

保存:sessionStorage.setItem('key', 'value');

获取:sessionStorage.getItem('key');

删除:sessionStorage.removeItem('key');

删除所有:sessionStorage.clear();

摘自:https://www.cnblogs.com/qiujianmei/p/10824682.html

js的深浅拷贝

**浅拷贝之后,操作任意一个变量,都会影响另一个,但是深拷贝不会**

数组的深浅拷贝:

  1. 浅拷贝:声明一个新变量赋值即可
  2. 深拷贝:循环追加

对象的深浅拷贝:

  1. 浅拷贝:Object.assign(obj);
  2. 深拷贝:JSON.parse(JSON.stringfy(obj))

浏览器输入地址后发生什么

  1. 浏览器会开启一个线程,对URL进行判断,如果是HTTP协议的话就按照web方式来处理
  2. 调用浏览器内核的对应方法,比如webview中的loadurl方法
  3. 通过DNS解析获取网址的IP地址,设置UA等信息来发送第二个GET请求
  4. 进行HTTP协议会话,发送请求报头
  5. 进入到web服务器上的web server,如Apache,Tomcat,Nodejs等服务器
  6. 进入部署好的后端应用,如php ,java,等,找到对应的请求处理
  7. 进入部署好的后端应用,此处如果浏览器访问过,缓存上就有对应资源,会与服务器最后修改的时间做对比,一致则返回304
  8. 浏览器开始下载HTML文档(响应包头,状态码为200),同时使用缓存
  9. 文档树建立,根据标记请求所指定的文件,css,js等,同时设置cookie
  10. 页面开始渲染dom,js根据DOM  API  操作DOM,执行事件绑定等,页面显示完成

ajax示例

$.ajax({
  type:'POST', // 规定请求的类型(GET 或 POST)
  url:uploadV, // 请求的url地址
  dataType:'json', //预期的服务器响应的数据类型 
  data:{},//规定要发送到服务器的数据
    `async:true;//表示请求时异步还是同步,默认是true,`
  beforeSend:function(){ //发送请求前运行的函数(发送之前就会进入这个函数)
    // ....
  },
  success: function(result){ // 当请求成功时运行的函数
    //...
  },
  error:function(result){ //失败的函数
    //...
  },
  complete:function(){ //请求完成时运行的函数(在请求成功或失败之后均调用,即在 success 和 error 函数之后,不管成功还是失败 都会进这个函数)
    // ...
  }
});

js获取样式,属性:

  1. css操作
`单个样式:`
$("#mydiv").css("color",'red');

`单个属性`
$("img").css("alt",'哈哈哈哈');

`多个样式:`
$("#mydiv").css({
    'width':'100px',
    'height':'200px',
})

`多个属性`
$("img").css({
    title:'哈哈哈',
    style:'opacity:0.2',
})

`获取样式;`
$("div").css("color");//只会返回第一个元素对应的样式值

`获取属性`
$("img").attr("title")//只会返回第一个元素对应的样式值

在jquery更新后的版本中,对于checked,selected,disabe这类boolean类型的属性来说,如果使用attr方法获取属性值,得到的不是false和true,而是undefined,所以需要使用#prop方法来获取和设置,使用方法和attr一样

//设置属性
$("input").prop("checked",true);

//获取属性
$("input").prop("checked");//返回true或者false
  1. class操作:
1,添加类样式
`addClass(name)`;name不需要带点.//$("div").addClass("one");

2,移除样式
`removeClass(name/可选)`;name可有可无,有时是移除单个样式类名,没有时则为移除所有样式类

   #移除属性
`removeAttr(name)`如果不传值,则不会有任何操作,并不是移除所有的属性
$("img").removeAttr("title");

3,判断是否有样式类
`hasClass(name)`;返回true,或者false;//$("div").hasClass("one");

4,切换样式类
`toggleClass(name)`;有该样式则移除,没有则添加;//$("div").toggleCLass("one")

js操作dom

1,追加节点
  $(父元素).append(子元素)//父元素结尾追加子元素
  同类还有: prepend//父元素前面追加子元素  
         ` $(子元素).appendTo(父元素)`

2,清空元素
   1,`empty();`自身不会删除
      $("div").empty();//推荐,会清空子元素上绑定的内容
   2,`html()`自身不会删除
      $("div").html("");//不推荐,绑定的事件不会被清除

3,删除元素
  `remove()`自身也会删除
  $("div").remove()

4,克隆元素
  `cloneNode(true)`//属于js的
  `clone()`//属于jquery
  是否是深度克隆,看括号内是否有规定的参数,
  一般克隆只是复制了该元素而已,深度克隆,则会复制该元素的属性之类的

CSS动画

1,显示与隐藏
 **show**(完成时间 / 可选,callback / 可选) 和 **hide**(完成时间 / 可选,callback / 可选)

2,滑入滑出
 **slideDown**(完成时间 / 可选,callback / 可选) 和 **slideUp**(完成时间 / 可选,callback / 可选)

完成时间不传时,默认normal,show()和hide()如果不传,则无动画效果;
滑入滑出切换:**slideToggle**(完成时间 / 可选,callback / 可选)

3,淡入淡出
 **fadeIn**(完成时间 / 可选,callback / 可选) 和 **fadeOut**(完成时间 / 可选,callback / 可选)

用法同slideDown()和slideUp()

淡入淡出切换:
**fadeToggle**(完成时间 / 可选,callback / 可选);只能在完全透明和完全不透明之间切换

淡入淡出到某个值:
**fadeTo**(完成时间 / 必须,value,callback / 可选);value表示0-1之间的数值,表示淡到某一个值

4,自定义动画
**animate();**
​   $(selector).animate({params},speed,callback);
​   params:要执行动画的css属性,带数字(必须);
​   speed和callback可选

5,停止动画
**stop()**
stop(参数1,参数2)//常用stop();stop(true)

jsonp跨域请求

  1. 在页面上直接发起一个跨域的ajax请求是不可以的,但是,在页面上引入不同域上的js脚本却是可以的,就像你可以在自己的页面上使用<img src=""> 标签来随意显示某个域上的图片一样。
  2. jQuery ajax方式以jsonp类型发起跨域请求,其原理跟<script>脚本请求一样,因此使用jsonp时也只能使用GET方式发起跨域请求。跨域请求需要服务端配合,设置callback,才能完成跨域请求。
  3. 原文链接:https://www.cnblogs.com/chiangchou/p/jsonp.html

w3c标准:对于我们技术人员来说,主要是定制的开发标准,提高开发效率,表现的更加专业。

包含哪些内容:

  1. DOCTYPE的含义和三种用法(严格的strict,过度的transitionnal,框架的frameset)
  2. 名字命名空间namespace
  3. 需要定义语言编码,即meta标签,否则容易乱码(<meta http-equiv=“Content-Type” content=“text/html; charset=gb2312” />)gb2312表示简体中文,也可根据实际使用Unicode等
  4. JavaScript定义:js必须要用<script language="javascript" type="text/javascript">来开头定义,而不是原来的<script language=javascript>或干脆直接<script>,并且需要加个注释符<!--   -->,以保证不在不支持js的浏览器上直接显示出代码来。
  5. css定义:CSS必须要用<style type=“text/css”>开头来定义,而不是原来的直接<style>,也不建议直接写在内容代码里如:<div style=”padding-left:20px;”></div>,并需要加个注释符<!-- --> ;为保证各浏览器的兼容性,在写CSS时请都写上数量单位,例如:错误:.space_10{padding-left:10} 正确:.space_10 {padding-left:10px}
  6. 注释:不同的位置,有不同的注释符号
  7. 标签和属性大小写问题:与HTML不一样,XHTML对大小写是敏感的,
  8. 详情:https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html

ECMA标准ECMAscript,欧洲计算机制造商协会,不是一门语言,是一个组织,用来规定js的语法规范

  1. JavaScript的组成:BOM,DOM
  2. JavaScript代码实现位置:script标签放在页面的任意位置(除title中);所有的js代码都要放在script的标签对中;可以将js的代码写到.js文件中,通过<script src="xx.js"></script>引用,此标签对中的js代码就不会被识别了
  3. JavaScript的几个输出语句:alert();document.write();console.log()
  4. js中的注释://单行;/**/多行
  5. js中的字面量(常量)
  6. js中的标识符(变量)的命名规范:js中的变量只能由字母,数字,下划线,$组成(不建议使用中文);变量不能用数字开头;不能使用系统指定的关键字命名;命名规范:驼峰命名法:小驼峰:xiaoBaoBei......大驼峰:XiaoBaoBei......
  7. 代码书写规范:js中的所有代码严格区分大小写,大小写的不同是两个不同的变量;js每行语句结束后,可以使用回车或;换行
  8. js所有的标点符号必须使用英文半角状态
  9. js的变量问题:程序在运行过程中,变量值可能会发生改变
  10. 变量的定义和赋值:显示定义:通过var定义(var num = 23);隐式定义:不通过var就直接定义变量(num = 23);变量必须先定义后使用
  11. js输出结果时需要注意的几个问题,:1,如果输出是一个变量 该变量一定不能加引号 "" ;2,如果输出是一个字符类型 一定要加引号;3,如果输出的是一个数 ,可以加引号 也可以不加引号;4,如果输出的是字符 和 变量的组合,需要使用 + 拼接
  12. 变量的数据类型:1,基本数据类型(简单数据类型):字符串string,数值number,布尔值Boolean,undefined,null,复杂数据类型(引用数据类型):object,array
  13. 运算符 : (+)( - )(*)( / )(%)( ++)( --)(== )( === )(&&)( ||)( !)(?:)
1,表达式的使用:
+ :表示连接。栗子:10+“20“=“1020”;
- * /:表示运算。如果符号良策有一侧是纯数字字符串,纯数字字符串自动转成数值类型;如果符号良策有一侧        
    是非数字的字符串,结果NAN,不能正常计算的结果都是NAN。
    栗子:"20" + 10 - "10" = "2010"-"10" = 2000 结果类型 number
% :求余数。结果正负取决于 %左侧的操作数。栗子:2%3=2;-2%3=-2;2%-3=2;
2,单目运算符的使用:
    ++ 自增 -- 自减 注意: ++ -- 的操作数必须是变量
    ++i 和 i++ 的异同: 
    相同: 变量i的结果都会自增1 
    不同: 表达式的结果不同 
    如果++在后,也就是i++, 先将i的值作为整个表达式的值, i再自增 (先赋值,后自增) var i = 10; 
    j = i++; // i = 11 j = 10 (用变量j来代替整个表达式的值) 
    如果++在前,也就是++i, 先将i自增,再将i的值作为整个表达式的值 (先自增,后赋值) var i = 10; 
    j = ++i; // i = 11 j = 11
3,特殊的注意:
    4 + true = 5 5 - false = 5
    true 和 false 进行运算时,true自动转成1 false 自动转成0
4,关系运算符:
    > >= < <= ==等于 ===全等于 != 不等于 !== 全不等 
    返回: true false
5,==和===的区别:
    == 等于 只比较结果值,不比较类型 100 == “100” true 100!="100" false
    === 全等 先比较类型 在比较结果值 100 === “100” false 100 !== "100" true
6,逻辑运算符:
    运算符 (||或) (&& 与) (! 非)
    这里还有一个true遇到||,false遇到&&短路的问题,感兴趣可以
    https://blog.csdn.net/qq_40456669/article/details/80587005
7,条件运算符:?:
    1>2?false:true

 

DOM,BOM操作

BOM浏览器对象模型:使JavaScript有能力与浏览器对话;

  1. window对象
  2. windows对象下的方法:window.alert();window.confirm();console.log()
  3. open("http://www.baidu.com");open打开网址;close关闭窗口
  4. setInterval()
  5. clearInterval()
  6. setTimeout()
  7. clearTImeout()

DOM文档对象模型:允许程序和脚本动态的访问和更新文档内容,结构和样式

//根据W3C的html DOM标准,html文档中的所有内容都是节点(NODE):
//整个文档是一个文档节点(docunment对象)
//每个html元素是元素节点(element对象)
//html元素内的文本是文本节点(text对象)
//每个HTML属性是属性节点(attribute对象)
//注释是注释节点(comment对象)

//children 所有子标签 数组
//parentElement父级元素
//firstElementchild 第一个子标签元素   注意这里获取文本节点的方式
//lastElementchild  最后一个子标签元素
//nextElementtSibling 下一个兄弟标签元素
//previousElementSibling 上一个兄弟标签元素

JS选中元素的四中方法
var obj=Document.getElementById("id名字")
var obj1=Document.getElementByClassName("class名字")
var obj2=Document.getElementByTagName("标签名字")

取自:https://www.cnblogs.com/tangcode/p/11910205.html

关键字就是js本身已经使用了,具有特殊的含义,你就不能再用他们充当变量名或者函数名;比如:this,do,for,function,new,if,in,var,with,while,break、case、catch、

保留字实际上就是预留的“关键字”,意思是现在虽然还不是关键字,也没有特殊含义,但是未来可能会成为关键字,所以也不能使用它们作为变量名和函数名。比如:boolean,byte,char,class,const,debugger,export,float,import,static,package

详见:https://zhidao.baidu.com/question/1756711539005882828.html

原生js实现下拉框选中

   <body>
       <input type="button" value="单击选中深圳" >
       <select name="address" id="address">
           <option value="bj" >北京</option>
           <option value="sz" >深圳</option>
           <option value="sh" selected>上海</option>
       </select>
   </body>
   <script>
       var sel = document.getElementsByTagName("select")[0];
       var aInp = document.getElementsByTagName("input")[0];
       aInp.onclick=function(){
           //点击按钮,选中深圳
       sel.value = 'sz';
       }
   </script>

作用域与预解析:

一:`预解析`:就是在当前作用域中,javascript代码执行前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

ps: 1,带var的(var a = 1;或者var b=function(){};只要带var的)这些都会提前声明;
    2,function有两种,一种是上面带var的,一种是function num(){}这种,如果是这种的话,则会提前,并且会同时声明
    3,如果声明的变量和函数名一致,那么函数优先

eg:                                       var a;//声明
var a = 1;                                function a(){
function a(){            预解析为:             console.log(2)
    console.log(2)       ======>           }//已经声明过了,不需要重新的声明
};                                         //但是需要重新的赋值
console.log(a);                            a=1;
                                           console.log(a);//1
                                           a();//Uncaught TypeError:
                                           // a is not a function

`作用域链`:函数里面的是私有作用域,当私有作用域执行的时候,遇到了一个变量,需要确定他是否为私有变量,如果是私有变量,那么和外面的任何东西都无关,如果不是私有的,那么就在当前作用域的上级作用域进行查找,如果上级作用域也没有则继续查找,一直找到window为止,这就是作用域链。

当函数中执行的时候,首先会形成一个新的私有作用域,然后按照如下的步骤执行:

1:如果有形参(形参也为私有变量),先给形参赋值;

2:进行私有作用域中的预解析;

3:私有作用域中的代码从上到下执行

`eg1:`

console.log(t);                               function func(num1,num2){
var t = 0;                                       var t;      
function func(num1, num2) {     预解析为:        console.log(t);//undefined
    console.log(t);             =======>>        t=num1+num2;
    var t = num1 + num2;                         console.log(t);//300
    console.log(t);                           }
}                                             var t;       
func(100 , 200);                              console.log(t);//undefined
console.log(t);                               t=0;
                                              func(200,300);
                                              console.log(t)//0

------------------------------------------------------------------    

  `eg2:`

console.log(t);                                  function func(num1,num2){
var t = 0;                                           console.log(t);//0
function func(num1, num2) {                          t=num1+num2;
    console.log(t);                                  console.log(t);//300
    t = num1 + num2;              预解析为:      }
    console.log(t);               =======>       var t;
}                                                console.log(t);//undefined
func(100 , 200);                                 t=0;
console.log(t);                                  func(100,200);
                                                 console.log(t);//300

上述两个例子的区别在于私有作用域中的变量是否为私有变量  

---------------------------------------------------------------------   

全局作用域下:带var和不带var的区别:

`eg1:`                                   `eg2:`

 console.log(num1);//undefined           console.log(num2);//num2 is not defined
 var num1 = 12;                          num2 = 12;

 1,num2 = 12;相当于给window增加了一个num2的属性名,属性值为12;
 2,var num1 = 12;相当于给全局作用域增加了一个全局变量num1,而且也给window增加了一个属性名为num1属性,值为12;
        

预解析中的变态机制: 

1,不管条件是否成立,都会把带var的进行提前声明

 if(!('num' in window)){       预解析为:    var num ;
    var num = 12;              ======>      if(!('num' in window)){
 }                                            num = 12;
 console.log(num);                          };
                                            console.log(num);//undefined

 ------------------------------------------------------------------

 2,自执行函数:闭包,定义和执行一起完成(在全局作用域下不进行预解析,当代码执行到这个位置的时候,定义和执行一起完成了)

    ~ function (num) {}(100)  

    + function (num) {}(100)  

    - function (num) {}(100)  

    ! function (num) {}(100)

 以上也属于自执行函数

 ------------------------------------------------------------------

 3,return下的代码依然会进行预解析

 function fn(){                             function fn(){                
     console.log(num);           预解析        var num ;      
     return function (){};       ======>      console.log(num);//undefined
     var num = 100;                           return function(){};
 };                                           num = 100;
 fn();                                      };
                                            fn();//function(){}

   函数体中的`return后面`的代码,虽然不再执行了,但是需要进行预解析;
            `return中`的代码,都是我们的返回值,所以不进行预解析

------------------------------------------------------------------


  4, `终极eg:`

    fn();                                   function fn(){                      
    function fn() {                            console.log(1);
        console.log(1);                     };//函数1
    };                                      function fn(){
    fn();                      预解析:         console.log(2);
    var fn = 10;              ======>       };//函数2
    fn();                                   fn();//函数2
    function fn() {                         fn();//函数2
        console.log(2);                     fn=10;
    }                                       fn();//报错1
    fn();                                   fn();//报错1

        报错1:Uncaught TypeError: fn is not a function

摘自:https://www.cnblogs.com/shaohua007/p/7587657.html

事件流:事件捕获--> 事件目标-->事件冒泡

  1. 冒泡事件:父级有点击事件,那么点击这个父级或者父级里面的子级或者孙子级,父级的点击事件也会触发;
  2. 取消冒泡:window.event? window.event.cancelBubble = true : e.stopPropagation();
  3. 取消默认行为:w3c的方法是window.event.preventDefault(),IE则是使用window.event..returnValue = false;,jquery用法:return false
  4. 委托事件(实际上是利用了事件冒泡),事件对象里面有一个属性:事件源target(事件触发时的事件源)而事件源里面有一个nodeName,以此来确定是触发了哪个元素;
oUl.onclick = function(event) {
     var e = window.event || event;
    //事件对象里面有一个属性叫target 事件触发时的事件源
    //标准浏览器:e.target 事件源
    //IE支持 : e.srcElement  事件源
    var abc = e.target || e.srcElement;
    // console.log(target);
    // 通过判断 当前的单击的事件源头 的节点名称 是不是A 如果是a  则删除a所在的这一行
    if(abc.nodeName == "A") {
         to do something。。。
    }
}

offset和client,scroll:下面所有的offset系列和client系列,scroll系列,都可以通过console.dir(元素)打印出来

<body>
    <div id="box"></div>
</body>
<script type="text/javascript">
    var oBox = document.getElementById("box");
    console.dir(oBox)
    //A.offsetParent  找到距离A最近的具有定位属性的父级  
    console.log(oBox.offsetParent); //如果父级都没有定位,就指向body,body    
    console.log("oBox.offsetLeft:"+oBox.offsetLeft); // 距离box的offsetParent的左侧偏移量
    onsole.log("oBox.offsetTop:"+oBox.offsetTop);//距离box的offsetParent的顶部偏移量
    console.log("oBox.offsetWidth:"+oBox.offsetWidth);//自身定义的宽 + 左右padding + 左右border
    console.log("oBox.offsetHeight:"+oBox.offsetHeight);// 自身定义的高+ 上下padding+ 上下border
    console.log("oBox.clientWidth:"+oBox.clientWidth);// 自身定义的宽 + 左右padding
    console.log("oBox.clientHeight:"+oBox.clientHeight);// 自身定义的高+ 上下padding
    console.log("oBox.clientLeft:"+oBox.clientLeft);//border-left:左边框的宽
    console.log("oBox.clientTop:"+oBox.clientTop);//border-top:上边框的宽

  给元素添加一个滚动条滚动事件,只要一滚动就触发该事件
    但是IE7 8 中,认为document对象上面没有onscroll事件
    document.onscroll = function(){};
    有必要时,需要再添加一个函数:
    window.onscroll = function(){};
    在获取页面的scrolTop ,才需要做兼容处理:
    var  scrollT = document.documentElement.scrollTop || document.body.scrollTop;
    `console.log("oBox.scrolltWidth:"+oBox.scrollWidth);// 自身定义的宽 + 左右padding
    console.log("oBox.scrollHeight:"+oBox.scrollHeight);// 自身定义的高+ 上下padding`
    `这两个在chrome和IE显示不一样,所以不常用`
    console.log("oBox.scrollLeft:"+oBox.scrollLeft);//元素内部的水平滚动条滚动过的(左侧)距离 (一般网页不允许出现水平滚动条 用户体验不好)
    console.log("oBox.scrollTop:"+oBox.scrollTop);//元素内部的垂直滚动条滚动过(卷曲过的)(顶部)的距离
</script>

**页面可是区域的宽高,没有兼容性**
document.documentElement.clientWidth;document.documentElement.clientHeight;
document.documentElement.scrollHeight = document.documentElement.clientHeight + scrollT;

事件的绑定:其实jquery还有on(),bind(),delegate()三种方法,但是追根究底,后两者也是用on()来封装的,只是参数不同,所以使用on()就可以了

类型obj.οnclick=fnobj.addEventListener('click',fn,false)obj.attachEvent('onclick',fn) 
顺序仅支持最后一个按照绑定的顺序,挨个执行按照绑定的顺序,从后面挨个执行:

obj.attachEvent('onmousedown',Func2);

        obj.attachEvent('onmousedown',Func3);

先执行func3,后执行func2

 
多个是否被覆盖 
this指向指向当前绑定事件的对象指向当前绑定事件的对象指向window 
支持的浏览器全部支持谷歌火狐支持,IE11支持,IE8不支持谷歌火狐支持,IE11不支持,IE8支持 
事件解绑obj.οnclick=nullobj.removeEventListener('click',fn,false)obj.detachEvent('onclick',fn) 

 

通过e.eventPhase这个属性可以知道当前的事件是什么阶段你的
如果这个属性的值是:
1---->捕获阶段
2---->目标阶段
3---->冒泡阶段
一般默认都是冒泡阶段,很少用捕获阶段
冒泡阶段:从里向外
捕获阶段:从外向里
addEventListener方法的第三个参数是false的时候是冒泡阶段,true的时候是捕获阶段

如果多个函数:

true 的触发顺序总是在 false 之前;
如果多个均为 true,则外层的触发先于内层;
如果多个均为 false,则内层的触发先于外层。

下面是绑定事件的兼容函数和解绑事件的兼容函数

//绑定事件的兼容
    function addEventListener(element, type, fn) {
        if (element.addEventListener) {
            element.addEventListener(type, fn, false);
        } else if (element.attachEvent) {
            element.attachEvent("on" + type, fn);
        } else {
            element["on" + type] = fn;
        }
    }
 
    //解绑事件的兼容
    //为任意的一个元素,解绑对应的事件
    function removeEventListener(element, type, fnName) {
        if (element.removeEventListener) {
            element.removeEventListener(type, fnName, false);
        } else if (element.detachEvent) {
            element.detachEvent("on" + type, fnName);
        } else {
            element["on" + type] = null;
        }
    }
原文链接:https://blog.csdn.net/tswc_byy/article/details/82824798

this指向问题

  1. 全局环境:指向window
  2. 定时器和延时器:指向window
  3. 对象中的方法:指向该对象
  4. 事件绑定函数:指向调用该事件的元素

this指向的修改:

  1. this变量转化:在要改变this指向的函数外,使用其他变量指向this。var that= this
  2. call():obj.myFun.call(db,'参数1','参数2');
  3. bind():obj.myFun.apply(db,['参数1','参数2']); 
  4. apply():obj.myFun.bind(db)('参数1','参数2');

获取元素的方式

  1. getElementById,无兼容性,支持IE6
  2. getElementsByTagName,无兼容性,支持IE6
  3. getElementsByClassName,,兼容性,不支持IE6
  4. 详见:https://www.jb51.net/article/61737.htm

前端浏览器的兼容性问题:https://blog.csdn.net/Crazy_GirlLL/article/details/114588497

递归,斐波那契数列:(斐波那契数列  : 1、1、2、3、5、8、13、21、34)

function fb(n){
    if(n === 1 || n === 2){
        return 1;
    }
    return fb(n - 1) + fb(n - 2);
}
console.log(fb(8)); // 21
 
/*
   fb(8) = fb(7) + fb(6)       21 = fb(8) = 13 + 8
   fb(7) = fb(6) + fb(5)       13 = fb(7) = 8 +5
   fb(6) = fb(5) + fb(4)       8 =  fb(6) = 5 + 3
   fb(5) = fb(4) + fb(3)       5 =  fb(5) = 3 + 2
   fb(4) = fb(3) + fb(2)       3 =  fb(4) = 2 + 1
   fb(3) = fb(2) + fb(1)       2 =  fb(3) = 1 + 1
   fb(2) = 1                   1 =  fb(2) = 1
   fb(1) = 1                   1 =  fb(1) = 1

*/

typeof判断数据类型,如何判断数组和对象

console.log(
    typeof 123, //"number"
    typeof 'dsfsf', //"string"
    typeof false, //"boolean"
    typeof [1,2,3], //"object"
    typeof {a:1,b:2,c:3}, //"object"
    typeof function(){console.log('aaa');}, //"function"
    typeof undefined, //"undefined"
    typeof null, //"object"
    typeof new Date(), //"object"
);

其中typeof可以判断:Number,String,Boolean,Function,undefined

但是Array,Object,Null,Date,RegExp,Error这几个类型都被判断为object

所以需要使用Object.prototype.toString.call()的方式来判断一个变量的类型是最准确的方法。

var toString = Object.prototype.toString;

toString.call(123); //"[object Number]"
toString.call('abcdef'); //"[object String]"
toString.call(true); //"[object Boolean]"
toString.call([1, 2, 3, 4]); //"[object Array]"
toString.call({name:'wenzi', age:25}); //"[object Object]"
toString.call(function(){ console.log('this is function'); }); //"[object Function]"
toString.call(undefined); //"[object Undefined]"
toString.call(null); //"[object Null]"
toString.call(new Date()); //"[object Date]"
toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]"
toString.call(new Error()); //"[object Error]"

如何判断页面已经渲染完成?哪个事件?

  1. window.οnlοad=function(){}
  2. $(document).rady(function(){})
  3. document,onreadystatechange的方法用来监听状态改变,然后document.readyState==‘complete’判断是否加载完成

jquery选择器:https://blog.csdn.net/Crazy_GirlLL/article/details/114636901

HBuilder唤醒APP,没有APP则下载:需要注册schemes,用来实现APP之间的跳转,然后加入一些代码:https://mp.csdn.net/editor/html/108705502

HBuilder微信分享:主要是权限的配置,有share分享模块,然后配置相关的APPID,APPkey,代码视图manifest.json里面加入要分享的软件,微信啊,qq之类的,然后分享主要用的是plus.nativeUI.actionSheet。详情:https://blog.csdn.net/zhuming3834/article/details/51706256

http的状态码表示什么意思:

  1. 200:成功
  2. 400:错误请求。参数错误等
  3. 401:未授权,请求需要身份验证
  4. 403:禁止,服务器拒绝请求
  5. 404:未找到,找不到请求的网页
  6. 405:请求中的方法禁用
  7. 500:服务器内部错误
  8. 503:服务不可用,服务器超载或停机
  9. 504:网关超时
  10. 详情:https://www.cnblogs.com/maigy/p/11480011.html

electron开发原理:用于开发桌面web形式的应用程序

正则表达式:https://www.runoob.com/regexp/regexp-syntax.html

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值