Javascript keyDown事件覆盖粘贴事件
由于我使用canvas来呈现键入的文本,并且需要使用其他键事件,如backspace、forward delete、tab和arrow键,因此我需要浏览器之间的兼容性以及使用keypress和keydown事件。尝试使用粘贴事件时,keydown事件具有优先权,并取消粘贴事件 一个相关的问题,但不能解决我的问题,因为我想保留keydown和keypress事件 我的事件侦听器:Javascript keyDown事件覆盖粘贴事件,javascript,canvas,addeventlistener,paste,event-listener,Javascript,Canvas,Addeventlistener,Paste,Event Listener,由于我使用canvas来呈现键入的文本,并且需要使用其他键事件,如backspace、forward delete、tab和arrow键,因此我需要浏览器之间的兼容性以及使用keypress和keydown事件。尝试使用粘贴事件时,keydown事件具有优先权,并取消粘贴事件 一个相关的问题,但不能解决我的问题,因为我想保留keydown和keypress事件 我的事件侦听器: window.addEventListener('paste', pasteText); window.addEve
window.addEventListener('paste', pasteText);
window.addEventListener("keypress", keyPressHandler, true);
window.addEventListener("keydown", keyDownHandler, true);
function pasteText (event) {
console.log('paste');
if(selectedLine !== ''){
var clipboardData, pastedData;
event.stopPropagation();
event.preventDefault();
clipboardData = event.clipboardData || window.clipboardData;
pastedData = clipboardData.getData('Text');
}
}
function keyPressHandler(event){
if(selectedLine != '' &&
$(".sp-input").is(":focus") === false &&
$("input").is(":focus") === false){
var key = event.keyCode;
if (key == 13){ // Enter key
gotoNextLineOrDeselect();
}else if (key == 115 && (event.ctrlKey||event.metaKey)|| (key == 19)) {
// this will be for modifier keys like ctrl, option and command
event.preventDefault();
// do stuff
}else if(key !== 8 &&
key !== 9 &&
key !== 37 &&
key !== 38 &&
key !== 39 &&
key !== 40 &&
key !== 46){
key = event.charCode;
addletter(String.fromCharCode(key));
event.preventDefault();
}
}
}
function keyDownHandler(event){
if(selectedLine != '' &&
$(".sp-input").is(":focus") === false){
var key = event.keyCode;
switch(key){
case 8:
backspace();
break;
case 9: // tab
var nextLine;
if(selectedLine === 'line1' && lineBlankOrWhitespace('line2') === false){
nextLine = 'line2';
}else if(selectedLine === 'line2' && lineBlankOrWhitespace('line3') === false){
nextLine = 'line3';
}else if(selectedLine === 'line2' & lineBlankOrWhitespace('line3') ||
selectedLine === 'line3'){
nextLine = 'line1';
}else return;
selectLine(nextLine, false);
textInsertIndex = textLines[selectedLine].keyHistory.length;
setCaretXPosWithTextInsertIndex(selectedLine, 0);
renderScreen();
event.preventDefault();
break;
case 37: // left arrow
arrowOver(-1);
event.preventDefault();
break;
case 39: // right arrow
arrowOver(1);
event.preventDefault();
break;
case 38: // up arrow
var prevLine = selectedLine === 'line3' ? 'line2' : 'line1';
if(selectedLine !== 'line1'){
selectLine(prevLine, false);
textInsertIndex = textLines[selectedLine].keyHistory.length;
}else{
textInsertIndex = 0;
}
setCaretXPosWithTextInsertIndex(selectedLine, 0);
renderScreen();
event.preventDefault();
break;
case 40: // down arrow
var nextLine = selectedLine === 'line1' ? 'line2' : 'line3';
if(lineBlankOrWhitespace(nextLine) === false &&
selectedLine !== 'line3'){
selectLine(nextLine, false);
}
textInsertIndex = textLines[selectedLine].keyHistory.length;
setCaretXPosWithTextInsertIndex(selectedLine, 0);
renderScreen();
event.preventDefault();
break;
case 46: // forward delete key
forwardDelete();
break;
}
}
}
粘贴时,是否有方法防止触发按键和按键向下事件?答案是:如果存在默认值,我需要防止它。然后我需要检查其他按键事件上的修改键,如果按下,则返回false
function pasteText (event) {
if (event.preventDefault())
event.preventDefault();
console.log('paste');
}
function keyPressHandler(event){
if (event.ctrlKey||event.metaKey) {
return false;
}
}
function keyDownHandler(event){
if (event.ctrlKey||event.metaKey) {
return false;
}
}
如果您发布事件处理程序的代码,这会有很大帮助,因为问题很可能就出在那里。preventDefault?更新了事件处理程序它还不清楚吗?想让我包括其他内容吗?espascarello,如果预防违约是解决方案,我会把它放在哪里?我在粘贴事件开始时尝试过,但没有执行任何操作:event.preventDefault();