11548 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bon, je donne ma langue au chat.

Voilà mon problème : je cherche à faire du drag & drop à ma sauce, pour une petite application de gestion de galeries. Le but est de pouvoir glisser des photos vers ou depuis une galerie, et vers ou depuis une liste de photos préalablement téléchargées.

Voilà mon petit bout de code : Essai de glisser/déposer de photos. Pour l'instant seul le glisser fonctionne.

Le problème est que par défaut, le glisser-déposer de photos existe déjà dans les navigateurs, pour la mettre en bookmark, ou pour la copier sur le disque, etc.

Donc quand je glisse une photo depuis mon ptit essai, c'est ce comportement qui se déclenche et qui perturbe le mien.

J'ai réussi à passer outre sur Mozilla en remplaçant les méthodes addEventListener() par des affectations directes aux évenements, mais ça tient plus du hasard que d'une réelle compréhension de la chose.

Opera ne veut rien savoir. Il faut rester une seconde immobile en gardant le bouton de la souris enfoncé avant de bouger pour que ça marche.

Quant à IE, ça ne fonctionne pas du tout avec, c'est normal, je ne me suis pas encore occupé de lui. Smiley cligne

Je sais que c'est possible parce que Tim Taylor y est parvenu, mais son code m'est quelque peu illisible. Smiley biggol

Donc si vous aviez des idées pour m'éclairer un peu, je vous en serais reconnaissant; Je suppose que c'est lié à la propagation des évenements, mais je ne vois pas directement en quoi.
Modifié par Lanza (28 Sep 2005 - 09:46)
Je ne comprend pas vraiment ou est le problème Smiley ohwell

Mais moi, je base tout mes developpement js, sur la librairie prototype, et surtout de son extension script.aculo.us la librairie prototype permet de faire pleins de choses sans se soucier du navigateur, et script.aculo.us etend cette librairie pour faire des choses dynamiques et ceci d'une simplicité extreme.


Regarde cette exemple : http://wiki.script.aculo.us/scriptaculous/show/GhostlySortableDemo

Et en une ligne tu auras résolu ton problème Smiley smile


PS : attention en goutant à ces 2 librairies on en devient trés vite dependant Smiley langue
Merci, mais non. Smiley cligne

Des libs qui font ce genre de choses il en traîne 3 ou 4 sur le web et j'en ai déjà utilisée une dans un cadre professionnel, mais là j'essaie de me faire plaisir et de comprendre ce que je fais.

Le problème est qu'avec Opera on a l'impression que ça marche, mais c'est en fait le comportement par défaut d'Opera qui se déclenche, pas le mien. Smiley lol
ok Smiley smile

perso, j'aime bien réinventer la roue, mais j'ai compris que ca ne servait pas à grand chose.

Mais je te comprend tout à fait quand meme.


Le problème reste que je ne comprend pas ton problème Smiley decu

il apparait sous quels navigateurs ? seulement sous opera ? car je ne vois pas de tel fonctionnalité sur FF ni IE. quand je selectionne une image (par exemple les smileys) rien ne se passe Smiley ohwell t'es sur que ce n'etait pas déja ton code ?

La je pige pas du tout Smiley decu [ou alors je suis bete :d]


Sinon : un autre petit conseil si je peux me permettre, on m'a donné un jour un petit conseil tout con au sujet de la compatibilité :

a écrit :
Si tu veux etre compatible partout, utilise des choses que tout le monde comprend


J'ai mis du temps à bien comprendre, mais ca veut dire qu'il faut que le code fonctionne de la même facon quelque soit le navigateur, si ca ne marche pas pour IE : ca ne marche pas du tout ! (et reciproque bien sur) il faut eviter un maximum d'ecrire du code pour IE d'un coté et l'autre pour FF.

Depuis que j'ai bien compris ceci, je n'ai plus aucun soucis de compatibilité Smiley murf
Bon, alors...

Je m'ai probablement mal exprimé, mais c'est pas facile à expliquer. Smiley biggol

