2010-11-22 9 views
5

Tengo la necesidad de controlar el estado de la tecla Shift, ya sea hacia arriba o hacia abajo. Su propósito es notificar al usuario que mientras la tecla Shift se mantiene presionada, la operación de arrastrar y soltar que están a punto de realizar va a COPY los nodos, y no los moverá.Enlace javascript keypress events

Lo tengo funcionando perfectamente con el siguiente código, sin embargo, si mantengo presionada la tecla Shift y realizo el arrastre y suelte, el gancho ya no existe; la pantalla ya no responde a la pulsación de tecla y permanece en el estado "presionado".

Supongo que hay un problema de orden de operaciones o una pieza faltante. Javascript expers por favor asesorar.

Gracias!

<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> 
+0

¿tiene alguna idea de por qué esto no está funcionando? sospecha de secciones de código que están fallando? 'ex: ¿se llama al KeyUpHandler en algún momento?' podría darte una idea ... –

+1

¿Dónde está la parte de arrastrar y soltar? ¿Qué código está involucrado con * that *? – Pointy

+0

¿Realmente desea copiar cuando se presiona Shift? Por lo general, el sistema copia cuando se presiona Ctrl y se mueve cuando se mantiene presionada la tecla Mayús. Y realmente deberías normalizar la interfaz del evento usando 'e = e || window.event', no busque 'document.all' y suponga que se está ejecutando IE. –

Respuesta

2

No estoy seguro de por qué su código está fallando, ya que no incluyen arrastrar y soltar de código, pero hay una manera más fácil hacer lo que quiera. Para cualquier evento disparado por el navegador, puede acceder a la propiedad shiftKey, que va a ser verdad, si se pulsa la tecla de mayúsculas:

window.onmousemove = checkShift; 

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

Brillante! Funciona perfectamente, sin embargo, solo parece funcionar en Firefox. ¿Alguna sugerencia para hacerlo funcionar en IE7 +? Gracias. –

+0

Edité el código para que funcione en IE también. shiftKey es crossBrowser, es solo cuestión de cablear el evento correctamente y usar window.event vs. attribute. –