2010-11-22 7 views
5

Ich habe eine Notwendigkeit, den Zustand der Umschalttaste zu überwachen, ob es nach oben oder unten ist. Sein Zweck besteht darin, den Benutzer darüber zu informieren, dass die Drag-and-Drop-Operation, die sie gerade ausführt, während des Haltens der Umschalttaste den Knoten (COPY) kopiert und nicht bewegt.Binding Javascript Tastenkürzel Ereignisse

Ich habe es funktioniert perfekt mit dem Code unten, aber wenn ich die Umschalttaste gedrückt halten und die Drag & Drop durchführen, ist der Haken nicht mehr vorhanden; Der Bildschirm reagiert nicht mehr auf den Tastendruck und bleibt im "gedrückten" Zustand.

Ich vermute, es gibt entweder eine Reihenfolge der Operationen Problem oder ein fehlendes Stück. Javascript-Experten bitte beraten.

Danke!

<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

Sie haben keine Ahnung, warum dies nicht funktioniert? vermutete Code-Abschnitte, die fehlschlagen? 'ex: Wird der keyUpHandler irgendwann aufgerufen? 'könnte dir eine Idee geben ... –

+1

Wo ist der Drag & Drop Teil? Welcher Code ist mit * dem * verbunden? – Pointy

+0

Möchten Sie wirklich kopieren, wenn Shift gedrückt wird? Normalerweise kopiert das System, wenn Strg gedrückt wird, und bewegt sich, wenn die Umschalttaste gedrückt gehalten wird. Und Sie sollten die Event-Schnittstelle mit 'e = e || wirklich normalisieren window.event', nicht nach 'document.all' suchen und davon ausgehen, dass der IE läuft. –

Antwort

2

ich bin nicht sicher, warum Ihr Code schlägt fehl, da Sie nicht ziehen enthalten waren und Code fallen, aber es ist ein einfacher Weg, was Sie tun wollen. Für jeden Fall durch den Browser gefeuert, können Sie shiftKey Eigenschaft zugreifen, die wahr sein wird, wenn die Shift-Taste gedrückt wird:

window.onmousemove = checkShift; 

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

Brilliant! Funktioniert perfekt, scheint aber nur in FireFox zu funktionieren. Irgendwelche Vorschläge, damit es in IE7 + funktioniert? Vielen Dank. –

+0

Ich habe den Code bearbeitet, um auch in IE zu arbeiten. shiftKey ist crossBrowser, es ist nur eine Frage der korrekten Verdrahtung des Events und der Verwendung von window.event vs. attribute. –