2013-02-19 2 views
0

У меня есть небольшой вопрос относительно определения области видимости, когда я использую пользовательскую функцию обратного вызова, переданную в jQuery.animate(). Рассмотрим приведенный ниже код.Рекомендации по представлению результатов Javascript при использовании пользовательского обратного вызова

;var WebApi = (function projectInit (WebApi, $, Modernizr, window, document, undefined) { 

    $(element).on('click.skiptodocumentpart', function skipToDocumentPart (e) { 
     WebApi.scrollTo(
      $(this.getAttribute('href')).offset().top, 
      1000, 
       $pageNav.length ? repositionPageNav($pageNav, $(this)) : null 
     ); 
     return false; 
    }); 

    function repositionPageNav ($pageNav, $elm) { 
     console.log(this); // undefined 
    }; 

    WebApi.scrollTo = function (yPos, iSpeed, callback) { 
     $('html,body').animate({ 
      scrollTop : yPos 
     },{ 
      duration : typeof iSpeed === 'number' ? iSpeed : 1000, 
      complete : typeof callback === 'function' ? callback : null 
    }); 
}; 

return WebApi; 

}(WebApi || {}, jQuery, Modernizr, this, this.document)); 

Когда я войти в контексте функции в repositionPageNav обратного вызова я получить неопределенный, в идеале я бы контекст ссылку на элемент нажал на, так как сам JQuery ussualy сделать. Я мог бы сделать это, изменив обратный вызов на WebApi.scrollTo следующим образом:

WebApi.scrollTo(
     yPos, 
     1000, 
     as$pageNav.length ? (function (scope) { 
       return repositionPageNav.call(scope, $pageNav); 
      }(this)) : null 
     ); 

Создавая Замыкание контекста внутри обратного вызова в настоящее время относится к элементу щелкнул, как я предполагал, но делаю это представление больно? И одна вещь, которую я не могу понять, почему в первом примере контекст не определен? Это потому, что я не вызываю обратный вызов как callback.call (контекст)? Любые предложения/идеи?

Большое спасибо,

Nick.

ответ

1

В this keyword действует скорее как контексте, это не кнопку [переменная] сфера.

Однако проблема в том, что вы мгновенно вызываете функцию repositionPageNav (в обеих версиях) вместо передачи функции обратного вызова. Если вы это сделаете, то будет Ссылка на элемент DOM, на который была вызвана анимация.

+0

А контекст. Я обязательно запомню это. В приведенных выше примерах не передается ли ожидаемый обратный вызов с исполнением до завершения анимации()? – ngr

+0

Как сказано, вы не проходите обратный вызов. Вы вызываете функцию немедленно и передаете результат ('undefined'). – Bergi

+0

Итак, передав его как repositionPageNav ($ pageNav, $ (this)), он вызывает это немедленно? Возможно, лучше будет использовать jQuery.proxy (repositionPageNav, контекст, аргументы). – ngr

Смежные вопросы