jQuery .keydown(),. keyup()忽略“我”,“B”

时间:2011-08-27 21:31:57

标签: jquery events javascript-events contenteditable

我在这里有一些代码,在TextMate的网页预览中可以正常工作,但Safari正在做一些我不确定如何解决的问题......

$(document).ready(function(){

  $('*[contentEditable="true"]').focusin(function(){
    var _self = this;
    var isCtrl = false;
    // Bind events.
    $(window).keyup( function(e) {
      if(e.which==17 || e.which == 91) isCtrl=false;
    });
    $(window).keydown( function(e){
      if(e.which==17 || e.which == 91) isCtrl=true;
      if(isCtrl) {
        console.log(e.which);
        switch(e.which) {
          case 66:  doCommand('bold');
                    break;
          case 67:  doCommand('cut');    
                    break;
          case 73:  doCommand('italic'); 
                    break;
          case 86:  doCommand('paste');  
                    break;
          default:  break;
        }
        return false;
      }
    });
  }).focusout(function(){
    $(window).unbind();
  });
});

当按下control + icommand + i时,我们应该收到一个事件,使contentEditable区域中的文字为斜体。问题是,虽然其他标准的ASCII / Alpha字符会触发,但B和我不会。现在,如果我preventDefault(),仍然没有。

我需要一双新鲜的眼睛。任何其他人都能看到解决这个问题的方法,这不会阻止我打字吗?

谢谢。

修改 为了澄清,是的,这适用于其他文本输入元素(<textarea><input>等)。它与contentEditable具体相关。

此外,此处还包含doCommand

doCommand = function(cmd) {
  document.execCommand(cmd, null, null);
}

2 个答案:

答案 0 :(得分:1)

首先,无需单独检测修改键。您可以从keyupkeydown事件中找出 cmd ctrl 键是否使用事件ctrlKey按住了metaKey属性。

其次,在contenteditable元素中,浏览器已经内置了粗体和斜体命令的键盘快捷键。

当然可以拦截你想要的按键。见http://jsfiddle.net/Hq43A/

答案 1 :(得分:0)

你的doCommand函数出了问题。

查看here并尝试一下。你会在CTRL + I上看到它警告“斜体”。

尝试在您的功能中添加一些警报,您会发现在调试时它会对您有所帮助。