javascript - 绑定(bind) Javascript 按键事件

标签 javascript asp.net dom-events client-side

我需要监控 Shift 键的状态,是向上还是向下。其目的是通知用户,当按住 shift 键时,他们将要执行的拖放操作将复制节点,而不是移动它们。

我让它与下面的代码完美配合,但是,如果我按住 Shift 键并执行拖放,钩子(Hook)将不再存在;屏幕不再响应按键并保持“按下”状态。

我猜要么是操作顺序问题,要么是遗漏了一 block 。 Javascript高手请指教。

<form id="form1" runat="server">
<div>
    <table>
        <tr>
            <td valign="top"><ASP:Literal id="treeLeft" EnableViewState="false" runat="server" /></td>
        </tr>
    </table>
    
    <asp:Label ID="lblCopyEnabled" runat="server" BackColor="Green" Text="Item will be Copied" ForeColor="White" Font-Bold="true" style="padding: 0px 10px 0px 10px; display: none" />
</div>

 <script type="text/javascript">
     document.onkeydown = KeyDownHandler;
     document.onkeyup = KeyUpHandler;

     var SHIFT = false;

     function KeyDownHandler(e) {
         var x = '';
         if (document.all) {
             var evnt = window.event;
             x = evnt.keyCode;
         }
         else {
             x = e.keyCode;
         }
         DetectKeys(x, true);
         ShowReport();
     }
     function KeyUpHandler(e) {
         var x = '';
         if (document.all) {
             var evnt = window.event;
             x = evnt.keyCode;
         }
         else {
             x = e.keyCode;
         }
         DetectKeys(x, false);
         ShowReport();
     }
     function DetectKeys(KeyCode, IsKeyDown) {
         if (KeyCode == '16') {
             SHIFT = IsKeyDown;
         }
         else {
             if (IsKeyDown)
                 CHAR_CODE = KeyCode;
             else
                 CHAR_CODE = -1;
         }
     }
     function ShowReport() {
         var copyLabel = document.getElementById("<%= lblCopyEnabled.ClientID %>");
         if (SHIFT) {
             copyLabel.style.display = "inline";
             ob_copyOnNodeDrop = true;
         }
         else {
             copyLabel.style.display = "none";
             ob_copyOnNodeDrop = false;
         }
         
     }
</script>

</form>

最佳答案

我不确定为什么您的代码会失败,因为您没有包含拖放代码,但是有一种更简单的方法可以完成您想要的操作。对于浏览器触发的任何事件,您可以访问 shiftKey 属性,如果按下 shift 键,该属性将为真:

window.onmousemove = checkShift;

function checkShift(e)
{
  if (!e) var e = window.event;
  if (e.shiftKey)
  {
    ....Copy....
  }
  else
  {
    ....Move....
  }
}

关于javascript - 绑定(bind) Javascript 按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4250463/

相关文章:

javascript - 链接多个 jquery 事件而不使用回调

c# - 将所选值从下拉列表转换为 int

.net - 回发数据和 View 状态数据有什么区别

javascript - ExtJs 6.0 - Ext.application 内的 Javascript 事件处理函数作用域

javascript - 我正在尝试使用 angularjs 切换表格单元格中的值...我可以使用 ngbind 或 ngmodel 或其他东西吗?

javascript - D3.js 代码不适用于基于数据创建圈子

javascript - 为什么我的函数无法返回具有特定文本内容的元素?

css - 将 Z-Index 应用于 DropDownTree 不会影响它

javascript - 如何在函数运行后等待一段时间

javascript - 如何在 JavaScript 中实现原子操作(并发模型)?