La deuxième utilisation du fichier d'entrée ne donne pas lieu à onchange plus
J'ai une photo bouton de téléchargement qui télécharge automatiquement le fichier lorsqu'il est sélectionné à partir de la fenêtre de navigation.
Néanmoins, il ne fonctionne pas la deuxième fois, et c'est parce que l'événement onChange n'est pas déclenché. Pourquoi donc?
Voici un cas d'utilisation:
1. Sur clic du bouton, je l'appelle uploadMessagePicture(), qui ouvre la fenêtre de navigation.
2. Lorsque l'utilisateur a sélectionné une image, un événement onChange est détectée, ce qui déclenche la ajaxFileUpload() et affiche la photo en zone de l'éditeur.
3. Lorsque le téléchargement est terminé, un aperçu de l'image s'affiche.
4. L'utilisateur supprime l'image en appelant deleteMessageImage() (qui permet également d'effacer les champs et se cache l'éditeur de photos).
5. L'utilisateur tente de télécharger une autre image.
À ce stade, la fenêtre de navigation s'affiche, mais lorsque je sélectionne une image, l'événement onChange n'est pas déclenché si rien ne se passe... (d'ailleurs, il ne semble pas que le nom de fichier est même transféré à l'entrée de valeur de champ.)
Je suis sur Firefox 23.0.1
Voici le code HTML:
<a class="im-photo-btn" href="javascript:;" onclick="javascript:uploadMessagePicture();"><i class="icon-join-photo"></i></a>
<div class="editor-photoarea" id="editor-photoarea" style="display:none;">
<input name="image_message_file" type="hidden" id="image_message_file" value="" />
<div id="image_message_upload">
<input name="image-message" type="file" id="image-message" style="display:none; visibility:hidden;" />
<!-- hide it and trigger it from the photo btn (need both display:none + visibility:hiden for browser compatibility) -->
</div>
<div class="loading" id="image_message_loading" style="display:none;"><img alt="<?php echo $lang["Loading"];?>" src="lib/immedia/img/ajax-loader.gif" /> <?php echo $lang["Loading"];?></div>
<div class="preview" style="display:none;" id="image_message_preview">
<!-- <div>Image preview :</div>
<div id='small_message_msg'></div>
<img src='' />
<div class='btnoptions'>
<a onclick='javascript:deleteMessageImage();' href='javascript:;' class='button' title="Delete photo">
<span class='ui-icon ui-icon-closethick smsg'></span>Delete
</a>
</div>-->
</div>
Ici, c'est le javascript pour télécharger automatiquement l'image
$(document).ready(function (){
$("#image-message").on('change', function () {
$('#editor-photoarea').show();
ajaxFileUploadMessagePicture();
});
});
function uploadMessagePicture(){
//trigger the browse click
if($('#image_message_file').val() == ''){
//let the person upload a file only if none are there
$('#image-message').trigger('click');
}
}
function ajaxFileUploadMessagePicture(){
$("#msg_error_no_image_message").hide();
var imageName = $("#image-message").val();
if(imageName != ''){
$("#image_message_loading").show();
$('#sendBtn').attr('disabled', 'disabled');
$.ajaxFileUpload
(
{
url:siteRegionDir+'lib/immedia/uploadMessagePicture.php',
secureuri:false,
fileElementId:'image-message',
dataType: 'json',
success: function (data, status)
{
updateMessagePicture(data);
},
error: function (data, status, e)
{
alert(e);
}
}
)
}else{
$("#msg_error_no_image_message").show();
}
return false;
}
Ici, c'est le Javascript pour supprimer la photo et effacer les champs
function deleteMessageImage(){
//delete the image
var file = $("#image_message_file").val();
if(file != '') {
$.post(siteRegionDir+'lib/immedia/deleteMessagePicture.php',{filename:file}, function(data) {
clearPictureAttachment();
$('#editor-photoarea').hide();//make sure it is hidden
},"html"
);
}else{
clearPictureAttachment();
$('#editor-photoarea').hide();//make sure it is hidden
}
}
function clearPictureAttachment(){
//var control = $("#image-message");
$("#image-message").attr('value', '');
//control.replaceWith( control = control.clone( true ) );//so it resets it all, truw = keep the bound events
$("#image_message_file").attr('value', '');
$("#image_message_loading").hide();
$("#image_message_upload").show();
$("#image_message_preview").hide();
}
Toute aide serait super! Merci!
OriginalL'auteur ether | 2013-10-28
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous testez votre fonctionnalité avec le même fichier image, encore et encore.
Si vous sélectionnez le même fichier, l'événement onChange de
input[type=file]
ne se déclenchera pas.Différents fichiers avec le même nom ne serait pas le feu de l'événement ainsi. Sélectionnez un autre fichier image - il va se passer.
Pour éviter cela, vous pouvez réinitialiser le formulaire afin de s'assurer que le choix d'un fichier sera effectuée sur une nouvelle
file
contrôleMême nom de fichier différent déclenche onchange. Alors maintenant, nous savons. Pas très pertinent, désolé, mais au moins maintenant nous savons. (Même si la valeur est exactement la même pour les JS.)
Pourriez-vous s'il vous plaît marquer ce que la solution retenue si cela vous a aidé. J'ai édité pour être plus complet.
À me parler? Je ne suis pas le OP.
Désolé pour la réponse si tardive. J'ai effectivement essayé avec une autre image et le problème a persisté.
OriginalL'auteur Sych
Synch est partiellement raison à propos de l'événement onchange qu'il ne se déclenche pas pour les même fichier..Plus précisément onchange dans le cas de l'entrée de type de fichier(scénario évoqué par éther) considère que l'emplacement des fichiers de l'événement de déclenchement.
Cela signifie que soit vous modifiez le nom de fichier ou de son emplacement, ce qui n'est pas droit. Donc, plus logiquement, ce que nous pouvons faire lors de la suppression du fichier de paramètre d'entrée de la valeur de l'attribut à vide("")
Ainsi, l'ajout de cette ligne (à l'intérieur de clearPictureAttachment(), comme par cette question) réinitialise le fichier input type et vous pouvez sélectionner le même fichier image sans aucun problème.
Cheers 🙂
OriginalL'auteur MKP
Grâce à codingrhythm de m'avoir mis sur la bonne voie.
Ce que j'ai fait il suffit d'ajouter le("changement") appeler à nouveau sur le terrain.
Donc j'ai modifié le clearPictureAttachment() fonction (appelée lors de la suppression d'une image):
Merci encore!
OriginalL'auteur ether
@Sync m'a donné l'idée pour résoudre ce problème.
Voici le code de travail, ce que vous devez faire est de copier le fichier d'entrée.
et l'événement sera toujours tiré sur le deuxième temps.
OriginalL'auteur codingrhythm
Angulaire
HTML
TS
OriginalL'auteur Imran Panjwani