Javascript - 按下键后保持按下状态(返回true)

时间:2016-04-01 14:53:19

标签: javascript jquery

你必须先点击任何一个按钮才能注册。



<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!doctype html>
<html>

<head>

  <title>Display Coloring</title>

  <script src="jquery-2.2.1.min.js"></script>

  <style type="text/css">
    div {
      background-color: rgb(0, 0, 0);
      width: 20px;
      height: 20px;
      left: 0;
      top: 0;
      bottom: 0;
      line-height: 0;
      margin: 0;
      padding: 0;
      display: inline-block;
      float: left;
    }
    body {
      top: 0;
      left: 0;
      bottom: 0;
      margin: 0;
      padding: 0;
      margin: 0;
      width: 1920px;
      height: 1080px;
    }
    div:hover {
      background-color: rgb(0, 0, 0);
      background-color: rgba(255, 0, 0, 0.5);
    }
    input {
      float: left;
      width: 20px;
      height: 20px;
      top: 0;
      left: 0;
      bottom: 0;
      padding: 0;
      -webkit-appearance: none;
      background-color: rgba(0, 0, 0, 0);
      box-shadow: none !important;
      outline: none;
      border: none;
      word-spacing: 0;
      letter-spacing: 0;
    }
    #conDiv {
      width: 1920px;
      height: 1080px;
      background-color: transparent;
      position: absolute;
      z-index: 1;
    }
    #conInput {
      width: 1920px;
      height: 1080px;
      position: absolute;
      z-index: -1;
    }
  </style>

</head>

<body>

  <script>
    var body = document.body;

    a = [];
    b = [];
    c = [];
    i = [];
    d = [];
    clicked = [];
    altDown = false;

    window.onload = function() {

      conInput = document.createElement('div');
      conInput.setAttribute('id', 'conInput');
      document.body.appendChild(conInput);

      conDiv = document.createElement('div');
      conDiv.setAttribute('id', 'conDiv');
      document.body.appendChild(conDiv);

      //for(u=0;u<1911;u+=10){
      for (u = 0; u < 1901; u += 20) {

        a.push(u);

        for (v = 0; v < 1061; v += 20) {
          //for(v=0; v<1071; v+=10){

          b.push(v);

          var newDiv = document.createElement("div");
          newDiv.id = b.length - 1;
          conDiv.appendChild(newDiv);
        }
      }

      //for(u=0;u<1911;u+=10){

      //	for(v=0; v<1071; v+=10){
      for (u = 0; u < 1901; u += 20) {

        for (v = 0; v < 1061; v += 20) {

          c.push(v);

          var newInput = document.createElement("input");
          newInput.setAttribute('type', 'color');
          newInput.id = c.length - 1;

          conInput.appendChild(newInput);
        }
      }

      function marking() {

        $("body").on("keydown keyup", function(event) {

          if (event.type == "keydown") {
            console.log(event.type);
            $('div').hover(function() {
              if (event.keyCode == 16 && this.id !== "conDiv" && this.id !== "conInput") {
                clicked.push(this);
                this.style.backgroundColor = "#b3ffb3";
                console.log(event);
              }
            })
          } else {
            console.log(event);
            $('div').hover(function() {
              if (event.keyCode == 16) {
                //if()		    		
                if (this.id !== "conDiv" && this.id !== "conInput") {
                  this.style.backgroundColor = "#000000";
                  //console.log(event.shiftKey);
                }
              }
            })
          }
        })
      }

      function changeColor() {

        divs = body.getElementsByTagName('div');
        inputs = body.getElementsByTagName('input');

        for (var l = 0; l < inputs.length; l++) {

          if (inputs[l].id !== "conInput") {

            i.push(inputs[l]);

          }

        }

        for (var k = 0; k < divs.length; k++) {

          if (divs[k].id !== "conDiv" && divs[k].id !== "conInput") {

            d.push(divs[k]);

          }

        }

        $(document).ready(function() {

          $("body").bind("keydown", function(event) {

            if (event.altKey) {

              for (var h in d) {

                //if(d[h].id == "10272" && altDown == false){
                if (d[h].id == "2544" && altDown == false) {

                  d[h].style.opacity = "0.4";

                  altDown = true;

                }

                //else if(d[h].id == "10272" && altDown == true) {
                else if (d[h].id == "2544" && altDown == true) {

                  d[h].style.opacity = "1";

                  altDown = false;

                }

              }
            }
          });
        });

        $('div').on('click', function() {

          if (this.id != "conDiv" && this.id != "conInput") {

            if (event.ctrlKey) {

              clicked.push(this);

              for (var h in d) {

                if (d[h].id == this.id) {

                  $(d[h]).css('background-color', 'rgba(255, 255, 102, 0.8)');

                }

              }

            } else if (clicked.length > 0) {

              for (var clk in clicked) {

                target = document.getElementById(this.id);

                $(target).click();

                $(target).on('change', function() {

                  newColor = this.value;

                  parsed = newColor.charAt(0) == "#" ? newColor.substring(1, 7) : newColor;

                  r = parseInt(parsed.substring(0, 2), 16).toString();
                  g = parseInt(parsed.substring(2, 4), 16).toString();
                  b = parseInt(parsed.substring(4, 6), 16).toString();

                  newColorRGB = "(" + r + ", " + g + ", " + b + ")";

                  for (clk in clicked) {

                    clicked[clk].style.backgroundColor = newColor;
                    clicked[clk].setAttribute("title", newColorRGB);

                  }

                  clicked = [];

                });

              }

            } else if (clicked.length == 0) {

              for (var z in i) {

                if (i[z].id == this.id) {

                  target = document.getElementById(this.id);

                  $(target).click();

                  $(target).on('change', function() {

                    newColor = this.value;

                    parsed = newColor.charAt(0) == "#" ? newColor.substring(1, 7) : newColor;

                    r = parseInt(parsed.substring(0, 2), 16).toString();
                    g = parseInt(parsed.substring(2, 4), 16).toString();
                    b = parseInt(parsed.substring(4, 6), 16).toString();

                    newColorRGB = "(" + r + ", " + g + ", " + b + ")";

                    for (var h in d) {

                      if (d[h].id == this.id) {

                        d[h].style.backgroundColor = newColor;
                        d[h].setAttribute("title", newColorRGB);

                      }

                    }

                  });

                }
              }
            }

          }

        });

      }

      changeColor();
      marking();
    }
  </script>

