发现一个很奇怪的jQuery问题,郁闷了很久了。

Ree12121212 2010-04-28 12:50:08
发现一个很奇怪的jQuery问题,请教大家了:


var $a = $("<div>");
var $b = $("<span>").html("bbb");
$b.extend({
i : 123
});
$a.extend({
$b : $b
});

$b.appendTo($a);
$a.appendTo(document.body);
$a.$b.click(function(){
alert($(this).i);
});



虽然打印不出123,总是打印出来是undefined,为什么这样有谁知道原因吗,另外能否提供解决办法,谢谢。

顺便说一下alert($(this).html());可以打印出"bbb"。
...全文
195 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ree12121212 2010-04-28
  • 打赏
  • 举报
回复
彻底懂了,谢谢hookee了。
hookee 2010-04-28
  • 打赏
  • 举报
回复
alert($b.i); 这样做是利用全局变量,而用闭包方式是取决于定义处理函数当时传入的值,还是有scope上的区别的.
Ree12121212 2010-04-28
  • 打赏
  • 举报
回复

var $a = [];
var $b;
for(var i = 0; i < 10; i++){
$a[i] = $("<div>");
$b = $("<span>").html("bbb");
$b.extend({
i : i
});
$a[i].extend({
$b : $b
});
$b.appendTo($a[i]);
$a[i].appendTo(document.body);

// $a[i].$b.click((function(obj){
// return function(){alert(obj.i)};
// })($b));

$a[i].$b.click(function(){
alert($b.i);
});
}



但是这样输出就不对了,点任何一点都是9了。
Mr-Jee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ree12121212 的回复:]

JScript code

$a.$b.click(function() {
alert($b.i);
});



JScript code

$a[i].$b.click((function(obj){
return function(){alert(obj.i)};
})($b));


是不是一回事呀?
[/Quote]

明显这个obj就是$b啊
他利用了闭包把一个函数包在了一个自执行函数中
而这个自执行函数的参数正是$b
Ree12121212 2010-04-28
  • 打赏
  • 举报
回复

$a.$b.click(function() {
alert($b.i);
});



$a[i].$b.click((function(obj){
return function(){alert(obj.i)};
})($b));

是不是一回事呀?
hookee 2010-04-28
  • 打赏
  • 举报
回复
都可以的,因为传入时$a[i].$b和$b是指向一个对象,
只要定义事件处理函数的时候对象是存在的,那么调用时即便传入的对象不存在也没有关系的。
Ree12121212 2010-04-28
  • 打赏
  • 举报
回复
先谢谢楼上各位,特别是hookee,呵呵。
如果$a和$b都是随意在更新可变的呢,这样也能保证每个$a都能找到对应的$b吗?


var $a = [];
var $b;
for(var i = 0; i < 10; i++){
$a[i] = $("<div>");
$b = $("<span>").html("bbb");
$b.extend({
i : i
});
$a[i].extend({
$b : $b
});
$b.appendTo($a[i]);
$a[i].appendTo(document.body);

$a[i].$b.click((function(obj){
return function(){alert(obj.i)};
})($b));
}



另外还想问一下各位
$a[i].$b.click((function(obj){
return function(){alert(obj.i)};
})($b));

$a[i].$b.click((function(obj){
return function(){alert(obj.i)};
})($a[i].$b));
会不会有区别呀?
hoojo 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hookee 的回复:]
HTML code

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
window.onload=function(){
var $a = $("<div>");
var $b = $("<span>").html("bbb");
$b.extend({
i : 123
});
$a.extend({
$b : $b
});
$b.appendTo($a);
$a.appendTo(document.body);
$a.$b.click((function(obj){
return function(){alert(obj.i)};
})($b));
}
[/Quote]
正解
Mr-Jee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lieri111 的回复:]

JScript code

$a.$b.click((function(obj){
return function(){alert(obj.i)};
})($b));


这样就可以了,首先obj要传入,其次要有($b)才可以运行
[/Quote]

那和$a.$b.click(function() {
alert($b.i);
});有什么区别呢。呵呵,这是偷换概念
passself 2010-04-28
  • 打赏
  • 举报
回复

$a.$b.click((function(obj){
return function(){alert(obj.i)};
})($b));

这样就可以了,首先obj要传入,其次要有($b)才可以运行
liuyi1985_2008 2010-04-28
  • 打赏
  • 举报
回复
支持楼上
hookee 2010-04-28
  • 打赏
  • 举报
回复

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
window.onload=function(){
var $a = $("<div>");
var $b = $("<span>").html("bbb");
$b.extend({
i : 123
});
$a.extend({
$b : $b
});
$b.appendTo($a);
$a.appendTo(document.body);
$a.$b.click((function(obj){
return function(){alert(obj.i)};
})($b));
}
</script>

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