Как я могу вызвать функцию несколько раз? - PullRequest
2 голосов
/ 28 февраля 2012

Моя проблема заключается в следующем: я разрабатываю удобный для мобильных устройств веб-сайт с двумя таблицами стилей, один для визуализации, ориентированной на ПК, и другой для мобильной визуализации. Наряду с 2 CSS, мне нужна функция для изменения некоторых атрибутов href в меню при переключении из одного режима визуализации в другой.

Я не буду вдаваться в подробности, потому что это будет очень долго и, вероятно, скучно, в любом случае мне нужно, чтобы функция называлась и на $(document).ready И на $(window).resize, то есть каждый раз, когда размер окна изменяется.

Итак, я объявил функцию и назвал ее goToAnchor, чтобы можно было вызывать ее более одного раза:

$(document).ready(function() {
   function goToAnchor() {  ... modify some href attr ... }
   goToAnchor();
});

Это прекрасно, но, как я сказал, мне также нужно, чтобы функция выполнялась при каждом изменении размера окна, поэтому я подумал, что код может выглядеть следующим образом:

$(document).ready(function() {
   function goToAnchor() {  ... modify some href attr ... }
   goToAnchor();
   $(window).resize(goToAnchor());
});

Проблема проста, функция не работает на resize. Я проверил документацию jQuery и заметил, что каждый пример, связанный с привязкой функции к событию, написан так:

$(window).resize(function() { ...do stuff...} );

Я бы не стал прибегать к использованию анонимной функции, поскольку я уже писал эту функцию ранее. То, что я хочу сделать, предельно просто: вызывать функцию несколько раз, не прибегая к анонимным функциям, чтобы «дублировать» мой код (в конце концов, именно так функции должны работать, верно?).

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Вы хотите заменить: $(window).resize(goToAnchor()); на $(window).resize(goToAnchor);.

Ваш код передает ответ функции goToAnchor, и вы хотите передать ссылку на функцию, что мы делаем, опуская скобки.

Но вы также можете сделать это:

$(function() {
   $(window).bind('resize', function () { /*resize code*/ }).trigger('resize');
});

Это эффективно запускает код, когда событие resize запускается как для объекта window, так и для document.ready (.trigger('resize') вызывает событие resize для document.ready).

3 голосов
/ 28 февраля 2012

Изменить $(window).resize(goToAnchor()); на $(window).resize(goToAnchor);

0 голосов
/ 28 февраля 2012

Хороший способ увидеть, что происходит, - изменить объявление функции на:

var goToAnchor = function() { ... modify some href attr ... }

В каком случае

$(window).resize(goToAnchor);

и

$(window).resize(function() { ... modify some href attr ... });

явно делают то же самое.

...