jCrop (jQuery) ne parvient parfois pas à charger la zone d'image / de recadrage
J'ai un assez simple problème, mais je n'ai aucune idée sur ce qui est à l'origine du problème. Dans une de mes applications, je suis en utilisant jCrop comme un petit add-on pour recadrer les images pour les adapter à des bannières/headers etc. Ces mesures seront prises:
1) Select an image (using CKFinder for this, CKFinder returns the image path to an input field)
2) Click a button to load the image
3) Crop the image
4) Save the image
dans environ 75% des cas tout se passe selon le plan, cependant le dans 25% des cas jCrop ne parvient pas à charger la zone de rognage et le laisse vide. Voici le code jQuery que j'utilise:
jQuery('#selectimg').live('click', function(e) {
e.preventDefault();
var newsrc = jQuery('#img2').val();
jQuery('#cropbox').attr('src', newsrc);
var jcrop_api = jQuery.Jcrop('#cropbox', {
boxWidth: 700,
boxHeight: 700,
onSelect: updateCoords,
onChange: updateCoords
});
//Some other JS code come's here for buttons (they work all the time)
});
J'ai remarqué que quand j'ai quitté la partie où l' #zones de recadrage est transformd dans un cropable zone, que l'image est en cours de chargement très bien, si l'erreur se situe à la var = jcrop_api
partie, mais je slowsly commencez à penser à ce qu'il n'y a pas de solution pour ce...
C'est ce que j'ai essayé jusqu'à présent:
Faire un div <div id="cropper-box"></div>
et l'utilisation jQuery('#cropper-box').append('<img src="" id="cropbox" />');
et ensuite définir la valeur. J'ai essayé la même chose, mais le réglage de l'image src en 1 étape et non après.
J'ai essayé de mettre un espace réservé sur la page <img src="placeholder.png" id="cropbox" />
et modifier le code source en cliquant sur le bouton. Cela fonctionne, mais le cropperarea reste la taille de l'image (300x180px ou quelque chose) et n'est pas plus grand comme il se doit.
//Edit:
Essayer quelques-uns de plus m'a montré que la source de l'image est remplacée correctement(! l'utilisation de Firefox pour voir la source pour le texte sélectionné), j'ai une double vérification de l'URL, mais ce fut une URL correcte et une image de travail.
À l'endroit où le métayer doit être, il y a un sujet de 10x10 pixels blancs endroit où le métayer icône (signe plus) est popping up.. mais comme dit avant: l'image n'est pas affichée.
//Edit 2:
Donc j'ai pris les sources de la 1ère et de la 2ème essai pour la même image. Comme dit avant de l'essayer d'abord l'image ne se charge pas correctement et le 2ème essai, il n' (uniquement lors de la 2ème essai est la même image(!!)).
Sélectionné la source de la page 1 montre la différence qui est, essayez d'abord:
<img style="position: absolute; width: 0px; height: 0px;" src="http://95.142.175.17/uploads/files/Desert.jpg">
deuxième essai:
<img style="position: absolute; width: 700px; height: 525px;" src="http://95.142.175.17/uploads/files/Desert.jpg">
Je suppose que c'est l'image qui est en train de remplacer par jCrop, mais c'est une complète devinette pourquoi il met 0 hauteur/largeur de la première et de la bonne taille le deuxième temps.
source d'informationauteur Joshua - Pendo
Vous devez vous connecter pour publier un commentaire.
Bon, les gars, au cas où quelqu'un d'autre s'exécute dans ce problème:
jCrop un peu se foiré si les actions de chargement d'une image et d'appliquer jCrop sont mis en file d'attente trop rapide après l'autre. Je trouve toujours étrange que d'une deuxième tentative fonctionne parfaitement, mais je pense que cela a quelque chose à voir avec le cache de l'image dimensions qui sont reconnus par le DOM de la page ou quelque chose.
La solution je suis venu avec était par la création d'une fonction qui convertit les #zones de recadrage dans un jCrop de la zone et de définir ensuite les 2 secondes d'intervalle, juste pour donner jCrop un certain temps à reconnaître l'image et ses dimensions, puis de convertir l'élément.
C'est la partie de code html que j'ai utilisé (avec un preloader):
Comme vous pouvez le voir à la fois les zones de recadrage de l'image et cropper-chargement div sont masqués car ils ne sont pas nécessaires instantanément. Vous pouvez afficher l'espace réservé si vous le voulais bien.. Alors ce formulaire HTML est utilisé:
Dans mon cas, j'ai été en utilisant KCFinder pour charger les images (c'est une partie de CKEditor, vraiment la peine de regarder!), KCFinder gère les téléchargements, renommer etc et après avoir choisi, il renvoie l'image choisie chemin (relatif/absolu est configurable) pour le champ de saisie.
Puis en cliquant #selectimg ce code est appelé:
Au début, je prévenir le lien aussi être suivi comme il le ferait normalement (ou le bouton de action) et après que le chargement de la div s'affiche (c'est ma raison de cacher l'image d'espace réservé, sinon il aurait l'air foiré).
Ensuite, l'emplacement de l'image est chargé à partir du champ de saisie et copié dans un autre (#img), ce champ est utilisé pour traiter l'image par la suite (PHP utilise la valeur de #img pour charger cette image). Aussi, simultanément, le #zones de recadrage src est en cours de mise pour la nouvelle image.
Et voici la partie qui a résolu mon problème:
Au lieu de directement l'activation de jCrop, j'ai fait une fonction qui:
Et après cette fonction, vous pouvez voir que, pour être tranquille, j'ai pris 2 secondes de délai avant le jCrop zone est en cours de conversion.
Espère que cela aide quelqu'un dans le futur!
Salut et merci de penser à @vecteur et qui d'autre l'a fait 😉
La création d'une "Image" de l'objet et de la configuration de l' 'src' attribut ne s'applique pas que vous pouvez traiter l'image comme il avait déjà été chargé.
Aussi, en donnant tous fixe intervalle de délai d'attente ne garantit pas l'image a déjà été chargé.
Au lieu de cela, vous devez mettre en place un 'onload' la fonction de rappel pour l'Image de l'Objet qui sera ensuite initialiser le Jcrop Objet:
Essayer le bord de la bibliothèque sur le repo ici: https://github.com/tapmodo/Jcrop
Cela devrait résoudre votre problème. Les lignes sont modifiées pour résoudre votre problème:
Ne pas appeler cette fonction
onChange : updateCoords
Essayer sans et il sera exécuté en douceur sur les mobiles.
Vous pouvez créer base64 directement et leur montrer qu'une image où vous le souhaitez.
Ici chelou mais fantastique solution:
Je sais que c'est vieux, mais c'était la même chose, au hasard, à mon installer récemment. Trouvé que c'était dû à des images n'étant pas pleine chargée avant de avant de jCrop initialisée.
Tout qu'il a pris pour fixer c'était emballage de la jCrop de l'initialisation de choses à l'intérieur d'un
$(window).on("load", function () { //jcrop stuff here });
Et il a été fonctionne bien depuis.