Поэтому я сейчас использую что-то вроде:
$(window).resize(function(){resizedw();});
Но это вызывается много раз, пока продолжается процесс изменения размера. Можно ли поймать событие, когда оно заканчивается?
Поэтому я сейчас использую что-то вроде:
$(window).resize(function(){resizedw();});
Но это вызывается много раз, пока продолжается процесс изменения размера. Можно ли поймать событие, когда оно заканчивается?
.one()
так что он выполняется только после того, как все изменения размера сделано, а не снова и снова?Ответы:
Мне повезло со следующей рекомендацией: http://forum.jquery.com/topic/the-resizeend-event
Вот код, так что вам не нужно копаться по ссылке и источнику его сообщения:
Спасибо sime.vidas за код!
источник
new Date(-1E12)
- то есть JSLint предупреждает об использовании00
.rtime: Date; .... if (+new Date() - +rtime < delta)
и в машинописной функции resizeend должна быть функция стрелки как этоresizeend=()=>
. Потому что в функции resizeendthis
ссылка на объект окна.Вы можете использовать
setTimeout()
иclearTimeout()
Пример кода на jsfiddle .
источник
$(document)
, обнаружение мыши будет ограничено пользователями, работающими под управлением Microsoft Windows и уязвимыми версиями его Internet Explorer: iedataleak.spider.io/demoЭто код, который я пишу в соответствии с ответом @Mark Coleman:
Спасибо Марк!
источник
resizeTimer
является глобальной переменной, то есть она определена без измененийwindow
, поэтому она точно такая же, как здесь, только этот пример лучше, так как вам не нужно определять переменную извне. и также имеет смысл добавить эту переменную кwindow
объекту, поскольку это объект, с которым связан прослушиватель событий.Internet Explorer предоставляет событие resizeEnd . Другие браузеры будут вызывать событие изменения размера много раз во время изменения размера.
Здесь есть и другие замечательные ответы, которые показывают, как использовать setTimeout и .throttle ,Методы .debounce от lodash и underscore, поэтому я упомяну плагин jQuery Бена Алмана, который выполняет то, что вам нужно.
Предположим, у вас есть эта функция, которую вы хотите вызвать после изменения размера:
Пример Throttle
В следующем примере
onResize()
будет вызываться только один раз каждые 250 миллисекунд при изменении размера окна.Пример Debounce
В следующем примере
onResize()
будет вызываться только один раз в конце действия изменения размера окна. Это достигает того же результата, который @Mark представляет в своем ответе.источник
Существует элегантное решение с использованием Underscore.js. Итак, если вы используете его в своем проекте, вы можете сделать следующее:
Этого должно быть достаточно :) Но, если вы заинтересованы, чтобы узнать больше об этом, вы можете проверить мой блог -
http://rifatnabi.com/post/detect-end-of-jquery-resize-event-using-underscore -debounce(мертвая ссылка)источник
lodash
Одним из решений является расширение jQuery с помощью функции, например:
resized
Пример использования:
$(window).resized(myHandler, 300);
источник
Вы можете сохранить ссылочный идентификатор для любого setInterval или setTimeout. Как это:
Чтобы сделать это без «глобальной» переменной, вы можете добавить локальную переменную в саму функцию. Пример:
источник
Вы можете использовать
setTimeout()
иclearTimeout()
в сочетании сjQuery.data
:Обновить
Я написал расширение для улучшения стандартного
on
(&bind
) -event-handler jQuery . Он прикрепляет функцию-обработчик события для одного или нескольких событий к выбранным элементам, если событие не было запущено в течение заданного интервала. Это полезно, если вы хотите запустить обратный вызов только после задержки, например, события изменения размера или в противном случае. https://github.com/yckart/jquery.unevent.jsИспользуйте его как любой другой обработчик
on
илиbind
-event, за исключением того, что вы можете передать дополнительный параметр как последний:http://jsfiddle.net/ARTsinn/EqqHx/
источник
Существует гораздо более простой способ выполнить функцию в конце изменения размера, чем вычислять время разницы между двумя вызовами, просто сделайте это следующим образом:
И эквивалент для Angular2 :
Для углового метода используйте
() => { }
обозначение в,setTimeout
чтобы сохранить область, иначе вы не сможете выполнять какие-либо вызовы функций или использоватьthis
.источник
Это модификация вышеприведенного кода Долана, я добавил функцию, которая проверяет размер окна в начале изменения размера и сравнивает его с размером в конце изменения размера, если размер больше или меньше поля ( например, 1000), затем он перезагружается.
источник
Ответ Марка Колемана, безусловно, намного лучше, чем выбранный ответ, но если вы хотите избежать глобальной переменной для идентификатора тайм-аута (
doit
переменная в ответе Марка), вы можете сделать одно из следующих действий:(1) Используйте немедленно вызванное выражение функции (IIFE) для создания замыкания.
(2) Используйте свойство функции обработчика событий.
источник
я написал небольшую упаковочную функцию самостоятельно ...
Вот использование:
источник
источник
Ну, насколько оконный менеджер обеспокоен, каждое событие изменения размера является его собственное сообщение, с отчетливым началом и концом, так что технически, каждый раз при изменении размера окна, то это конец.
Сказав это, может быть, вы хотите установить задержку вашего продолжения? Вот пример.
источник
Вот ОЧЕНЬ простой скрипт для запуска событий resizestart и resizeend на объекте окна.
Нет необходимости возиться с датами и временем.
d
Переменное представляет число миллисекунд между событиями изменения размера перед запуском конечного изменения размера события, вы можете играть с этим , чтобы изменить , насколько чувствительными к концу события.Для прослушивания этих событий все, что вам нужно сделать, это:
resizestart:
$(window).on('resizestart', function(event){console.log('Resize Start!');});
resizeend:
$(window).on('resizeend', function(event){console.log('Resize End!');});
источник
Это то, что я использую для задержки повторных действий, это может быть вызвано в нескольких местах в вашем коде:
Использование:
источник
так как выбранный ответ на самом деле не работает .. и если вы не используете jquery, вот простая функция throttle с примером того, как использовать его с изменением размера окна
источник
это сработало для меня, так как я не хотел использовать какие-либо плагины.
При изменении размера окна вызовите «setFn», который получит ширину окна и сохраните как «originalWindowSize». Затем вызовите «checkFn», который через 500 мс (или ваше предпочтение) получает текущий размер окна и сравнивает оригинал с текущим, если они не совпадают, тогда окно все еще изменяется. Не забудьте удалить консольные сообщения в производственном процессе, и (необязательно) может заставить "setFn" выполняться самостоятельно.
источник
Это сработало для того, что я пытался сделать в Chrome. Это не сработает обратный вызов до 200 мс после последнего события изменения размера.
источник
ОБНОВИТЬ!
Лучшая альтернатива, также созданная мной, находится здесь: https://stackoverflow.com/a/23692008/2829600 (поддерживает «удаление функций»)
ОРИГИНАЛЬНАЯ ПОЧТА:
Я написал эту простую функцию для обработки задержки выполнения, полезную внутри jQuery .scroll () и .resize (), поэтому callback_f будет запускаться только один раз для конкретной строки идентификатора.
источник
$(window).resize(function() { delay_exec('test1', 30, function() { ... delayed stuff here ... }); });
? Довольно чистый код в противном случае. Спасибо, что поделился. :)События ResizeStart и ResizeEnd для окна
http://jsfiddle.net/04fLy8t4/
Я реализовал функцию, которая запускает два события в пользовательском элементе DOM:
Код:
источник
источник
Я не знаю, работает ли мой код для других, но он действительно отлично работает для меня. Я понял эту идею, проанализировав код Dolan Antenucci, потому что его версия мне не подходит, и я очень надеюсь, что он кому-нибудь пригодится.
источник
Я написал функцию, которая передает функцию, когда обернута в любое событие изменения размера. Он использует интервал, так что даже изменение размера не всегда создает события тайм-аута. Это позволяет ему выполнять независимо от события изменения размера, кроме записи журнала, которая должна быть удалена в производственной среде.
https://github.com/UniWrighte/resizeOnEnd/blob/master/resizeOnEnd.js
}
источник