[英]jQuery $(this) not working when inside a function
我有一个简单的功能,可以复制一些html,并将其放在另一个div中。 如果我将函数的代码放入click事件中,则可以正常工作,但是当我将其移入函数(要在多个位置使用)时,它将不再起作用。 你知道为什么吗
如果我console.log($(this)); 在函数中,它返回window元素。
function addHTMLtoComponent () {
var wrapper = $(this).closest(".wrapper");
var component = $(wrapper).find(".component");
var componentCodeHolder = $(wrapper).find('.target');
$(componentCodeHolder).text(component.html())
//console.log($(this));
}
$(".js_show_html").click(function () {
addHTMLtoComponent();
});
这里的codepen- http: //codepen.io/ashconnolly/pen/ebe7a5a45f2c5bbe58734411b03e180e
我应该以其他方式引用$(this)吗?
关于其他答案,我需要提出最简单的答案:
$(".js_show_html").click(addHTMLtoComponent);
this
在的情况下click()
事件是点击的元素。 在addHTMLtoComponent
函数的上下文中, this
不再是对单击元素的引用。
尝试将单击的对象传递给函数以维护对象引用。
function addHTMLtoComponent ($obj) {
var $wrapper = $obj.closest(".wrapper");
var $component = $wrapper.find(".component");
var $componentCodeHolder = $wrapper.find('.target');
$componentCodeHolder.text($component.html());
}
$(".js_show_html").click(function () {
addHTMLtoComponent($(this));
});
由于您是手动调用该函数,因此它不知道“ this”上下文,因此它会还原为使用window对象。
$(".js_show_html").click(function () {
addHTMLtoComponent();
});
// Change to this
$(".js_show_html").click(function () {
addHTMLtoComponent.call(this);
});
参考: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call
您必须将元素作为参数传递给此函数。 例如:
<div onclick="addHTMLtoComponent ($(this))"></div>
您可以考虑的一件事是,可以将addHTMLtoComponent()
做成jQuery函数本身:
$.fn.addHTMLtoComponent = function() {
return this.each(function() {
var wrapper = $(this).closest(".wrapper");
var component = $(wrapper).find(".component");
var componentCodeHolder = $(wrapper).find('.target');
componentCodeHolder.text(component.html())
});
}
现在,您可以像调用其他任何jQuery方法一样调用它:
$(".js_show_html").click(function () {
$(this).addHTMLtoComponent();
});
jQuery方法中的this
值将是jQuery对象本身,因此您无需使用$()
重新包装它。 按照约定(在有意义的时候),jQuery方法对根对象引用的所有元素进行操作,并且它们返回该对象以进行进一步的链式操作。 这就是外部return this.each()
构造所做的事情。
在.each()
回调内部,您有一种典型的jQuery回调情况, this
是依次设置到外部jQuery对象的每个成员的。
当您单独调用函数时,特殊关键字this
是window
对象(这是您观察到的)。 对于所需的行为,只需在函数中添加参数即可加载适当的上下文:
function addHTMLtoComponent(context) {
var wrapper = $(context).closest(".wrapper");
var component = $(wrapper).find(".component");
var componentCodeHolder = $(wrapper).find('.target');
$(componentCodeHolder).text(component.html())
//console.log($(context));
}
$(".js_show_html").click(function() {
addHTMLtoComponent(this);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.