Ich habe mich bereits umgesehen und kann keine Lösung finden: Ich habe ein Formular zum Hochladen von Dateien, und es sollte die Übermittlung nach der Dateiauswahl auslösen.
Auf FF/Chrome geht es weel, und senden Sie das Formular nach der Dateiauswahl, aber ich kann dies nicht auf dh.
Bereits mit click/propertychange ausprobiert, aber es passiert nichts. Ein Code, den ich bereits ausprobiert habe:
$("#attach").attr("onChange", "alert('I changed')");
$("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { ... });
Irgendwelche Vorschläge, die ich versuche?
Edit1: Ich denke, es gibt eine wichtige Information, diese Eingabedatei wird im laufenden Betrieb erstellt, da ich .live () verwende, um das Ereignis zu binden
Ich weiß, dass dies einige Monate zu spät ist, aber ich habe gerade das gleiche Verhalten in IE7 getroffen. In allen anderen Browsern erfolgt das Änderungsereignis für Dateieingaben nach der Dateiauswahl. In IE7 geschieht dies nur, wenn Sie die Dateiauswahl erneut auslösen oder auf Unschärfe setzen.
So habe ich das Problem behoben:
var $input = $('#your-file-input-element');
var someFunction = function()
{
// what you actually want to do
};
if ($.browser.msie)
{
// IE suspends timeouts until after the file dialog closes
$input.click(function(event)
{
setTimeout(function()
{
if($input.val().length > 0) {
someFunction();
}
}, 0);
});
}
else
{
// All other browsers behave
$input.change(someFunction);
}
Technisch gesehen können/sollten Sie die Hack-Bedingung nur auf IE7 filtern, da IE8 sich beim Änderungsereignis ordnungsgemäß verhält, aber es hat dasselbe Verhalten wie IE7, wenn Timeouts angehalten werden, während browserbezogenes Chrome sichtbar ist ( O), so funktioniert es wie es ist.
Das ist wirklich spät, aber ich hatte das gleiche Problem und ich habe es gelöst, indem ich ein <label>
-Tag mit einem einfachen Problemumgehung für Firefox verwendet habe.
http://jsfiddle.net/djibouti33/uP7A9/
Die Ziele:
Die Browser:
Die Ausgangslösung:
Das Problem:
Die Workaround-Lösung:
Hoffe das hilft! Weitere Informationen zu html/js/css, mit denen alles funktioniert, finden Sie in jsfiddle.
Formatiere es so:
$("#attach").change(function() {
alert('I Changed');
});
Update: Nachdem wir eine andere Frage zu diesem Thema beantwortet hatten, erkannten wir, dass dies im Rahmen des jQuery 1.4.2-Ereignisumschreibens behoben wurde. Aktualisieren Sie einfach die neueste Version um das change
-Ereignisproblem mit <input type="file" />
im IE zu beheben.
Ich habe die folgende Lösung verwendet. Ich habe versucht, es so in sich wie möglich zu machen.
(function($) {
if ($.browser.msie == false)
return;
$('input[type=file]').live('click', function(e) {
var self = this;
var blur = function() {
$(self).blur();
}
setTimeout(blur, 0);
});
})(jQuery);
Dies ist wahrscheinlich ein Problem mit einer Race-Bedingung mit Eingabefeldern im IE. Mit setTimeout wird dann die ausgeführte Funktion registriert, dass eine Änderung stattgefunden hat. Wenn der UI-Code im onChangeEvent ausgeführt wird, wurde dieses Ereignis noch nicht ausgelöst, wie es dem IE erscheint.
Ich habe eine ähnliche Situation gelöst, indem ich in meinem Änderungshandler Folgendes ausgeführt habe:
if (jQuery.browser.msie) { setTimeout(DoSomeUIChange, 0); } else { DoSomeUIChange(); }
DoSomeUIChange wird nach dem aktuellen Code in der Ereigniswarteschlange ausgeführt und entfernt so die Race-Bedingung.
Ich hatte das gleiche Problem mit IE (einschließlich IE 9). Die Logik der Benutzeroberfläche lautet:
div
-Element klicken, wird das click
-Ereignis auf einem file-input-element
ausgelöst, sodass der Benutzer auf ein Dialogfeld mit div
-Trigger-Datei klickt change
an den file-input-element
, um sicherzustellen, dass die form
gesendet wird, wenn das Dialogfeld zum Öffnen der Datei geschlossen wirdDie App (läuft in einem iframe) funktioniert auf Chrome und FF wie ein Zauber. Aber bald stellte sich heraus, dass es bei IE nicht funktioniert, als der Benutzer eine Datei auswählte und den Dialog schloss, den das Formular nicht übermittelte.
Die endgültige Lösung besteht darin, die Logik Nr. 1 "Klicken auf div
element trigger click
event on file input element" zu löschen und den Benutzer direkt auf file input element
klicken zu lassen. Dann funktioniert es.
Übrigens, der Grund, warum wir ein div
-Element haben, ist, dass wir die gerenderten Steuerelemente des Browsers ausblenden möchten, da sich alles im Hintergrundbild befindet. Wenn Sie jedoch display
auf none
setzen, kann das Steuerelement nicht auf ein Benutzerinteraktionsereignis reagieren. Also verschieben wir den file-input-element
außerhalb des View-Ports und verwenden ein div
-Element, um ihn zu ersetzen. Da dies im IE nicht funktioniert, verschieben wir file-input-element
zurück und setzen opacity
auf 0. Unter IE 8 oder kleiner, der opacity
nicht unterstützt, verwenden wir einen Filter, um ihn transparent zu machen:
#browse {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
filter: alpha(opacity=0);
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
}
In IE6 und IE7 hat dies immer für mich funktioniert.
$('#id-of-input-type-file').change(function(){});
Ich habe diese Lösung gefundenIn HTML-Dateielement ausblenden (Anzeige nicht verwenden: keine, funktioniert nicht im IE).
<div style="width: 0px; height: 0px; overflow: hidden;">
<input id="ifile_template" type="file" onchange="this.focus(); this.blur();"/>
</div>
In Javascript für IE bind die Funktion zum Verwischen und für FF die CH-Bindungsänderung ():
$(iFile).blur(
function () {
...some code...
}
);
// FF, CH
$(iFile).change(
function () {
...some code...
}
);
In IE funktioniert das onchange-Ereignis einwandfrei, wenn es direkt im html-Tag ausgefüllt wird. Mögen:
<input type="file" onchange="uploader.upload()" />
Für IE Sie können das "onfocus" -Ereignis verwenden, um die Änderung beim Hochladen der Datei abzufangen. Sobald das Dialogfeld zum Durchsuchen von Dateien geschlossen wird, wird das Ereignis onfocus ausgelöst. Sie können dies überprüfen, indem Sie diese Zeile zu Ihrer Seite hinzufügen:
<input type="file" onfocus="javascript:alert('test');" />
Sobald der Dialog geschlossen ist, wird die Warnmeldung angezeigt.
Diese Lösung ist nur für IE, nicht für FF oder Chrome.
Meine Lösung:
setInterval(function()
{
if ($.browser.msie) $("input[type=file]").blur();
},500);
Nicht hübsch, aber es funktioniert. ; D
Schauen Sie sich diese Geige an http://jsfiddle.net/uP7A9/531/
HTML:
<input type="file" name="PicturePath" id="fileUpload" accept=".png,.jpg,.jpeg,.gif,.tif" />
jQuery:
$("input[type=file]#fileUpload").on("change", function () {
alert('hi')
});
es funktioniert für alle getesteten Browser.
Ich kann zumindest bestätigen, dass es nur dann funktioniert, wenn ein Unschärfeereignis auftritt, ähnlich einem Radio und einem Kontrollkästchen im IE. Ich werde wahrscheinlich ein visuelles Element hinzufügen müssen, das der Benutzer anklicken und mir mitteilen kann, wann er seine Datei ausgewählt hat.
lame.
$("#attach").attr("onChange", "alert('I changed')");
Es funktioniert im IE, aber wenn Sie das Verhalten "live" emulieren möchten, sollten Sie bei der Erstellung jedes neuen Elements das Attribut "onChange" hinzufügen.
jQuery scheint das Ereignis propertychange
nicht zu erkennen. Ich habe es dem DOM-Knoten mit den attachEvent()
des IE hinzugefügt.
var userChoseFile = function($input) {
// ...
}
var $input = $(/* your file input */);
$input[0].attachEvent('onpropertychange', function() {
userChoseFile($input);
});