在contenteditable div中使用箭头键移动插入符号时停止不需要的滚动

时间:2014-08-12 17:26:24

标签: javascript jquery function jquery-selectors keydown

当我选择document*body或任何特定元素时,Keydown可以正常运作。

但是当我添加.not('.some-class')时,keydown的工作方式就像.not()一样,甚至不存在。也许是因为keydown影响儿童元素的方式,但我不确定:

$('*').not('.some-class').on('keydown',function(e){ 
    var key = e.charCode || e.keyCode;
    if(key == 33 || key == 34 || key == 35 || key == 36 || key == 37 || key == 38 || key == 39 || key == 40 ) {
        e.preventDefault();
    } else {}
});

除1个子类外,如何为整个文档禁用这些键?

修改: http://jsfiddle.net/umL139xw/2/

如何在保持箭头移动插入符号的同时停止这种不必要的滚动?

edit2:完整的解决方案归功于Jason P和Kaiido

http://jsfiddle.net/umL139xw/5/

2 个答案:

答案 0 :(得分:1)

事件泡沫(好吧,其中很多人都这样做)。这意味着它们会触发事件的目标,然后触发DOM树上的每个元素,所以即使你没有将处理程序绑定到.some-class,它也会触发该元素的祖先。 。此外,将事件处理程序绑定到*通常不是一个好主意。也许这样的事情会对你有用吗?

http://jsfiddle.net/j3wqpdow/

$(document).on('keydown',function(e){ 
    console.log(this, e.target);
});

$('.some-class').on('keydown', function(e) {
   e.stopPropagation(); 
});

答案 1 :(得分:1)

您可以使用 this answer 中的光标位置检测器,然后仅在最后时使用preventDefault()

$(document).on('keydown',function(e){
    console.log(this, e.target);
    var key = e.charCode || e.keyCode;
    if(key == 16 || key == 32 || key == 33 || key == 34 || key == 35 || key == 36 || key == 37 || key == 38 || key == 39 || key == 40 ) {
        e.preventDefault();
    } else {}
});
$('.b').on('keydown', function(e) {
  e.stopPropagation(); 
  var key = e.charCode || e.keyCode;
   //Above part comes from https://stackoverflow.com/questions/7451468/contenteditable-div-how-can-i-determine-if-the-cursor-is-at-the-start-or-end-o/7478420#7478420
    range = window.getSelection().getRangeAt(0)
    post_range = document.createRange();
    post_range.selectNodeContents(this);
    post_range.setStart(range.endContainer, range.endOffset);
    next_text = post_range.cloneContents();

    if( next_text.textContent.length === 0 && key == 39 ){
        e.preventDefault();
    }
});

Working fiddle