Почему загружается содержимое функции, а не функция при ее вызове? - PullRequest
2 голосов
/ 19 мая 2011

У меня проблема с вызываемой функцией (с использованием 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 (), они выполняют код.Однако при вызове функции, как показано в этом коде, она не работает.Я рассмотрел область (по крайней мере, насколько мне известно) безрезультатно.

Любая помощь очень ценится, спасибо!

Ответы [ 5 ]

4 голосов
/ 19 мая 2011

Вы теряете ожидаемое this значение, поэтому submitStart, вероятно, вызывается, но не работает должным образом.

Сделайте это:

function validateRegister(){

    submitStart.call( this );

}

ЗдесьВы вызываете метод submitStart с помощью метода .call(), который доступен для экземпляров функций.

Метод .call() позволяет вручную установить значение this в функции, которую вы используете.Вызов.

Так как вы назначили validateRegister в качестве обработчика, jQuery гарантирует, что значение this является вашим элементом.Но поскольку validateRegister вызывает другую функцию, он несет ответственность за обеспечение того, чтобы функция имела правильное значение this.


Просто имейте в виду, что при вызове любой функции, подобной этой:

someFunction();

... значение this в этой функции будет window, если вы вручную не установите его на другое значение.

0 голосов
/ 19 мая 2011

Я думаю, что у вас может быть проблема с this не тем, что вы думаете.

Попробуйте:

submitStart.call(this)

0 голосов
/ 19 мая 2011

this больше не будет ссылаться на выбранный элемент, а вместо этого будет представлять window. Вы можете изменить submitStart, чтобы он принимал параметр и передавал ему this.

0 голосов
/ 19 мая 2011

Проблема здесь 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 в submitStart, используя метод .apply() функции submitStart.

0 голосов
/ 19 мая 2011

var $this = $(this); возвращает окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...