我想在输入文本框中停止输入(而不是在输入时)字符后触发事件。
我试过了:
$('input#username').keypress(function() {
var _this = $(this); // copy of this object for further usage
setTimeout(function() {
$.post('/ajax/fetch', {
type: 'username',
value: _this.val()
}, function(data) {
if(!data.success) {
// continue working
} else {
// throw an error
}
}, 'json');
}, 3000);
});
但是这个例子会为每个类型字符生成一个超时,如果输入20个字符,我会得到大约20个AJAX请求。
On this fiddle我用简单的警报而不是AJAX来证明同样的问题。
是否有针对此问题的解决方案,或者我只是采用了不好的方法?
答案 0 :(得分:157)
您必须使用setTimeout
(与您一样),但也要存储参考,以便您可以继续重置限制。类似的东西:
//
// $('#element').donetyping(callback[, timeout=1000])
// Fires callback when a user has finished typing. This is determined by the time elapsed
// since the last keystroke and timeout parameter or the blur event--whichever comes first.
// @callback: function to be called when even triggers
// @timeout: (default=1000) timeout, in ms, to to wait before triggering event if not
// caused by blur.
// Requires jQuery 1.7+
//
;(function($){
$.fn.extend({
donetyping: function(callback,timeout){
timeout = timeout || 1e3; // 1 second default timeout
var timeoutReference,
doneTyping = function(el){
if (!timeoutReference) return;
timeoutReference = null;
callback.call(el);
};
return this.each(function(i,el){
var $el = $(el);
// Chrome Fix (Use keyup over keypress to detect backspace)
// thank you @palerdot
$el.is(':input') && $el.on('keyup keypress paste',function(e){
// This catches the backspace button in chrome, but also prevents
// the event from triggering too preemptively. Without this line,
// using tab/shift+tab will make the focused element fire the callback.
if (e.type=='keyup' && e.keyCode!=8) return;
// Check if timeout has been set. If it has, "reset" the clock and
// start over again.
if (timeoutReference) clearTimeout(timeoutReference);
timeoutReference = setTimeout(function(){
// if we made it here, our timeout has elapsed. Fire the
// callback
doneTyping(el);
}, timeout);
}).on('blur',function(){
// If we can, fire the event since we're leaving the field
doneTyping(el);
});
});
}
});
})(jQuery);
$('#example').donetyping(function(){
$('#example-output').text('Event last fired @ ' + (new Date().toUTCString()));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="text" id="example" />
<p id="example-output">Nothing yet</p>
这将在以下时间执行:
blur
事件)(以先到者为准)
答案 1 :(得分:60)
解决方案:
这是解决方案。在用户停止键入指定时间后执行函数:
var delay = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
用法
$('input').keyup(function() {
delay(function(){
alert('Hi, func called');
}, 1000 );
});
答案 2 :(得分:15)
你可以使用underscore.js“debounce”
$('input#username').keypress( _.debounce( function(){<your ajax call here>}, 500 ) );
这意味着您的函数调用将在按下一个键500ms后执行。但如果你在500ms之前按下另一个键(另一个按键事件被触发),前一个函数执行将被忽略(去抖动),新的将在新的500ms计时器之后执行。
有关额外信息, 使用_.debounce(func,timer, true )意味着将执行第一个函数,并且将忽略具有后续500ms计时器的所有其他按键事件。
答案 3 :(得分:9)
你需要去抖!
这是一个jQuery plugin,您需要了解debounce。如果你是从Google来到这里并且Underscore已经进入你的应用程序的JSoup,它已经去抖动baked right in!
答案 4 :(得分:5)
清洁解决方案:
$.fn.donetyping = function(callback, delay){
delay || (delay = 1000);
var timeoutReference;
var doneTyping = function(elt){
if (!timeoutReference) return;
timeoutReference = null;
callback(elt);
};
this.each(function(){
var self = $(this);
self.on('keyup',function(){
if(timeoutReference) clearTimeout(timeoutReference);
timeoutReference = setTimeout(function(){
doneTyping(self);
}, delay);
}).on('blur',function(){
doneTyping(self);
});
});
return this;
};
答案 5 :(得分:3)
有一些简单的plugin我已经做到了这一点。它需要的代码比提出的解决方案要少得多,而且非常轻(~0.6kb)
首先,您可以随时创建Bid
个对象,而不是bumped
。每个 bump 都会延迟在下一个给定的时间内触发 Bid 回调。
var searchBid = new Bid(function(inputValue){
//your action when user will stop writing for 200ms.
yourSpecialAction(inputValue);
}, 200); //we set delay time of every bump to 200ms
当Bid
对象准备就绪时,我们需要以某种方式bump
。让我们追加keyup
event
。
$("input").keyup(function(){
searchBid.bump( $(this).val() ); //parameters passed to bump will be accessable in Bid callback
});
这里会发生什么:
每次用户按键时,出价都会在接下来的200毫秒内“延迟”(碰撞)。如果200ms将在没有再次“碰撞”的情况下通过,则将触发回调。
此外,您还有2个额外的功能可以停止出价(例如,如果用户按下esc或点击外部输入)以及立即完成并触发回调(例如当用户按回车键时):
searchBid.stop();
searchBid.finish(valueToPass);
答案 6 :(得分:1)
我一直在寻找一个简单的HTML / JS代码,但我没有找到任何代码。然后,我使用onkeyup="DelayedSubmission()"
编写了下面的代码。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
<head><title>Submit after typing finished</title>
<script language="javascript" type="text/javascript">
function DelayedSubmission() {
var date = new Date();
initial_time = date.getTime();
if (typeof setInverval_Variable == 'undefined') {
setInverval_Variable = setInterval(DelayedSubmission_Check, 50);
}
}
function DelayedSubmission_Check() {
var date = new Date();
check_time = date.getTime();
var limit_ms=check_time-initial_time;
if (limit_ms > 800) { //Change value in milliseconds
alert("insert your function"); //Insert your function
clearInterval(setInverval_Variable);
delete setInverval_Variable;
}
}
</script>
</head>
<body>
<input type="search" onkeyup="DelayedSubmission()" id="field_id" style="WIDTH: 100px; HEIGHT: 25px;" />
</body>
</html>
答案 7 :(得分:1)
您应将setTimeout
分配给变量,并在按键时使用clearTimeout
清除它。
var timer = '';
$('input#username').keypress(function() {
clearTimeout(timer);
timer = setTimeout(function() {
//Your code here
//Your code here
}, 3000); //Waits for 3 seconds after last keypress to execute the above lines of code
});
希望这会有所帮助。
答案 8 :(得分:0)
为什么只想重设时钟呢?
var clockResetIndex = 0 ;
// this is the input we are tracking
var tarGetInput = $('input#username');
tarGetInput.on( 'keyup keypress paste' , ()=>{
// reset any privious clock:
if (clockResetIndex !== 0) clearTimeout(clockResetIndex);
// set a new clock ( timeout )
clockResetIndex = setTimeout(() => {
// your code goes here :
console.log( new Date() , tarGetInput.val())
}, 1000);
});
如果您正在使用wordpress,则需要将所有这些代码包装在其中 jQuery块:
jQuery(document).ready(($) => {
/**
* @name 'navSearch'
* @version 1.0
* Created on: 2018-08-28 17:59:31
* GMT+0530 (India Standard Time)
* @author : ...
* @description ....
*/
var clockResetIndex = 0 ;
// this is the input we are tracking
var tarGetInput = $('input#username');
tarGetInput.on( 'keyup keypress paste' , ()=>{
// reset any privious clock:
if (clockResetIndex !== 0) clearTimeout(clockResetIndex);
// set a new clock ( timeout )
clockResetIndex = setTimeout(() => {
// your code goes here :
console.log( new Date() , tarGetInput.val())
}, 1000);
});
});
答案 9 :(得分:0)
在HTML的<input>
中使用属性onkeyup =“ myFunction()”。
答案 10 :(得分:0)
import { useDebouncedCallback } from 'use-debounce'; - 如果未安装,请安装 npm 包
const [searchText, setSearchText] = useState('');
const onSearchTextChange = value => {
setSearchText(value);
};
//call search api
const [debouncedOnSearch] = useDebouncedCallback(searchIssues, 500);
useEffect(() => {
debouncedOnSearch(searchText);
}, [searchText, debouncedOnSearch]);
答案 11 :(得分:0)
这就是我在 formControl 中使用的。它对我有用。
Sensor.order('created_at DESC').pluck(:system_id).uniq
答案 12 :(得分:-2)
在我的想法中,如果用户没有专注于该输入,他就会停止写作。为此你有一个名为“模糊”的功能,可以填充like