JavaScript基础(七)

1、事件的冒泡:指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发。
在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消冒泡。
将事件对象的cancelBubble设置为true,即可取消冒泡。
2、事件的委派:指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件被触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件。
事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能。
我们希望,只绑定一次事件,即可应用到多个的元素上,即使元素是后添加的。
我们可以尝试将其绑定给元素的共同的祖先元素。
target:event中的target表示的触发事件的对象。
如果触发事件的对象是我们期望的元素,则执行,否则不执行。
3、事件的绑定
使用:对象.事件 = 函数 的形式绑定响应函数。
他只能同时为一个元素的一个事件绑定一个响应函数,不能绑定多个,如果绑定了多个,则后面会覆盖掉前面的。

  • addEventListener():通过这个方法也可以为元素绑定响应函数。
    参数:1、事件的字符串,不要on
    2、回调函数,当事件触发时该函数会被调用
    3、是否在捕获阶段触发事件,需要一个布尔值,一般都传false

eg:

btn01.addEventListener("click",function(){
	alert(1);
},false);

使用addEventListener()可以同时为一个元素的相同事件同时绑定多个响应函数,这样当事件被触发时,响应函数将会按照函数的绑定顺序执行。
这个方法不支持IE8及以下的浏览器。

  • attachEvent():在IE8中可以使用attachEvent()来绑定事件。
    参数:1、事件的字符串,要on
    2、回调函数
    这个方法也可以同时为一个事件绑定多个处理函数,不同的是他是后绑定先执行,执行顺序和addEventListener()相反。

  • 定义一个函数。用来为指定元素绑定响应函数

/*addEventListener()中的this,是绑定事件的对象。
attachEvent()中的this,是window。
需要统一两个方法this*/
/*参数:obj    要绑定事件的对象
eventStr    事件的字符串
callback   回调函数
*/
function bind(obj,eventStr,callStr){
	if(obj.addEventListener){
			//大部分浏览器都兼容的模式
	obj.addEventListener(eventStr,callStr,false);
	}else{
			//this是谁由调用方式决定
			//callback.call(obj)
	//IE8及以下
	obj.attachEvent("on"+eventStr,function(){
			//在匿名函数中调用回调函数
			callback.call(obj);
	});
	}
}

4、事件的绑定

  • 关于事件的传播网景公司和微软公司有不同的理解。

  • 微软公司认为事件应该是由内向外传播,也就是当事件被触发时,应该先触发当前元素上的事件,然后再向当前的祖先元素上传播,也就是说事件应该在冒泡阶段执行。

  • 网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素的事件,然后再向内传播给后代元素。

  • W3C综合了两个公司的方案,将事件传播分成了三个阶段:
    1、捕获阶段
    在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件。
    2、目标阶段
    事件捕获到目标元素,捕获结束开始在目标元素上触发事件。
    3、冒泡阶段
    时间从目标元素向他的祖先元素传递,依次触发祖先元素上的事件。

  • 如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true,一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是false。

  • IE8及以下的浏览器没有捕获阶段。
    5、拖拽
    拖拽的流程:
    1、当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown
    2、当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
    3、当鼠标松开时,被拖拽元素固定在当前位置 onmouseup

  • 要想使点击某个位置,div随之被拖拽:
    div的偏移量:鼠标.clentX - 元素.offsetLeft
    div的偏移量:鼠标.clentY - 元素.offsetTop

  • 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,此时会导致拖拽功能的异常,这个是浏览器提供的默认行为。

  • 如果不希望发生这个行为,则可以通过return false来取消默认行为。但是对IE8不适用。

document.onmouseup = function(){
 	document.onmousemove = null;
 	document.onmouseup = null;
 };
 return false;

6、拖拽2

  • setCapture()
    只有IE支持,但是在火狐中调用不会报错,在chrome中调用会报错。
    判断什么时候调用:
box1.setCapture && box1.setCapture();