</body>

</html>
&#13;
&#13;
&#13;

如果我按 shiftKey 它会起作用并且div会得到它们的颜色,但是如果我释放 shiftKey ,状态会保持 true < / strong>并且它一直着色直到刷新。

以下是代码:

function marking(){
$("body").bind("keydown", function(event) {
    $('div').hover(function(){
        if(event.shiftKey){         
            if(this.id !== "conDiv" && this.id !== "conInput"){
            clicked.push(this);
            this.style.backgroundColor = "#b3ffb3";
            console.log(event.shiftKey);
            }
        }
        else{};
        }
    })
});

}

我能以某种方式告诉程序对 shiftKey 的发布做出反应吗?

更新

$("body").on("keydown keyup", function(event) {

       if(event.type == "keydown"){
            $('div').hover(function(){
                if(event.keyCode == 16 && this.id !== "conDiv" && this.id !== "conInput"){  
                clicked.push(this);
                this.style.backgroundColor = "#b3ffb3";
                console.log(event);
                }                           
            })
       }
       else{
            console.log(event);
            $('div').hover(function(){
                if(event.keyCode == 16){                    
                    if(this.id !== "conDiv" && this.id !== "conInput"){
                    this.style.backgroundColor = "#000000";
                    }
                }
            })
       }
})

现在它改变 shiftKey 上的颜色,并将 keyup 上的颜色更改为#000000。但它仍然停留在 keydown 上,如果我将鼠标悬停在 div 上,它会将对象推入我的数组而不会着色。

我希望它在按Shift键时显示颜色,并在释放Shift时不做任何操作。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您似乎需要的是mousemove事件以及shiftKey event property

现在的一个问题是你没有取消按下shift时设置的悬停处理程序。

主要区别是

  function marking() {
    $("body").on("mousemove", "div", function(event) {
        if (event.shiftKey) {
             this.style.backgroundColor "#b3ffb3";
        }
    })
  }

我已修改了以下代码

&#13;
&#13;
<!doctype html>
<html>

<head>

  <title>Display Coloring</title>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  <style type="text/css">
    div {
      background-color: rgb(0, 0, 0);
      width: 20px;
      height: 20px;
      left: 0;
      top: 0;
      bottom: 0;
      line-height: 0;
      margin: 0;
      padding: 0;
      display: inline-block;
      float: left;
    }
    body {
      top: 0;
      left: 0;
      bottom: 0;
      margin: 0;
      padding: 0;
      margin: 0;
      width: 1920px;
      height: 1080px;
    }
    div:hover {
      background-color: rgb(0, 0, 0);
      background-color: rgba(255, 0, 0, 0.5);
    }
    input {
      float: left;
      width: 20px;
      height: 20px;
      top: 0;
      left: 0;
      bottom: 0;
      padding: 0;
      -webkit-appearance: none;
      background-color: rgba(0, 0, 0, 0);
      box-shadow: none !important;
      outline: none;
      border: none;
      word-spacing: 0;
      letter-spacing: 0;
    }
    #conDiv {
      width: 1920px;
      height: 1080px;
      background-color: transparent;
      position: absolute;
      z-index: 1;
    }
    #conInput {
      width: 1920px;
      height: 1080px;
      position: absolute;
      z-index: -1;
    }
  </style>

