Keyout 和 keyup
Keyout and keyup
我找到了一个完全适合我所有需要和想要的 JS 函数。但是,它有一个小缺点。
函数在执行函数之前等待 x 毫秒 (iKeyDelay),所有这些都绑定到一个键事件(keyup 或 keydown)。这一切都有效。
但是,当用户退出输入导致输入失去焦点时,函数会再次执行。应该防止这种额外的执行发生,因为它是不必要的。
我的 JS 技术不是很好,但也许你们中的一个可以帮助我?
$.fn.DelayedKey = function(fn, iKeyDelay, sKeyEvent) {
var iTimeoutId,
oEventData;
if (!$.isFunction(fn)) {
oEventData = arguments[0];
fn = arguments[1];
iKeyDelay = arguments[2];
sKeyEvent = arguments[3];
}
if (!iKeyDelay || 0 > iKeyDelay) {
iKeyDelay = 500;
}
if (!sKeyEvent || !this[sKeyEvent]) {
sKeyEvent = 'keydown';
}
function fnExecCallback() {
clearTimeout(iTimeoutId);
fn.apply(this, arguments);
}
function fnDelayCallback() {
var that = this,
args = arguments;
clearTimeout(iTimeoutId);
iTimeoutId = setTimeout(function() {
fnExecCallback.apply(that, args);
}, iKeyDelay);
}
if (oEventData) {
this.change(oEventData, fnExecCallback);
this[sKeyEvent](oEventData, fnDelayCallback);
}
else {
this.change(fnExecCallback);
this[sKeyEvent](fnDelayCallback);
}
return this;
};
全部修复!我更改了以下功能,它似乎解决了您的问题。
function fnExecCallback(e) {
if ( e.type != sKeyEvent )
return;
clearTimeout(iTimeoutId);
fn.apply(this, arguments);
}
Here 是更新后的 jsfiddle。
我找到了一个完全适合我所有需要和想要的 JS 函数。但是,它有一个小缺点。
函数在执行函数之前等待 x 毫秒 (iKeyDelay),所有这些都绑定到一个键事件(keyup 或 keydown)。这一切都有效。
但是,当用户退出输入导致输入失去焦点时,函数会再次执行。应该防止这种额外的执行发生,因为它是不必要的。
我的 JS 技术不是很好,但也许你们中的一个可以帮助我?
$.fn.DelayedKey = function(fn, iKeyDelay, sKeyEvent) {
var iTimeoutId,
oEventData;
if (!$.isFunction(fn)) {
oEventData = arguments[0];
fn = arguments[1];
iKeyDelay = arguments[2];
sKeyEvent = arguments[3];
}
if (!iKeyDelay || 0 > iKeyDelay) {
iKeyDelay = 500;
}
if (!sKeyEvent || !this[sKeyEvent]) {
sKeyEvent = 'keydown';
}
function fnExecCallback() {
clearTimeout(iTimeoutId);
fn.apply(this, arguments);
}
function fnDelayCallback() {
var that = this,
args = arguments;
clearTimeout(iTimeoutId);
iTimeoutId = setTimeout(function() {
fnExecCallback.apply(that, args);
}, iKeyDelay);
}
if (oEventData) {
this.change(oEventData, fnExecCallback);
this[sKeyEvent](oEventData, fnDelayCallback);
}
else {
this.change(fnExecCallback);
this[sKeyEvent](fnDelayCallback);
}
return this;
};
全部修复!我更改了以下功能,它似乎解决了您的问题。
function fnExecCallback(e) {
if ( e.type != sKeyEvent )
return;
clearTimeout(iTimeoutId);
fn.apply(this, arguments);
}
Here 是更新后的 jsfiddle。