Tout d'abord, c'est un travail en cours, voire même un brouillon, ce qui fait qu'un certain nombre de choses sont faites sans se préoccuper de savoir si IE peut comprendre ou non. Ça c'est l'étape suivante Smiley smile J'utiliserai des moyens plus compatibles, mais moins standards (et moins puissants). Je tiens même à ce que ce soit non obstrusif, mais là n'est pas le sujet Smiley cligne

Donc le problème actuellement ne se déclare plus qu'avec Opera, effectivement. Sauf que je n'ai pas encore essayé Safari, ni Konqueror et encore moins IE/mac. Ça viendra par la suite.

En fait, Firefox et IE ont bien le comportement que je décris : même si on ne voit pas l'image transparente pendant le déplacement, tu peux glisser lâcher (par exemple une icône) dans les bookmarks ou sur le bureau, par exemple. Et ça interfère avec mon script dans Opera.

J'ai mis à jour ma page. Tu peux maintenant activer/désactiver le comportement par défaut de Gecko avec la checkbox, c'est plus parlant qu'un long discours.

(rappel de l'url : http://lanza.online.fr/Gapsule/try.html).

Depuis ce matin j'ai trouvé une autre façon de faire comprendre à Gecko que je ne voulais pas qu'il active son comportement par défaut : la méthode "event.preventDefault()"

Quant à réinventer la roue, j'aime bien aussi, mais surtout je vais avoir besoin de choses qui ne sont pas dans les libraries que je connais, et donc il me faut soit les modifier (sans comprendre comment elles marchent c'est casse-g...), soit réécrire et du même coup comprendre comment ça marche Smiley smile

a écrit :
Si tu veux etre compatible partout, utilise des choses que tout le monde comprend


J'avais bien compris ça aussi, merci Smiley smile

Je te remercie de ta réponse, et je continue mes expérimentations.
Modifié par Lanza (25 Sep 2005 - 20:48)
Alors aprés m'être bien plongé dans ton script j'ai compris ton problème Smiley smile

