diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js index 96fd8b63fc..8a812e8897 100644 --- a/public/src/admin/manage/groups.js +++ b/public/src/admin/manage/groups.js @@ -7,8 +7,6 @@ define('admin/manage/groups', [ ], function (categorySelector, slugify, api) { var Groups = {}; - var intervalId = 0; - Groups.init = function () { var createModal = $('#create-modal'); var createGroupName = $('#create-group-name'); @@ -114,13 +112,7 @@ define('admin/manage/groups', [ }); } - queryEl.on('keyup', function () { - if (intervalId) { - clearTimeout(intervalId); - intervalId = 0; - } - intervalId = setTimeout(doSearch, 200); - }); + queryEl.on('keyup', utils.debounce(doSearch, 200)); } diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index 6cb4ad96f6..0fb7dbf39f 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -6,7 +6,6 @@ define('admin/manage/tags', [ 'admin/modules/selectable', ], function (infinitescroll, selectable) { var Tags = {}; - var timeoutId = 0; Tags.init = function () { selectable.enable('.tag-management', '.tag-row'); @@ -53,32 +52,23 @@ define('admin/manage/tags', [ } function handleSearch() { - $('#tag-search').on('input propertychange', function () { - if (timeoutId) { - clearTimeout(timeoutId); - timeoutId = 0; - } + $('#tag-search').on('input propertychange', utils.debounce(function () { + socket.emit('topics.searchAndLoadTags', { + query: $('#tag-search').val(), + }, function (err, result) { + if (err) { + return app.alertError(err.message); + } - timeoutId = setTimeout(function () { - socket.emit('topics.searchAndLoadTags', { - query: $('#tag-search').val(), - }, function (err, result) { - if (err) { - return app.alertError(err.message); - } - - app.parseAndTranslate('admin/manage/tags', 'tags', { - tags: result.tags, - }, function (html) { - $('.tag-list').html(html); - utils.makeNumbersHumanReadable(html.find('.human-readable-number')); - timeoutId = 0; - - selectable.enable('.tag-management', '.tag-row'); - }); + app.parseAndTranslate('admin/manage/tags', 'tags', { + tags: result.tags, + }, function (html) { + $('.tag-list').html(html); + utils.makeNumbersHumanReadable(html.find('.human-readable-number')); + selectable.enable('.tag-management', '.tag-row'); }); - }, 250); - }); + }); + }, 250)); } function handleRename() { diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 5675f5b0aa..41d9a1a86d 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -412,7 +412,6 @@ define('admin/manage/users', [ }; function handleSearch() { - var timeoutId = 0; function doSearch() { $('.fa-spinner').removeClass('hidden'); loadSearchPage({ @@ -421,16 +420,8 @@ define('admin/manage/users', [ page: 1, }); } - $('#user-search').on('keyup', function () { - if (timeoutId !== 0) { - clearTimeout(timeoutId); - timeoutId = 0; - } - timeoutId = setTimeout(doSearch, 250); - }); - $('#user-search-by').on('change', function () { - doSearch(); - }); + $('#user-search').on('keyup', utils.debounce(doSearch, 250)); + $('#user-search-by').on('change', doSearch); } function loadSearchPage(query) { diff --git a/public/src/app.js b/public/src/app.js index 694fed6dd5..a4c97f5f9a 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -485,7 +485,6 @@ app.cacheBuster = null; var searchOptions = Object.assign({ in: config.searchDefaultInQuick || 'titles' }, options.searchOptions); var quickSearchResults = options.searchElements.resultEl; var inputEl = options.searchElements.inputEl; - var searchTimeoutId = 0; var oldValue = inputEl.val(); var filterCategoryEl = quickSearchResults.find('.filter-category'); @@ -556,27 +555,21 @@ app.cacheBuster = null; doSearch(); }); - inputEl.off('keyup').on('keyup', function () { - if (searchTimeoutId) { - clearTimeout(searchTimeoutId); - searchTimeoutId = 0; - } - searchTimeoutId = setTimeout(function () { - if (inputEl.val().length < 3) { - quickSearchResults.addClass('hidden'); - oldValue = inputEl.val(); - return; - } - if (inputEl.val() === oldValue) { - return; - } + inputEl.off('keyup').on('keyup', utils.debounce(function () { + if (inputEl.val().length < 3) { + quickSearchResults.addClass('hidden'); oldValue = inputEl.val(); - if (!inputEl.is(':focus')) { - return quickSearchResults.addClass('hidden'); - } - doSearch(); - }, 250); - }); + return; + } + if (inputEl.val() === oldValue) { + return; + } + oldValue = inputEl.val(); + if (!inputEl.is(':focus')) { + return quickSearchResults.addClass('hidden'); + } + doSearch(); + }, 250)); var mousedownOnResults = false; quickSearchResults.on('mousedown', function () { diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 0389834e76..de1f74763c 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -30,6 +30,7 @@ define('forum/chats', [ Chats.addEventListeners(); Chats.resizeMainWindow(); + Chats.setActive(); if (env === 'md' || env === 'lg') { Chats.addHotkeys(); @@ -452,7 +453,7 @@ define('forum/chats', [ }; Chats.addGlobalEventListeners = function () { - $(window).on('resize', Chats.resizeMainWindow); + $(window).on('resize', utils.throttle(Chats.resizeMainWindow, 100)); $(window).on('mousemove keypress click', function () { if (newMessage && ajaxify.data.roomId) { socket.emit('modules.chats.markRead', ajaxify.data.roomId); @@ -514,8 +515,6 @@ define('forum/chats', [ } $('.chats-full').height(viewportHeight - fromTop - 1); - - Chats.setActive(); }; Chats.setActive = function () { diff --git a/public/src/client/chats/search.js b/public/src/client/chats/search.js index 3103a22fab..0c83dd101f 100644 --- a/public/src/client/chats/search.js +++ b/public/src/client/chats/search.js @@ -5,16 +5,7 @@ define('forum/chats/search', ['components', 'api'], function (components, api) { var search = {}; search.init = function () { - var timeoutId = 0; - - components.get('chat/search').on('keyup', function () { - if (timeoutId) { - clearTimeout(timeoutId); - timeoutId = 0; - } - - timeoutId = setTimeout(doSearch, 250); - }); + components.get('chat/search').on('keyup', utils.debounce(doSearch, 250)); }; function doSearch() { diff --git a/public/src/client/tags.js b/public/src/client/tags.js index cb096401de..bde065269e 100644 --- a/public/src/client/tags.js +++ b/public/src/client/tags.js @@ -3,32 +3,22 @@ define('forum/tags', ['forum/infinitescroll'], function (infinitescroll) { var Tags = {}; - var timeoutId = 0; Tags.init = function () { app.enterRoom('tags'); $('#tag-search').focus(); - $('#tag-search').on('input propertychange', function () { - if (timeoutId) { - clearTimeout(timeoutId); - timeoutId = 0; - } - + $('#tag-search').on('input propertychange', utils.debounce(function () { if (!$('#tag-search').val().length) { return resetSearch(); } - timeoutId = setTimeout(function () { - socket.emit('topics.searchAndLoadTags', { query: $('#tag-search').val() }, function (err, results) { - if (err) { - return app.alertError(err.message); - } - onTagsLoaded(results.tags, true, function () { - timeoutId = 0; - }); - }); - }, 250); - }); + socket.emit('topics.searchAndLoadTags', { query: $('#tag-search').val() }, function (err, results) { + if (err) { + return app.alertError(err.message); + } + onTagsLoaded(results.tags, true); + }); + }, 250)); infinitescroll.init(Tags.loadMoreTags); }; diff --git a/public/src/client/users.js b/public/src/client/users.js index 50ecab2ac1..794cf04e90 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -6,16 +6,8 @@ define('forum/users', [ ], function (translator, Benchpress, api, AccountInvite) { var Users = {}; - var searchTimeoutID = 0; var searchResultCount = 0; - $(window).on('action:ajaxify.start', function () { - if (searchTimeoutID) { - clearTimeout(searchTimeoutID); - searchTimeoutID = 0; - } - }); - Users.init = function () { app.enterRoom('user_list'); @@ -33,23 +25,14 @@ define('forum/users', [ Users.handleSearch = function (params) { searchResultCount = params && params.resultCount; - searchTimeoutID = 0; - - $('#search-user').on('keyup', function () { - if (searchTimeoutID) { - clearTimeout(searchTimeoutID); - searchTimeoutID = 0; - } - - searchTimeoutID = setTimeout(doSearch, 250); - }); - - $('.search select, .search input[type="checkbox"]').on('change', function () { - doSearch(); - }); + $('#search-user').on('keyup', utils.debounce(doSearch, 250)); + $('.search select, .search input[type="checkbox"]').on('change', doSearch); }; function doSearch() { + if (!ajaxify.data.template.users) { + return; + } $('[component="user/search/icon"]').removeClass('fa-search').addClass('fa-spinner fa-spin'); var username = $('#search-user').val(); var activeSection = getActiveSection(); diff --git a/public/src/utils.js b/public/src/utils.js index fa9864ac5c..92317a0154 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -771,6 +771,26 @@ } }; }, + throttle: function (func, wait, immediate) { + var timeout; + return function () { + var context = this; + var args = arguments; + var later = function () { + timeout = null; + if (!immediate) { + func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + } + if (callNow) { + func.apply(context, args); + } + }; + }, }; return utils;