Javascript abgefangen "Strg + O" öffnet das Dialogfeld "Meine Datei" nicht

7

Ich habe eine <input type="file" id="browse-button"/> Datei-Browser-Eingabe in meinem HTML.

Ich habe eine andere Schaltfläche mit der ID choose-file-button , die, wenn sie angeklickt wird, document.getElementById("browse-button").click(); aufruft. Wenn diese Schaltfläche angeklickt wird, klickt es richtig #browse-button und der Dateidialog öffnet sich.

Nun habe ich Code aus dieser Antwort genommen, um einen Ctrl+O keypress abzufangen und meinen Dateidialog zu öffnen, damit ich habe das:

%Vor%

Wie Sie sehen können, wenn ich Ctrl+O abfange, klicke ich auf meine #choose-file-button Schaltfläche, die document.getElementById("browse-button"); in ihrem onclick Handler aufruft. Ich habe in diesem Click-Handler einen Haltepunkt gesetzt, und wenn ich Ctrl+O drücke, erreicht er diesen Haltepunkt. Der Dateidialog wird jedoch nie angezeigt.

Beim Debugging habe ich herausgefunden, dass wenn ich alert(...); nach der #choose-file-button click() -Zeile einfüge, dann erscheint die Warnung und die normale Seite "Open File" -Dialog erscheint (nicht meine Dateidialog). Wenn ich diesen Alarm nicht habe, wird nichts angezeigt.

Ist das ein Fehler? Wie kann ich es beheben und meinen Dateidialog über die abgefangene Ctrl+O ?

anzeigen lassen?

Bearbeiten: Ich habe gerade in Chrome getestet, und es funktioniert perfekt. Es funktioniert jedoch immer noch nicht in Firefox.

    
Jashaszun 24.06.2015, 16:56
quelle

4 Antworten

9

Es gibt einige Browsersicherheitszauber hier. Bei der Verwendung von Timeouts oder Intervallen oder anderen Methoden, die ich versuche, läuft der Code normal weiter, aber der Browser weigert sich einfach, einen Datei-Upload-Dialog zu öffnen. Dies ist wahrscheinlich beabsichtigt, um böswillige JS daran zu hindern, Benutzerdateien ohne Zustimmung zu greifen. Wenn Sie jedoch an ein click -Ereignis für einen Link binden, funktioniert es perfekt mit jQuery oder normalem JS.

Bearbeiten: Wie vermutet, verfolgen die meisten Browser basierend auf dem Typ des Ereignisses und ob es vom Benutzer erstellt oder programmgesteuert generiert wurde, ob ein Ereignis vertrauenswürdig ist oder nicht. Se diese Antwort für die vollständigen Details. Wie Sie sehen können, da Tastaturereignisse nicht in der Liste sind, können sie niemals vertrauenswürdig sein.

Testen Sie JSFiddle

%Vor%

Ich denke, dass es hier nur zwei Optionen gibt, und beide sind Workarounds, keine Lösungen.

  • Eine besteht darin, einen Link zu verwenden, um den Dialog zum Hochladen von Dateien auszulösen, und Leute zu bitten, ALT + UMSCHALT + O anstelle von STRG + O zu verwenden (weil ich ein accesskey Attribut zu dem Link im Beispiel).
  • Die andere Alternative besteht darin, eine der neuen HTML5-JavaScript-APIs für Drag-Drop zu verwenden Hochladen von Dateien .

Nachtrag: Ich habe auch versucht, pures JavaScript in Firefox zu verwenden, um ein Klickereignis zu erfassen und mit der isTrusted -Eigenschaft zu überprüfen, ob es vertrauenswürdig ist. Für die Klicks auf den Link wurde true zurückgegeben. Der Versuch, das Ereignis an einem anderen Ort zu speichern und erneut zu verwenden, funktioniert jedoch nicht, da es bereits gesendet wurde, wenn Sie einen Verweis darauf erhalten. Es ist auch nicht überraschend, dass das Erstellen eines neuen Ereignisses und das Festlegen von isTrusted = true nicht funktioniert, da es schreibgeschützt ist.

    
BoffinbraiN 29.06.2015, 14:46
quelle
4

Browser mappen viele Ctrl + Tastenkürzel um eigene Befehle zu haben, zB STRG + O um eine Datei zu öffnen (in Firefox).

Gleichzeitig verhält sich der Browser anders, wenn Sie versuchen, solche Verknüpfungen in Javascript zu überschreiben. Einige Browser erlauben dies, manche nicht und manchmal kann die Standard-Browseraktion zusammen mit der Aktion Ihres Javascript erscheinen.

Hier ist ein weiterer Thread, der dieses Thema diskutiert.

>

Wahrscheinlich ist das Beste, was Sie tun können, eine andere Abkürzung zu wählen.

    
wero 29.06.2015 15:32
quelle
4

Sie können es mit der Mausefallen-Bibliothek versuchen. Es überschreibt die meisten Probleme, die bei der Schlüsselerfassung auftreten. Offizielle Website und vollständiger Bericht:

Ссылка

Viel Glück

    
Marcos Pérez Gude 30.06.2015 16:10
quelle
1

Sie können das nicht in allen Browsern tun, soweit es mich betrifft nur IE erlauben es. Ich denke, das liegt an Sicherheitsproblemen, so dass der Programmierer den Dateinamen automatisch auf das HTML-Dateielement setzen kann (ohne Erlaubnis des Clients).

werfen Sie einen Blick auf diesen Link für weitere Details:

JavaScript kann ein "Klick" -Ereignis programmgesteuert für ein Dateieingabeelement auslösen?

Eingabedatei-Dialog beim Laden anzeigen?

    
PHP Worm... 03.07.2015 07:58
quelle

Tags und Links