et je ne voit pas vraiment de solution, donc je suis allé voir dans le framework que j'utilise et voici ce qu'ils ont (en gros)



  stop: function(event) {
    if (event.preventDefault) { 
      event.preventDefault(); 
      event.stopPropagation(); 
    } else {
      event.returnValue = false;
    }



  startDrag: function(event) {
    if(Event.isLeftClick(event)) {
     //blablabla
      Event.stop(event);
    }


j'ai pas testé si dans ton cas ca allé marcher mais je pense que oui Smiley smile
J'ai trouvé une solution !

Le problème de ce code :

stop: function(event) {
if (event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
event.returnValue = false;
}


c'est qu'il marche bien dans Mozilla, mais pas dans Opera, justement.

Le couac viendrait du fait je déplace des <li> qui contiennent des images. Donc je choppe l'évènement sur le <li>, et pas sur l'image.

J'ai donc intercepté l'évènement également sur l'image, et ça fonctionne sur Opera. Il suffit apparement d'ajouter un gestionnaire pour l'évènement "onmousedown" de l'image, même vide, pour que ça désactive le comportement par défaut.

J'essaie maintenant de voir si on peut jouer avec les modes de propagation (capture et bubble) pour éviter d'avoir à rajouter systèmatiquement ce gestionnaire.

Quand j'aurai bien tout compris, j'essaierais de faire un petit topo quelque part, parce que c'est un problème assez interessant.

Merci CyrilCS et chmel de vous être penchés sur mon problème.
Modifié par Lanza (26 Sep 2005 - 13:50)
Effectivement j'avais pas pensé à ce problème Smiley smile

Ensuite ce que tu dis avec le bubble etc... j'ai aussi pas mal de problème avec tout ca.

Ce que je peux quand meme te dire, c'est que si par exemple tu as ce code.


<div id="div1">
<div id="div2">click</div>
</div>


Lorsqu'on clique sur le texte, sur IE ou NS le premier evenement click à être declenché et div1 puis div2 puis document etc... bien sur, sur l'autre navigateur c'est le contraire Smiley lol

Donc pour mettre tout le monde d'accord, le W3C a mis au point la méthode

addEventListener( "mousedown", startDrag, true );

le premier paramètre est le nom de l'event, le deuxieme, le delegate de la fonction, et le 3eme et le mode de propagation, soit on capture l'event lorsqu'il descend soit lorsqu'il remonte .... donc essaye de changer ca pour voir ce que ca fait.

J'avais lu un article interressant la dessus : http://www.quirksmode.org/js/events_order.html (ouf google est un trés bon ami Smiley cligne )

mais aussi : http://www.w3.org/TR/DOM-Level-2-Events/events.html


Mais je suis quand meme interessé par le suite Smiley cligne
Modifié par CyrilCS (26 Sep 2005 - 19:29)
On a les mêmes sources d'informations Smiley langue

J'avais essayé de changer, ça ne marchait pas plus.

Dans l'idéal il faudrait que je capture l'évenement lorsqu'il arrive à mon li et avant qu'il n'atteigne l'image, lui dire de prévenir l'action par défaut, mais Opera semble ne pas garder les modifications de l'évènement (en l'occurence preventDefault() ) lorsqu'il les transmet à l'image.

Je continuerai mes expérimentations en ce sens, probablement ce soir.
Je fais une mise à jour pour signaler un problème. Je viens de l'essayer sur Konqueror et ça marche pas. Smiley biggol

En fait ça marche si on essaye de déplacer en plaçant le curseur sur les marges du <li>, mais si on la place sur l'image, vu qu'il y a un gestionnaire vide pour Opera, ben il se passe rien. Smiley lol

Je le savais que c'était pas la bonne solution.

Bon j'y retourne ce soir et je vous tiens au courant.
Bonjour lanza, j'ai le mème problème avec Opéra. Connais-tu le script de
Walterzone Il fonctionne très bien sur Opéra, si tu trouve la solution est qu'elle est simple ça m'interesse aussi Smiley biggrin
rofll y'a un endroit ou on peut voir ce que tu as écrit ?

Sinon vu que tu as testé sous Konqueror tu pourrais me dire si ca fonctionne http://wiki.script.aculo.us/scriptaculous/show/SortableFloatsDemo

car j'utilise abondamment cette lib, et j'ai jamais réussit à installer linux Smiley confused

Et sinon je pense pas que de rajouter une function vide soit la meilleure des solution

il doit y avoir une fonction StopPropagation, mais c'est tout ce que je sais Smiley decu faudrais vraiment que j'appronfondisse tout ca Smiley smile
CyrilCS a écrit :
rofll y'a un endroit ou on peut voir ce que tu as écrit ?

Sinon vu que tu as testé sous Konqueror tu pourrais me dire si ca fonctionne http://wiki.script.aculo.us/scriptaculous/show/SortableFloatsDemo


Il faudra attendre que je rentre chez moi. Smiley cligne

a écrit :

car j'utilise abondamment cette lib, et j'ai jamais réussit à installer linux Smiley confused


J'ai installé ubuntu et ça marche tout seul, donc youpi Smiley smile
Dans la 5.10 y'a un menu "add application" (le seul qui ne soit pas traduit) et dedans j'ai coché Konqueror et pouf, ça me l'a installé tout seul. Alors ben, j'ai testé Smiley lol

a écrit :

Et sinon je pense pas que de rajouter une function vide soit la meilleure des solution


Tout à fait d'accord, c'est une bidouille.

a écrit :

il doit y avoir une fonction StopPropagation, mais c'est tout ce que je sais Smiley decu faudrais vraiment que j'appronfondisse tout ca Smiley smile

Le stopPropagation() arrête la propagation, mais dans le cas où l'évènement est attrapé en mode "capture", il continue tout de même à être propagé jusqu'à l'élément "cible", donc en l'occurrence mon image.
Modifié par Lanza (28 Sep 2005 - 18:50)
Arf t'as l'air de t'être bien renseigné sur les events, en tout cas mieux que moi Smiley biggol Je sais pas si je vais t'être utile alors mais ca m'interesse Smiley smile


donc en résumé, le but du jeu c'est d'arriver à stopper un event avant qu'il atteigne l'image ?

ca a l'air d'etre le role de e.preventDefault qui n'est pas reconnu sous konqueror ?

d'aprés ce que j'ai vu, pour annuler la propagation d'un event, il faut que e.cancelable == true puis appeller e.preventDefault()


si tu fais un

for (var i = 0; d = document.images[ i ]; i++)
{
d.onclick = function(){};
}

est-ce que si tu cliques sur l'images ca ne fait plus rien (j'ai pas testé)
Modifié par CyrilCS (28 Sep 2005 - 19:37)
Lanza a écrit :
Donc, pour répondre à ton précédent message, j'ai mis à jour http://lanza.online.fr/Gapsule/try.html avec la version bidouille qui fonctionne sur Opera.

Salut Lanza, je n'ai pas vu ce qui fonctionne sur Opéra. Si je sélectionne une image, je la retrouve dans une nouvelle page ?

Contrairement à ce que tu annonces, le script de Tim Taylor ne désactive pas la sélection sur Opéra (7.23win):
Si tu déplaces un objet plus bas dans la page démo, le texte est sélectionné aussi.
Par contre, dans le script plus ancien de Walkerzone, ce n'est pas propre mais ça marche, avec une bidouille me semble-t'il :
ligne 1296, un div contenant un formulaire et un input est créé :
	if (dd.n4 || dd.n6 || dd.ie || dd.op || dd.w3c) document.write(
		(dd.n4? '<div style="position:absolute;"><\/div>\n'
		: dd.op? '<div id="OpBlUr" style="position:absolute;visibility:hidden;width:0px;height:0px;"><form><input type="text" style="width:0px;height:0px;"><\/form><\/div>'
		: '') + d_htm
	);

dd.op semble être l'objet en cours de déplacement chez Opéra
Un peu plus haut dans le code, il est fait un focus puis blur sur l'input, bizare :
ligne 1121
			if (dd.op)
			{
				(d_o = document.getElementById('OpBlUr')).style.pixelLeft = dd.e.x;
				d_o.style.pixelTop = dd.e.y;
				(d_o = d_o.children[0].children[0]).focus();
				d_o.blur();
			}


Mais je suis peut-être à côté de la plaque Smiley lol
La séléction du texte, ça j'ai réussi à la désactiver avec un appel à preventDefault() sur l'évènement.

Tu retrouve ton image dans une nouvelle page ??

C'est agaçant d'avoir du mal à expliquer ce qui se passe, faut dire que c'est pas évident évident, j'ai moi même mis du temps à comprendre, alors que c'est mon script.

Je vais regarder ton bout de code avec le focus et le blur. Mais ça m'a l'air d'une bidouille aussi.

Edit:
Je crois bien que j'ai trouvé. Tim Taylor fait une chose interessante :


		if (event.target) {
			if (event.target.nodeType == 3) event.target = event.target.parentNode
		} else if (event.srcElement) {
			event.target = event.srcElement
		}


En gros il change la target de l'évenement pour la déplacer sur son parent, si c'est noeud texte. J'aurais juré que cette propriété était en lecture seule.
Modifié par Lanza (29 Sep 2005 - 09:57)
Salut
Lanza a écrit :
La séléction du texte, ça j'ai réussi à la désactiver avec un appel à preventDefault() sur l'évènement.

Je demande à voir un exemple qui marche sur Opéra Smiley cligne


Edit:
Je crois bien que j'ai trouvé. Tim Taylor fait une chose interessante :


		if (event.target) {
			if (event.target.nodeType == 3) event.target = event.target.parentNode
		} else if (event.srcElement) {
			event.target = event.srcElement
		}


C'est bien connu le coups du noeud #text chez Gecko mais pas IE
Pages :