Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对多个事件使用e.preventDefault()一次_Javascript - Fatal编程技术网

Javascript 对多个事件使用e.preventDefault()一次

Javascript 对多个事件使用e.preventDefault()一次,javascript,Javascript,在下面的代码中,您可以看到我根据需要多次使用了e.preventDefault() 我正在寻找一种方法来使用e.preventDefault()一次,但保持与下面代码相同的功能 不要告诉我将e.preventDefault()放在ctrl之后,因为我想让其他快捷键继续工作 document.addEventListener("keydown", function(e) { // shortcuts if (e.ctrlKey) { // Ctrl+ switch (e.keyCode

在下面的代码中,您可以看到我根据需要多次使用了
e.preventDefault()

我正在寻找一种方法来使用
e.preventDefault()
一次,但保持与下面代码相同的功能

不要告诉我将
e.preventDefault()
放在
ctrl
之后,因为我想让其他快捷键继续工作

document.addEventListener("keydown", function(e) { // shortcuts
  if (e.ctrlKey) { // Ctrl+
    switch (e.keyCode) {
      case 82: // R
        e.preventDefault();
        newDoc();
        break;
      case 79: // O
        e.preventDefault();
        openDoc();
        break;
      case 83: // S
        e.preventDefault();
        saveDoc();
        break;
      case 66: // B
        e.preventDefault();
        showHideStatusBar(statusBarOn ? false : true); // toggle
        break;
      case 191: // /
        e.preventDefault();
        alert("Welcome to " + appname + "!");
        break;
    }
  }
  if (e.keyCode == 9) { // tab
    e.preventDefault();
    var sStart = textarea.selectionStart,
      text = textarea.value;
    textarea.value = text.substring(0, sStart) + "\t" + text.substring(textarea.selectionEnd);
    textarea.selectionEnd = sStart + 1;
  }
});
终于得到了这个:

document.addEventListener("keydown", function(e) { // shortcuts
  var key = {
    "noctrl9": function() { // tab
      var sStart = textarea.selectionStart,
        text = textarea.value;
      textarea.value = text.substring(0, sStart) + "\t" + text.substring(textarea.selectionEnd);
      textarea.selectionEnd = sStart + 1;
    },
    66: function() { // B
      showHideStatusBar(statusBarOn ? false : true); // toggle
    },
    79: openDoc, // O
    82: newDoc, // R
    83: saveDoc, // S
    191: function() { // /
      alert("Welcome to " + appname + "!");
    }
  }, fn = e.ctrlKey ? key[e.keyCode] : key["noctrl" + e.keyCode];
  if (fn) {
    e.preventDefault();
    fn();
  }
});

您可以将代码放在一个单独的方法中,该方法在处理事件时返回true,否则返回false,那么您的事件处理程序如下所示

document.addEventListener("keydown", function(e) { // shortcuts
   if (processShortcut(e))
   {
       e.preventDefault();
   }
});

我有一种感觉,你可能会添加更多的动作,这样你就可以这样做:

document.addEventListener("keydown", (function() { // shortcuts
  //return a closure that has actions in it's scope
  var actions={
    "82":{fn:newDoc},
    "79":{fn:openDoc},
    "83":{fn:saveDoc},
    "66":{fn:function(){
      //a closure here isn't needed if showHideStatusBar
      //  would check out the value of statusBarOn
      showHideStatusBar(statusBarOn ? false : true);
    }},
    "191":{fn:function(){
      alert("Welcome to " + appname + "!");
    }},
    "noctrl9":{fn:function(){
      //var sStart = ....
      //  maybe this code is a good candidate to be put
      //  in it's own function as well
    }}
  };
  return function(e){
   if ((e.ctrlKey && actions[e.keyCode])
    || actions["noctrl"+e.keyCode]) {
      e.preventDefault();
      actions[keyCode].fn();
  }
 };  
}()));

对于任何需要关闭的密钥,如StHeDeStestUsBar和TAG逻辑,可以考虑编写一个函数,它不需要参数,因为它简化了操作对象。

您可以告诉默认返回,并在交换机之后设置EdvEntRebug,但是它有点混乱。你可以用这种方式使用document.addEventListener(“keydown”,函数(e){//shortcuts if(e.ctrlKey){//Ctrl+e.preventDefault();这将防止在Ctrl之后发生任何事件。像Ctrl+a一样,Ctrl+c将不起作用