Как вызвать функцию после ЗАВЕРШЕНИЯ изменения размера окон браузера?
Я пытаюсь так сделать, но возникают проблемы. Я использую функцию события JQuery Resize:
$(window).resize(function() {
... // how to call only once the browser has FINISHED resizing?
});
Однако эта функция вызывается постоянно, если пользователь вручную изменяет размер окна браузера. Это означает, что он может вызывать эту функцию десятки раз за короткий промежуток времени.
Как я могу вызвать функцию изменения размера только один раз (после завершения изменения размера окна браузера)?
ОБНОВИТЬ
Также без использования глобальной переменной.
javascript
jquery
html
nickb
источник
источник
Ответы:
Вот пример с использованием инструкций jh
Вы можете сохранить ссылочный идентификатор для любого setInterval или setTimeout. Как это:
источник
Debounce .
Обратите внимание: вы можете использовать этот метод для всего, что хотите отменить (ключевые события и т. Д.).
Настройте параметр тайм-аута для получения оптимального желаемого эффекта.
источник
func
с внутреннимthis
указателем, указывающим наscope
, и сArray.prototype.slice.call(args)
(который генерирует стандартный массив изargs
) в качестве аргументовВы можете использовать
setTimeout()
иclearTimeout()
вместе сjQuery.data
:Обновить
Я написал расширение для улучшения обработчика событий по умолчанию
on
(&bind
) jQuery. Он прикрепляет функцию обработчика событий для одного или нескольких событий к выбранным элементам, если событие не было инициировано в течение заданного интервала. Это полезно, если вы хотите запустить обратный вызов только после задержки, например, при изменении размера или в другом месте. https://github.com/yckart/jquery.unevent.jsИспользуйте его, как любой другой обработчик
on
илиbind
-event, за исключением того, что вы можете передать дополнительный параметр в качестве последнего:http://jsfiddle.net/ARTsinn/EqqHx/
источник
источник
Чтобы добавить к вышесказанному, часто возникают нежелательные события изменения размера из-за того, что полосы прокрутки появляются и исчезают, вот код, чтобы избежать этого:
см. jsfiddle
источник
В Underscore.js есть несколько отличных методов для решения этой задачи:
throttle
иdebounce
. Даже если вы не используете Underscore, взгляните на источник этих функций. Вот пример:источник
Это мой подход:
Resize-event-listener улавливает все входящие вызовы изменения размера, создает функцию тайм-аута для каждого и сохраняет идентификатор тайм-аута вместе с номером итерации, добавленным
'id-'
(для использования в качестве ключа массива) вtos
-array.Каждый раз, когда срабатывает тайм-аут, он вызывает
fn
-функцию, которая проверяет, был ли это последний тайм-аут вtos
массиве (функция fn удаляет каждый выполненный тайм-аут). если true (=if(len-1 == 0)
), изменение размера завершено.источник
jQuery предоставляет
off
метод для удаления обработчика событийисточник