Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将其传递给另一个函数并获取$(this)_Javascript_Jquery - Fatal编程技术网

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));
    }
},