当调用一个元素的setCapture()方法以后,这个元素将会把下一次所有的鼠标按下相关的事件捕获到自身上。

  • 提取一个专门用来设置拖拽的函数
//参数: 开启拖拽的元素
function drag(obj){
	obj.onmousedown = function(event){
		obj.setCapture && obj.setCapture();
		event = event || window.event;
		var ol = event.clientX - obj.offsetLeft; 
		var ot = event.clientY - obj.offsetTop; };
	document.onmousemove = function(event){
		event = event || window.event;
		var left = event.clientX - ol;
		var top = event.clientY - ot;
		obj.style.left = left+"px";
		obj.style.top = top+"px";
};
document.onmouseup = function(){
 	document.onmousemove = null;
 	document.onmouseup = null;
 	obj.releaseCapture && obj.releaseCapture ();
 };
 	return false;
 };

7、滚轮事件
onmousewheel鼠标滚轮滚动的事件,会在滚轮滚动时触发,火狐不支持。
在火狐中需要使用DOMMouseScroll来绑定滚轮事件
注意该事件需要通过addEventListener()函数来绑定。

  • event.wheelDelta可以获取鼠标滚轮滚动的方向。不看大小,只看正负。
    向上滚 正数,向下滚 负数。
    但在火狐中不支持。
    火狐中使用event.detail来获取滚动的方向。
    向上滚 负数,向下滚 正数。

  • 判断鼠标滚轮滚动的方向

if(event.wheelDelta>0 || event.detail<0){
	box1.style.height = box1.clientHeight - 10 +"px";
}else{
	box1.style.height = box1.clientHeight + 10 +"px";
  • 当滚动条滚动式,如果有浏览器有滚动条,滚动条会随之滚动,这是浏览器的默认行为,如果不希望发生,则可以取消默认行为。

  • 使用addEventListener()方法绑定响应函数,取消默认行为时不能使用return false。
    需要使用event来取消默认行为:event.preventDefault();
    但是IE8不支持event.preventDefault();,使用时会直接报错。
    8、键盘事件
    键盘事件一般都会绑定给一些可以获取到焦点的对象或者是document。

  • onkeydown
    按键被按下
    对于onkeydown来说如果一直按着某个按键不松手,则事件会一直触发。
    当连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常快。这种设计是为了防止误操作的发生。

  • onkeyup
    按键被松开

  • keyCode可以获取按键的编码。
    通过它可以判断哪个按键被按下。
    除了keyCode之外,事件对象中还提供了几个属性:
    altKey;ctrlKey;shiftKey;
    这三个用来判断alt,ctrl,shift是否被按下。若被按下返回true,反之false。

  • 使文本框中不能输入数字(数字48-57)
    在文本框中输入内容,属于onkeydown的默认行为
    如果在onkeydown中取消了默认行为,则输入的内容不会出现在文本中。
    9、BOM:浏览器对象模型
    BOM可以使我们通过JS来操作浏览器
    在BOM中为我们提供了一组对象,用来完成对浏览器的操作。
    BOM对象:

  • Window
    代表的是整个浏览器窗口,同时window也是网页中的全局对象。

  • Navigator
    代表的当时浏览器的信息,通过该对象可以来识别不同的浏览器。

  • Location
    代表当前浏览器的地址栏信息,通过Location可以获取地址栏信息,或者操作浏览器跳转页面

  • History
    代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录
    由于隐私原因,该对象不能获取到具体的历史记录,只能操作浏览器向前或向后翻页,且操作值在当次访问时有效。

  • Screen
    代表用户的屏幕信息,通过该对象可以获取到用户的显示器的相关的信息。
    这些BOM对象在浏览器中都是作为window对象的属性保存的,可以通过window对象来使用,也可以直接使用。
    10、 Navigator
    代表的当时浏览器的信息,通过该对象可以来识别不同的浏览器。
    现在 Navigator对象中的大部分属性已经不能帮助我们识别浏览器了。
    一般我们只会使用userAgent来判断浏览器的信息。
    userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,不同的浏览器会有不同的userAgent。
    如果通过userAgent不能判断,还可以通过一些浏览器中特有的对象,来判断浏览器的信息,比如:ActiveObject
    在这里插入图片描述
    11、 History:对象可以用来操作浏览器向前或向后翻页。
    length:
    属性,可以获取到当成访问的链接数量alert(history.length);
    back():
    可以用来回退到上一个页面,作用和浏览器的回退按钮一样。history.back();
    forward():
    可以跳转下一个页面,作用和浏览器的前进按钮一样。history.forward();
    go():
    可以用来跳转到指定页面。
    他需要一个整数作为参数:
    1:表示向前跳转一个页面,相当于forward()
    2:表示向前跳转两个页面
    -1:表示向后跳转一个页面
    -2:表示向后跳转两个页面
    12、Location:该对象中封装了浏览器的地址栏信息。
    如果直接打印location,则可以获取到地址栏的信息(当前页面的完整路径)。
    assign():
    用来跳转到其他的页面,作用和直接修改location一样。
    reload():
    用于重新加载当前页面,作用和刷新按钮一样
    如果在方法中传递一个true,作为参数,则会强制清空缓存刷新页面。
    replace():
    可以使用一个新的页面替换当前页面,调用完毕也会跳转页面。
    不会生成历史记录,不能使用回退按钮回退。
    13、定时调用
    setInterval()
    定时调用。可以将一个函数,每隔一段时间执行一次。
    参数:
    1、回调函数,该函数会每隔一段时间被调用一次。
    2、每次调用间隔的事件,单位是毫秒。

var num=1;
var timer = setInterval(function){
	count.innerHTML = num++;
},1000);