</head>

<body>

  <script>
    var body = document.body;

    a = [];
    b = [];
    c = [];
    i = [];
    d = [];
    clicked = [];
    altDown = false;

    window.onload = function() {

      conInput = document.createElement('div');
      conInput.setAttribute('id', 'conInput');
      document.body.appendChild(conInput);

      conDiv = document.createElement('div');
      conDiv.setAttribute('id', 'conDiv');
      document.body.appendChild(conDiv);

      //for(u=0;u<1911;u+=10){
      for (u = 0; u < 1901; u += 20) {

        a.push(u);

        for (v = 0; v < 1061; v += 20) {
          //for(v=0; v<1071; v+=10){

          b.push(v);

          var newDiv = document.createElement("div");
          newDiv.id = b.length - 1;
          conDiv.appendChild(newDiv);
        }
      }

      //for(u=0;u<1911;u+=10){

      //	for(v=0; v<1071; v+=10){
      for (u = 0; u < 1901; u += 20) {

        for (v = 0; v < 1061; v += 20) {

          c.push(v);

          var newInput = document.createElement("input");
          newInput.setAttribute('type', 'color');
          newInput.id = c.length - 1;

          conInput.appendChild(newInput);
        }
      }

      function marking() {

        $("body").on("mousemove", "div", function(event) {              
          if (event.shiftKey) {
             this.style.backgroundColor =  "#b3ffb3";
          }
        })
      }

      function changeColor() {

        divs = body.getElementsByTagName('div');
        inputs = body.getElementsByTagName('input');

        for (var l = 0; l < inputs.length; l++) {

          if (inputs[l].id !== "conInput") {

            i.push(inputs[l]);

          }

        }

        for (var k = 0; k < divs.length; k++) {

          if (divs[k].id !== "conDiv" && divs[k].id !== "conInput") {

            d.push(divs[k]);

          }

        }

        $(document).ready(function() {

          $("body").bind("keydown", function(event) {

            if (event.altKey) {

              for (var h in d) {

                //if(d[h].id == "10272" && altDown == false){
                if (d[h].id == "2544" && altDown == false) {

                  d[h].style.opacity = "0.4";

                  altDown = true;

                }

                //else if(d[h].id == "10272" && altDown == true) {
                else if (d[h].id == "2544" && altDown == true) {

                  d[h].style.opacity = "1";

                  altDown = false;

                }

              }
            }
          });
        });

        $('div').on('click', function() {

          if (this.id != "conDiv" && this.id != "conInput") {

            if (event.ctrlKey) {

              clicked.push(this);

              for (var h in d) {

                if (d[h].id == this.id) {

                  $(d[h]).css('background-color', 'rgba(255, 255, 102, 0.8)');

                }

              }

            } else if (clicked.length > 0) {

              for (var clk in clicked) {

                target = document.getElementById(this.id);

                $(target).click();

                $(target).on('change', function() {

                  newColor = this.value;

                  parsed = newColor.charAt(0) == "#" ? newColor.substring(1, 7) : newColor;

                  r = parseInt(parsed.substring(0, 2), 16).toString();
                  g = parseInt(parsed.substring(2, 4), 16).toString();
                  b = parseInt(parsed.substring(4, 6), 16).toString();

                  newColorRGB = "(" + r + ", " + g + ", " + b + ")";

                  for (clk in clicked) {

                    clicked[clk].style.backgroundColor = newColor;
                    clicked[clk].setAttribute("title", newColorRGB);

                  }

                  clicked = [];

                });

              }

            } else if (clicked.length == 0) {

              for (var z in i) {

                if (i[z].id == this.id) {

                  target = document.getElementById(this.id);

                  $(target).click();

                  $(target).on('change', function() {

                    newColor = this.value;

                    parsed = newColor.charAt(0) == "#" ? newColor.substring(1, 7) : newColor;

                    r = parseInt(parsed.substring(0, 2), 16).toString();
                    g = parseInt(parsed.substring(2, 4), 16).toString();
                    b = parseInt(parsed.substring(4, 6), 16).toString();

                    newColorRGB = "(" + r + ", " + g + ", " + b + ")";

                    for (var h in d) {

                      if (d[h].id == this.id) {

                        d[h].style.backgroundColor = newColor;
                        d[h].setAttribute("title", newColorRGB);

                      }

                    }

                  });

                }
              }
            }

          }

        });

      }

      changeColor();
      marking();
    }
  </script>

</body>

</html>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您需要编写代码以撤消keyup中的着色。

您已正确编写keydown,但该事件未构建任何内容,当用户不再使用该密钥时,会反转此代码。

keyup明确表示向下点击一个键,keydown明确用于释放键。