我遇到了一个我正在调用的函数的问题(使用jQuery)。 我的问题是当我尝试在另一个函数中调用一个函数时,第一个函数没有被调用。但是,当我将失败函数的内容放入调用失败函数的函数时,代码执行正常。我会告诉你我在说什么:
$('form.register .submit').click(validateRegister);
function submitStart() {
var $this = $(this);
$this.parent().addClass('processing');
var $processing = $('#processing');
$processing.show();
var $endNote = $this.parent().find('#endNote')
$endNote.slideDown();
}
function validateRegister(){
submitStart();
}
请参阅,当submitStart()的内容放入validateRegister()时,它们会执行代码。但是,当调用此代码中显示的函数时,它无法工作。我认为范围(至少据我所知)无济于事。
非常感谢任何帮助,谢谢!
答案 0 :(得分:4)
您的预期this
值已失去,因此submitStart
可能会被调用,但无效。
这样做:
function validateRegister(){
submitStart.call( this );
}
您可以通过submitStart
方法调用.call()
方法,该方法可在函数实例上使用。
.call()
方法可让您在正在调用的函数中手动设置this
的值。
因为你已经将validateRegister
指定为处理程序,所以jQuery确保this
的值是你的元素。但由于validateRegister
正在调用另一个函数,因此它负责确保函数具有正确的this
值。
请记住,当你调用这样的任何函数时:
someFunction();
...该函数中this
的值将为window
,除非您手动将其设置为其他值。
答案 1 :(得分:0)
var $this = $(this);
正在返回窗口。
答案 2 :(得分:0)
这里的问题是this
。当您使用validateRegister
作为事件处理程序时,jQuery会自动确保this
引用调度该事件的DOM元素。但是当你调用单独的函数时,范围没有正确设置,所以this
可能引用window
对象(这是在全局范围内引用this
时的默认值)。要修复它,最简单的方法是将元素作为参数传递:
function submitStart(element) {
var $this = $(element);
$this.parent().addClass('processing');
var $processing = $('#processing');
$processing.show();
var $endNote = $this.parent().find('#endNote')
$endNote.slideDown();
}
function validateRegister(){
// "this" is the DOM element
submitStart(this);
}
正如@Andrew所说,您还可以使用this
函数的the .apply()
method在submitStart
中设置submitStart
的值。
答案 3 :(得分:0)
this
将不再引用点击的元素,而是代表window
。您可以更改submitStart
,以便接受参数并将this
传递给它。
答案 4 :(得分:0)
我认为您可能会遇到问题this
不符合您的想法。
试试这个:
submitStart.call(this)