闭包的原理:https://blog.csdn.net/Crazy_GirlLL/article/details/114528411
原型链的继承机制:每当代码读取某个对象的某个属性的时候,都会执行一次搜索。首先从对象实例本身开始,如果在实例中找到了该属性,则返回该属性的值,如果没有找到,则顺着原型链指针向上,到原型对象中去找,如果如果找到就返回该属性值。https://blog.csdn.net/weixin_30236595/article/details/95055391
JS类型的判断
typeof | instanceof | constructor | Object.prototype.toString.call | jquery的$.type | |
原理 | typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型 | instanceof 是用来判断 A 是否为 B 的实例 | constructor是原型对象的属性指向构造函数 | 可以取得对象的内部属性[[class]],并根据这个内部属性返回诸如"[object Number]"的字符串 | 其实$.type是基于ES5的Object.prototype.toString.call进一步封装.可以检测出所有的变量类型 |
使用方法 |
| [] instanceof Array | student.prototype.constructor === 'Person'//true | Object.prototype.toString.call(num) // "[object Number]" | $.type([]) // "array" |
能判断的类型 | string,number,boolean,undefined,function | array,object,Date,Function, | 除了undefined和null都可以 | 全都可以 | 全部可以 |
不能判断的类型 | null,object,array,Date返回均为object | 1,null和undefined会被检测为object 2,string,number,boolean是否能判断出来看是如何定义的 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
浏览器内核
- IE:Trident
- 苹果 :Webkit
- 谷歌:Blink(webkit分枝)
- 火狐:Gecko
- 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的深浅拷贝
**浅拷贝之后,操作任意一个变量,都会影响另一个,但是深拷贝不会**
数组的深浅拷贝:
- 浅拷贝:声明一个新变量赋值即可
- 深拷贝:循环追加
对象的深浅拷贝:
- 浅拷贝:Object.assign(obj);
- 深拷贝:JSON.parse(JSON.stringfy(obj))
浏览器输入地址后发生什么
- 浏览器会开启一个线程,对URL进行判断,如果是HTTP协议的话就按照web方式来处理
- 调用浏览器内核的对应方法,比如webview中的loadurl方法
- 通过DNS解析获取网址的IP地址,设置UA等信息来发送第二个GET请求
- 进行HTTP协议会话,发送请求报头
- 进入到web服务器上的web server,如Apache,Tomcat,Nodejs等服务器
- 进入部署好的后端应用,如php ,java,等,找到对应的请求处理
- 进入部署好的后端应用,此处如果浏览器访问过,缓存上就有对应资源,会与服务器最后修改的时间做对比,一致则返回304
- 浏览器开始下载HTML文档(响应包头,状态码为200),同时使用缓存
- 文档树建立,根据标记请求所指定的文件,css,js等,同时设置cookie
- 页面开始渲染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获取样式,属性:
- 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
- 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跨域请求:
- 在页面上直接发起一个跨域的ajax请求是不可以的,但是,在页面上引入不同域上的js脚本却是可以的,就像你可以在自己的页面上使用<img src=""> 标签来随意显示某个域上的图片一样。
- jQuery ajax方式以jsonp类型发起跨域请求,其原理跟<script>脚本请求一样,因此使用jsonp时也只能使用GET方式发起跨域请求。跨域请求需要服务端配合,设置callback,才能完成跨域请求。
- 原文链接:https://www.cnblogs.com/chiangchou/p/jsonp.html
w3c标准:对于我们技术人员来说,主要是定制的开发标准,提高开发效率,表现的更加专业。
包含哪些内容:
- DOCTYPE的含义和三种用法(严格的strict,过度的transitionnal,框架的frameset)
- 名字命名空间namespace
- 需要定义语言编码,即meta标签,否则容易乱码(<meta http-equiv=“Content-Type” content=“text/html; charset=gb2312” />)gb2312表示简体中文,也可根据实际使用Unicode等
- JavaScript定义:js必须要用<script language="javascript" type="text/javascript">来开头定义,而不是原来的<script language=javascript>或干脆直接<script>,并且需要加个注释符<!-- -->,以保证不在不支持js的浏览器上直接显示出代码来。
- css定义:CSS必须要用<style type=“text/css”>开头来定义,而不是原来的直接<style>,也不建议直接写在内容代码里如:<div style=”padding-left:20px;”></div>,并需要加个注释符<!-- --> ;为保证各浏览器的兼容性,在写CSS时请都写上数量单位,例如:错误:.space_10{padding-left:10} 正确:.space_10 {padding-left:10px}
- 注释:不同的位置,有不同的注释符号
- 标签和属性大小写问题:与HTML不一样,XHTML对大小写是敏感的,
- 详情:https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html
ECMA标准:ECMAscript,欧洲计算机制造商协会,不是一门语言,是一个组织,用来规定js的语法规范
- JavaScript的组成:BOM,DOM
- JavaScript代码实现位置:script标签放在页面的任意位置(除title中);所有的js代码都要放在script的标签对中;可以将js的代码写到.js文件中,通过<script src="xx.js"></script>引用,此标签对中的js代码就不会被识别了。
- JavaScript的几个输出语句:alert();document.write();console.log()
- js中的注释://单行;/**/多行
- js中的字面量(常量)
- js中的标识符(变量)的命名规范:js中的变量只能由字母,数字,下划线,$组成(不建议使用中文);变量不能用数字开头;不能使用系统指定的关键字命名;命名规范:驼峰命名法:小驼峰:xiaoBaoBei......大驼峰:XiaoBaoBei......
- 代码书写规范:js中的所有代码严格区分大小写,大小写的不同是两个不同的变量;js每行语句结束后,可以使用回车或;换行
- js所有的标点符号必须使用英文半角状态
- js的变量问题:程序在运行过程中,变量值可能会发生改变
- 变量的定义和赋值:显示定义:通过var定义(var num = 23);隐式定义:不通过var就直接定义变量(num = 23);变量必须先定义后使用
- js输出结果时需要注意的几个问题,:1,如果输出是一个变量 该变量一定不能加引号 "" ;2,如果输出是一个字符类型 一定要加引号;3,如果输出的是一个数 ,可以加引号 也可以不加引号;4,如果输出的是字符 和 变量的组合,需要使用 + 拼接
- 变量的数据类型:1,基本数据类型(简单数据类型):字符串string,数值number,布尔值Boolean,undefined,null,复杂数据类型(引用数据类型):object,array
- 运算符 : (+)( - )(*)( / )(%)( ++)( --)(== )( === )(&&)( ||)( !)(?:)
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有能力与浏览器对话;
- window对象
- windows对象下的方法:window.alert();window.confirm();console.log()
- open("http://www.baidu.com");open打开网址;close关闭窗口
- setInterval()
- clearInterval()
- setTimeout()
- 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
事件流:事件捕获--> 事件目标-->事件冒泡
- 冒泡事件:父级有点击事件,那么点击这个父级或者父级里面的子级或者孙子级,父级的点击事件也会触发;
- 取消冒泡:window.event? window.event.cancelBubble = true : e.stopPropagation();
- 取消默认行为:w3c的方法是window.event.preventDefault(),IE则是使用window.event..returnValue = false;,jquery用法:return false
- 委托事件(实际上是利用了事件冒泡),事件对象里面有一个属性:事件源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=fn | obj.addEventListener('click',fn,false) | obj.attachEvent('onclick',fn) | |
顺序 | 仅支持最后一个 | 按照绑定的顺序,挨个执行 | 按照绑定的顺序,从后面挨个执行:
| |
多个是否被覆盖 | 是 | 否 | 否 | |
this指向 | 指向当前绑定事件的对象 | 指向当前绑定事件的对象 | 指向window | |
支持的浏览器 | 全部支持 | 谷歌火狐支持,IE11支持,IE8不支持 | 谷歌火狐支持,IE11不支持,IE8支持 | |
事件解绑 | obj.οnclick=null | obj.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指向问题:
- 全局环境:指向window
- 定时器和延时器:指向window
- 对象中的方法:指向该对象
- 事件绑定函数:指向调用该事件的元素
this指向的修改:
- this变量转化:在要改变this指向的函数外,使用其他变量指向this。var that= this
- call():obj.myFun.call(db,'参数1','参数2');
- bind():obj.myFun.apply(db,['参数1','参数2']);
- apply():obj.myFun.bind(db)('参数1','参数2');
获取元素的方式:
- getElementById,无兼容性,支持IE6
- getElementsByTagName,无兼容性,支持IE6
- getElementsByClassName,,兼容性,不支持IE6
- 详见: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]"
如何判断页面已经渲染完成?哪个事件?
- window.οnlοad=function(){}
- $(document).rady(function(){})
- 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的状态码表示什么意思:
- 200:成功
- 400:错误请求。参数错误等
- 401:未授权,请求需要身份验证
- 403:禁止,服务器拒绝请求
- 404:未找到,找不到请求的网页
- 405:请求中的方法禁用
- 500:服务器内部错误
- 503:服务不可用,服务器超载或停机
- 504:网关超时
- 详情:https://www.cnblogs.com/maigy/p/11480011.html
electron开发原理:用于开发桌面web形式的应用程序
正则表达式:https://www.runoob.com/regexp/regexp-syntax.html