jquery之$.proxy()

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>$.proxy()的使用</title>
	<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
	<input type="button" value="测试" id="myBtn" name="我的按钮"/>
	<script type="text/javascript">
	// 定义一个对象,含有属性name和一个sayHello的方法
	var hbk = {
		name:"huangbaokang",
		sayHello:function(){
			alert("hello "+this.name);
		}
	}

	//$("#myBtn").click(hbk.sayHello);// hello 我的按钮
	// 如果想输出hbk对象的name
	//$("#myBtn").click($.proxy(hbk.sayHello,hbk)); // hello huangbaokang
	// 另外一种用法
	$("#myBtn").click($.proxy(hbk,"sayHello")); // hello huangbaokang

	</script>
</body>
</html>

$.proxy()方法主要是修改this指针的指向。
他有两种使用方法。
$.proxy(a,b)
第一种:a是一个function函数,b是这个函数的对象所有者.
第二种:a是一个对象,b是一个字符串,是a的属性名.
从源码中也可以看到。
在这里插入图片描述
案列1:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>$.proxy()的使用</title>
	<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
	<div id="panel" style="display: none;">
		<button>关闭</button>
	</div>
	<script type="text/javascript">
		/*$("#panel").fadeIn(function(){
			$("#panel button").click(function(){
				$(this).fadeOut();   // 这种方式panel并没有设置display:none
			});
		});*/

		$("#panel").fadeIn(function () {
			$("#panel button").click($.proxy(function () {
				$(this).fadeOut();
			}, this));
		});
	</script>
</body>
</html>

案例2:

//正常的this使用
$('#Haorooms').click(function() {
 
  // 这个this是我们所期望的,当前元素的this.
 
  $(this).addClass('aNewClass');
 
});
//并非所期望的this
$('#Haorooms').click(function() {
 
  setTimeout(function() {
 
     // 这个this指向的是settimeout函数内部,而非之前的html元素
 
    $(this).addClass('aNewClass');
 
  }, 1000);
 
});

这时候怎么办呢,通常的一种做法是这样的:

$('#Haorooms').click(function() {
  var that = this;  //设置一个变量,指向这个需要的this
 
  setTimeout(function() {
 
     // 这个this指向的是settimeout函数内部,而非之前的html元素
 
    $(that).addClass('aNewClass');
 
  }, 1000);
 
});

也可以使用jquery为我们提供的proxy方法

$('#Haorooms').click(function() {
 
  setTimeout($.proxy(function() {
 
    $(this).addClass('aNewClass'); 
 
  }, this), 1000);
 
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章