返回值:
返回一个Number类型的数据
这个数字用来作为定时器的唯一标识。
图片添加定时器的循环:index %= imgArr.length;
clearInterval()可以用来关闭一个定时器。
方法中需要一个定时器的标识作为参数,这样将关闭标识对应的定时器。
clearInterval(timer);
clearInterval()可以接收任意参数,
如果参数是一个有效的定时器的标识,则停止对应的定时器
如果参数不是一个有效的标识,则什么也不做。

在开启定时器之前,需要将上一个定时器关闭。
14、延时调用
延时调用一个函数不马上执行,而是隔一段时间后再执行,而且只会执行一次。
延时调用和定时调用的区别:定时调用会执行多次,延时调用只会执行一次。
延时调用和定时调用实际上是可以相互替代的,在开发中根据自己的需要选择。
setTimeout()
clearTimeout()关闭一个延时调用
15、类的操作。
通过style属性来修改元素的样式,每修改一个样式,浏览器就需要重新渲染一次页面。不方便。
我们可以通过修改元素的class属性来间接的修改样式。
这样可以使表现和行为进一步的分离。box.className="b2";

  • 定义一个函数,用来向一个元素中添加指定的class属性值
参数:
obj  要添加class属性的元素
cn  要添加的class值
function addClass(obj,cn){
	obj.className += " "+cn;
}
  • 判断一个元素中是否含有指定的class属性值。如果有返回ture,反之false
function hasClass(obj,cn){
//判断obj中有没有cn  class
//创建正则表达式
	var reg = new RegExp("\\b"+cn+"\\b");
	alert(reg);
	return reg.text(obj.className);
}
  • 删除一个元素中指定的class属性
function removeClass(obj,cn){
	var reg = new RegExp("\\b"+cn+"\\b");
	obj.className = obj.className.replace(reg,"");
}
  • toggleClass可以用来切换一个类
    如果元素中具有该类,则删除;不具有,则添加。
function toggleClass(obj,cn){
	//判断obj中是否含有cn
	if(hasClass(obj,cn)){
		removeClass(obj,cn);
	}else{
			addClass(obj,cn);
	}
}

16、JSON
在这里插入图片描述
JSON中允许的值:
字符串;数值;布尔值;null;对象;数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值