Javascript 如何将其传递给另一个函数并获取$(this)
我在Javascript 如何将其传递给另一个函数并获取$(this),javascript,jquery,Javascript,Jquery,我在每个循环(DOM对象)中传递这个,但在该函数中,有一部分代码使用$(this)(jQuery对象)。我想知道如何从DOM对象获取jQuery对象。我认为使用$(obj)会起作用,但不会 我用一个例子来解释这一点 我想将以下函数的某些部分提取到另一个方法: addWidgetControls : function () { //... $(settings.widgetSelector, $(settings.columns)).each(fun
每个循环(DOM对象)中传递这个,但在该函数中,有一部分代码使用$(this)
(jQuery对象)。我想知道如何从DOM对象获取jQuery对象。我认为使用$(obj)
会起作用,但不会
我用一个例子来解释这一点
我想将以下函数的某些部分提取到另一个方法:
addWidgetControls : function () {
//...
$(settings.widgetSelector, $(settings.columns)).each(function () {
var thisWidgetSettings = iNettuts.getWidgetSettings(this.id);
if (thisWidgetSettings.removable) {
$('<a href="#" class="remove">CLOSE</a>').mousedown(function (e) {
e.stopPropagation();
}).click(function () {
$(this).parents(settings.widgetSelector).animate({
opacity: 0
},function () {
$(this).wrap('<div/>').parent().slideUp(function () {
$(this).remove();
});
});
return false;
}).appendTo($(settings.handleSelector, this));
}
});
},
这意味着$(This)
与$(widg)
不同,因为This
与widg
PS:我从中得到了这个代码,如果我理解你的意思,我认为你应该像你做的那样保持widg
变量,并且保持$(this)
而不是$(widg)
。您将在循环中调用该函数,因为每个
,这个
每次都会更改。但是,如果您每次使用widg
,这个变量将指向同一个this
函数内部,您调用的函数应该是您不想要的。如果我理解您的意思,我认为您应该保持widg
变量,保持$(this)
而不是$(widg)
。您将在循环中调用该函数,因为每个
,这个
每次都会更改。但是,如果每次使用widg
,此变量将指向调用函数的函数内部的相同此
,这应该是您不想要的。我认为这是因为:
widg.wrap('<div/>').parent().slideUp(function () {
widg.remove();
});
widg.wrap(“”).parent().slideUp(函数(){
widg.remove();
});
您忘记用$()包装widg:
$(widg).wrap(“”).parent().slideUp(函数(){
$(widg.remove();
});
我认为这是因为:
widg.wrap('<div/>').parent().slideUp(function () {
widg.remove();
});
widg.wrap(“”).parent().slideUp(函数(){
widg.remove();
});
您忘记用$()包装widg:
$(widg).wrap(“”).parent().slideUp(函数(){
$(widg.remove();
});
也许您想使用该方法
addWidgetControls:函数(){
//...
$(settings.widgetSelector,$(settings.columns))。每个(函数(){
iNettuts.doWidget.call(this);
});
},
doWidget:function(){
var thisWidgetSettings=iNettuts.getWidgetSettings(this.id);
如果(thisWidgetSettings.removable){
$('').mousedown(函数(e){
e、 停止传播();
})。单击(函数(){
$(此).parents(settings.widgetSelector).animate({
不透明度:0
},函数(){
$(this).wrap(“”).parent().slideUp(函数(){
$(this.remove();
});
});
返回false;
}).appendTo($(settings.handleSelector,this));
}
}
也许您想使用该方法
addWidgetControls:函数(){
//...
$(settings.widgetSelector,$(settings.columns))。每个(函数(){
iNettuts.doWidget.call(this);
});
},
doWidget:function(){
var thisWidgetSettings=iNettuts.getWidgetSettings(this.id);
如果(thisWidgetSettings.removable){
$('').mousedown(函数(e){
e、 停止传播();
})。单击(函数(){
$(此).parents(settings.widgetSelector).animate({
不透明度:0
},函数(){
$(this).wrap(“”).parent().slideUp(函数(){
$(this.remove();
});
});
返回false;
}).appendTo($(settings.handleSelector,this));
}
}
如果要设置函数的上下文(此
分配的可以使用应用
或调用
。以下是一个例子:
var obj = "testing";
var func = function() {
alert(this);
}
func();
func.apply(obj);
现在,在浏览器中运行代码(我使用了firebug)
第一个警报将是窗口对象,因为所有对象的默认上下文都会向下延伸到窗口对象。第二个警报,我们将上下文设置为字符串“testing”,因此警报将这样说
因此,正如fflorent使用的调用
,您也可以使用应用
更新
使用代码时:
$(settings.widgetSelector, $(settings.columns)).each(function () {
iNettuts.doWidget(this);
});
此
引用.each()方法所在的对象。您希望它以这种方式工作吗?如果您希望设置函数的上下文(此
赋值),可以使用apply
或call
。以下是一个例子:
var obj = "testing";
var func = function() {
alert(this);
}
func();
func.apply(obj);
现在,在浏览器中运行代码(我使用了firebug)
第一个警报将是窗口对象,因为所有对象的默认上下文都会向下延伸到窗口对象。第二个警报,我们将上下文设置为字符串“testing”,因此警报将这样说
因此,正如fflorent使用的调用
,您也可以使用应用
更新
使用代码时:
$(settings.widgetSelector, $(settings.columns)).each(function () {
iNettuts.doWidget(this);
});
此
引用.each()方法所在的对象。你想让它这样工作吗?谢谢你的回答。问题解决了,真的很有趣,也很容易找到!我们都知道,this
指针有时是不同的,在这种情况下,只有3个this
实例应该被widg
替换@kamaci的回答以及其他一些回答暗示我要解决这个问题。这是最后的代码:
addWidgetControls: function () {
var iNettuts = this,
$ = this.jQuery,
settings = this.settings,
func = this.doWidget;
$(settings.widgetSelector, $(settings.columns)).each(function () {
func(this);
});
},
doWidget: function (wid) {
var $ = iNettuts.jQuery,
settings = iNettuts.settings;
var thisWidgetSettings = iNettuts.getWidgetSettings(wid.id);
if (thisWidgetSettings.removable) {
$('<a href="#" class="remove"></a>').mousedown(function (e) {
e.stopPropagation();
}).click(function () {
$(this).parents(settings.widgetSelector).animate({
opacity: 0
}, function () {
$(this).wrap('<div/>').parent().slideUp(function () {
$(this).remove();
});
});
return false;
}).appendTo($(settings.handleSelector, wid));
}
if (thisWidgetSettings.collapsible) {
$('<a href="#" class="collapse"></a>').mousedown(function (e) {
e.stopPropagation();
}).toggle(function () {
$(this).css({ backgroundPosition: '-38px 0' })
.parents(settings.widgetSelector)
.find(settings.contentSelector).hide();
return false;
}, function () {
$(this).css({ backgroundPosition: '' })
.parents(settings.widgetSelector)
.find(settings.contentSelector).show();
return false;
}).prependTo($(settings.handleSelector, wid));
}
},
addWidgetControls:函数(){
var iNettuts=此,
$=this.jQuery,
settings=this.settings,
func=this.doWidget;
$(settings.widgetSelector,$(settings.columns))。每个(函数(){
func(本);
});
},
doWidget:函数(wid){
var$=iNettuts.jQuery,
设置=iNettuts.settings;
var thisWidgetSettings=iNettuts.getWid
addWidgetControls: function () {
var iNettuts = this,
$ = this.jQuery,
settings = this.settings,
func = this.doWidget;
$(settings.widgetSelector, $(settings.columns)).each(function () {
func(this);
});
},
doWidget: function (wid) {
var $ = iNettuts.jQuery,
settings = iNettuts.settings;
var thisWidgetSettings = iNettuts.getWidgetSettings(wid.id);
if (thisWidgetSettings.removable) {
$('<a href="#" class="remove"></a>').mousedown(function (e) {
e.stopPropagation();
}).click(function () {
$(this).parents(settings.widgetSelector).animate({
opacity: 0
}, function () {
$(this).wrap('<div/>').parent().slideUp(function () {
$(this).remove();
});
});
return false;
}).appendTo($(settings.handleSelector, wid));
}
if (thisWidgetSettings.collapsible) {
$('<a href="#" class="collapse"></a>').mousedown(function (e) {
e.stopPropagation();
}).toggle(function () {
$(this).css({ backgroundPosition: '-38px 0' })
.parents(settings.widgetSelector)
.find(settings.contentSelector).hide();
return false;
}, function () {
$(this).css({ backgroundPosition: '' })
.parents(settings.widgetSelector)
.find(settings.contentSelector).show();
return false;
}).prependTo($(settings.handleSelector, wid));
}
},