我有一些链接,我想基本上做一个类交换。当我将它设置为这样时它会一直运行:
$("#work").click(function() {
$(".nav_middle_text").removeClass("selected");
$(".nav_middle_text").addClass("notselected");
$(this).removeClass("notselected");
$(this).addClass("selected");
a1=1;
$("#top_section").animate({
height:30
},450);
$("#bottom_section").animate({
height:$("#grid").outerHeight(true)
}, 450);
$("#about_container").animate({
marginTop:$("#about_container").outerHeight(true) *-1
}, 450);
});
但是当我尝试以这种方式设置它时,它运行前两个添加和删除具有特定类的类,但使用'this'的后两个不起作用。这样运行它是否有理由阻止“这个”工作?
function nav_click() {
$(".nav_middle_text").removeClass("selected");
$(".nav_middle_text").addClass("notselected");
$(this).removeClass("notselected");
$(this).addClass("selected");
}
$("#work").click(function() {
nav_click();
a1=1;
$("#top_section").animate({
height:30
},450);
$("#bottom_section").animate({
height:$("#grid").outerHeight(true)
}, 450);
$("#about_container").animate({
marginTop:$("#about_container").outerHeight(true) *-1
}, 450);
});
提前感谢您提供任何帮助
答案 0 :(得分:2)
当您调用函数nav_click()
时,this
不再是点击处理程序中的内容。如果要使用nav_click()
函数,则必须将this
的值传递给该函数。你可以通过在函数中正确设置this
来做到这一点:
nav_click.call(this);
或者,您可以将其作为普通参数传递并更改nav_click()以使用该参数
nav_click(this);
function nav_click(item) {
$(".nav_middle_text").removeClass("selected");
$(".nav_middle_text").addClass("notselected");
$(item).removeClass("notselected");
$(item).addClass("selected");
}
仅供参考,函数内this
的值取决于函数的调用方式。如果仅使用nav_click()
这样的普通函数调用,则this
将重置为window
对象(正常JS模式)或undefined
(JS严格模式)。< / p>
要明确将this
设置为函数内的特定值,请使用.apply()
或.call()
。有关这些方法的说明,请参阅MDN页面here和here。
答案 1 :(得分:0)
在匿名事件处理函数的上下文中,this
引用事件发生的元素。出于这个原因,this
没有引用您认为在第二种情况下的含义。
您可以将元素传递给函数,但是:
function nav_click(element) {
$(".nav_middle_text").removeClass("selected");
$(".nav_middle_text").addClass("notselected");
$(element).removeClass("notselected");
$(element).addClass("selected");
}
$("#work").click(function() {
nav_click(this);
// etc
});
答案 2 :(得分:0)
这种情况正在发生,因为你没有在回调函数中传递任何你需要传递元素的东西,这并没有引用#work所以你无法改变类这样做...
function nav_click(element) {
$(".nav_middle_text").removeClass("selected");
$(".nav_middle_text").addClass("notselected");
$(element).removeClass("notselected");
$(element).addClass("selected");
}
$("#work").click(function() {
nav_click(this);
a1=1;
$("#top_section").animate({
height:30
},450);
$("#bottom_section").animate({
height:$("#grid").outerHeight(true)
}, 450);
$("#about_container").animate({
marginTop:$("#about_container").outerHeight(true) *-1
}, 450);
});