你正在做正確的方式傢伙。
var isProcessingEvent = false;
$("#textarea").on('click keypress cut paste', processUserInput);
function processUserInput(e) {
// Is processing event, so stop here.
if(isProcessingEvent) {
return;
}
isProcessingEvent = true;
// do the actual processing of user input
isProcessingEvent = false;
}
但是,如果我想你,我會用一個promisses
與用戶輸入的處理工作,這樣你:只要你改變爲keypress
,但你可以得到你的代碼的時尚,如果你想更好的無法在處理過程中凍結所有UI線程。
會是這樣的:
$("#textarea").on('click keypress cut paste', processUserInput);
function processUserInput(e) {
// Is processing event, so stop here.
if(processUserInput.working) {
// The user trigger the event while it was processing
processUserInput.doAgain = {
// save context
ctx: this,
// save event
e: e
};
return;
}
processUserInput.working = true;
function finished() {
processUserInput.working = false;
// The process finished but has new changes in the textfield so...
var lastEvent = processUserInput.doAgain;
if (lastEvent) {
processUserInput.doAgain = null;
// Process this guy again
setTimeout(processUserInput.bind(lastEvent.ctx), 0, lastEvent.e);
}
}
function theProcess(e, cb) {
// do my async stuff here
// Unfreeze the click/keydown/cut/past events in the textarea
if (typeof cb === 'function') {
cb();
}
}
setTimeout(theProcess.bind(this), 0, e, finished);
}
這是異步一個例子,但你可以使用一個異步Ajax或web的工人來處理您的活動,這樣你就不會凍結UI線程。
PS .:超時不會阻止UI線程凍結,它只會將您的進程放到執行隊列的末尾。
Ahh另一個提示!
如果您正在處理textarea中的文本,那麼最好使用keypress
而不是,因爲如果您在keydown中獲得textarea值,它將不會有更改,但按鍵會獲得由您更改的值正在緊迫。
http://www.quirksmode.org/dom/events/keys.html
當然,如果你仍然想使用的keydown,你可以使用我的例子進行了setTimeout
推遲處理。
不確定,但嘗試使用event.stopPropagation() – sdespont
@sdespont將無法正常工作,因爲它們是不同的事件。它會停止keydown傳播,然後執行過去並停止傳播。 –