jQuery 之 $(this) 出了什么问题?

最近在写jQuery的时候出了这样一个问题?

<html>
<head>
	<title></title>
</head>
<style type="text/css">
	.clicked{
		width: 100px;
		height: 40px;
		border-radius: 3px;
		background-color: #cba;
	}
</style>
<body>
	<a href="#" id="test" >yes</a>
<script type="text/javascript"
	src="jquery-1.10.2.min.js">
</script>
<script type="text/javascript">

	$(function() {
		$('a').click(function(event) {
			$(this).addClass('clicked');
			setTimeout(function(){
				$(this).removeClass('clicked');
			},3000);
		});
	});
</script>
</body>
</html>

发现过了"一天" 这个按钮的效果也没有被移除,这让我十分的诧异.jQuery出了问题?

我毫不犹豫的问了自己这样一个问题,紧接着,我就否决了.为啥呢?因为我觉得我想多了.....

但是这件事要搞明白.

但是问题在下面,为什么下面的那个setTimeout()无法工作呢.

我百思不得其解.

于是乎,我在setTimeout的匿名函数中打印了这样的东西.

cosole.log(this === window);

返回值 true //////? what.

怎么会这样,我是写着玩的...

于是我又仔细探究了一下.

原来

在传统的onevent属性代码中,this 引用接收事件元素 ---但是只在属性中,而不在从属调用的函数中.

这句话是什么意思呢?就是它确实是在我们的那个click中.但是如果在里面调用闭包的函数时,this对象就又重新指回了我们的window对象.

那要怎样解决这个问题呢...很好办啊..

<span style="font-size:18px;"><script type="text/javascript">

	$(function() {
		$('a').click(function(event) {
			$this = $(this);
			$this.addClass('clicked');
			setTimeout(function(){
				console.log(this === window);
				$this.removeClass('clicked');//2
			},3000);
		});
	});
</script></span>

对了.就是将$(this) 保存成一个本地的变量..那么为什么将this 或者$(this)复制到一个本地变量能解决这个问题?

javascript为参数核函数的局部变量创建了一个闭包.

闭包可以归纳为一下的4个内容.

1可以在javascript函数中嵌套另一个函数,嵌套可以为多级.

2函数不仅能读取自己的 参数和局部变量,而且能读写嵌套函数中的变量.

3即使外部函数已经返回之后再调用内部函数同样有效.比如setTimeout

4不管匿名或者命名函数都一样.this是javascript特殊的关键字,所以这些原则都不适用,通过将this的值复制到一个局部变量中,就能利用闭包使该值在任何嵌套函数中使用.

Best Wishes.

jQuery 之 $(this) 出了什么问题?,布布扣,bubuko.com

时间: 2024-07-28 20:23:02

jQuery 之 $(this) 出了什么问题?的相关文章

jquery实现弹出即消失的提示层

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <sc

jQuery.reveal弹出层

jQuery.reveal弹出层使用 最近用到弹出层,还得自定义UI,原本用的artDialog太庞大,不合适了,于是就找到了这个东西,又小又好用,基础的弹出遮罩都有了,想要什么还不是Coder自己说了算. 这个插件是基于Jquery实现的,非常小,插件本身只有3K多一点,用起来也算简单明了. 废话不说了.上Demo 首先是引用部分: Html->head: <head> <meta charset="utf-8" /> <title>Reve

jquery实现弹出可移动层代码

iframe.html页面 <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>弹窗显示</title></head><body><div id="container" style="overflow:hidden;"

jquery 简单弹出层

预定义html代码:没有 所有代码通过js生成和移除. 预定义css /* 基本弹出层样式 */ .my-popup-overlay { width:100%; height:auto; /* width height is defined by javascript */ position: absolute; top:0; left: 0; z-index: 1000; background-color: #000; opacity: 0.2; *filter:alpha(opacity=2

jquery 简单弹出层(转)

预定义html代码:没有 所有代码通过js生成和移除. 预定义css /* 基本弹出层样式 */ .my-popup-overlay { width:100%; height:auto; /* width height is defined by javascript */ position: absolute; top:0; left: 0; z-index: 1000; background-color: #000; opacity: 0.2; *filter:alpha(opacity=2

用jQuery解决弹出层的问题

在BS 项目中 经常需要用到这种弹出层.做这种弹出层一般都会遇到下面几个问题:0,弹出层必须定义在input的下边显示.1,点击input弹出div层.2,点击div层外面任何地方,关闭div层.3,ie6下,div层与下拉框的优先级问题. 下面这个例子就是解决这些问题的,大家可以参考参考,有什么更好的解决方案,请留言. 超级简单版 演示:http://cssrain.cn/demo/popDiv/easyPopDiv.html 实例版 演示:http://cssrain.cn/demo/pop

jQuery渐变弹出层

css: [css]#race{display:block;width:200px;height:50px;line-height:50px;text-align:center;background:#CCC;border:#555 1px solid;} .raceShow{border:solid 1px #ccc;position:absolute;display:none;width:300px;height:100px;padding:5px;font-size:12px;}[/css

jquery制作弹出层带遮罩效果,点击阴影部分层消失

jquery制作弹出层带遮罩效果,点击阴影部分层消失. 整体还是比较简单的. HTML代码很简单 1 <a href="#" class="big-link" data-reveal-id="myModal" data-animation="fade">jquery点我弹出</a> 2 <div id="myModal" class="reveal-modal&quo

jquery ui 弹出层

<!doctype html> <html> <head> <meta charset="utf-8"> <title>jquery ui弹出层使用</title> <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css"> <