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:
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
?
Bearbeiten: Ich habe gerade in Chrome getestet, und es funktioniert perfekt. Es funktioniert jedoch immer noch nicht in Firefox.
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.
%Vor%Ich denke, dass es hier nur zwei Optionen gibt, und beide sind Workarounds, keine Lösungen.
accesskey
Attribut zu dem Link im Beispiel). 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.
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.
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
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?
Tags und Links javascript html jquery dialog