11548 sujets

JavaScript, DOM et API Web HTML5

Bonsoir, je suis en train de faire un petit script de redimensionnement en javascript. Le principe est simple : quand on clic (onmousdown) il commence à scruter les mouvements du pointeur (onmousemove) et redimensionne l'objet en conséquence.

Seulement voilà, quand je clic, s'il s'agit de texte il continue à me sélectionner le texte, ce qui n'est pas terrible, et quand il s'agit d'une image, il essaye de me faire son drag'n drop à lui (pour enregistrer l'image je crois) et ça fait tout planter.

En cherchant un peu j'ai trouvé cet article dans lequel on lit :
a écrit :
Finally drag handler returns false. This is hugely important! By returning false you tell the browser that you are handling the event and not to follow through with its own default behavior. If you don't return false and you try to drag an image it's not going to work because the default behavior of the browser is that if a user drags an image, he wants to drag it to his desktop or a to a desktop application and that will over-ride the behavior YOU are setting up. When you return false the browser will bow to your wishes.

Tout content, j'ajoute un "return false;" à la fin de ma fonction, mais rien n'y fait, le navigateur ne se plie pas du tout à mes désirs ^^;

voici donc une demo, et mon code :

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
#conteneur {background-color: #DDD;}
.poignee {cursor:n-resize;}
</style>

<script type="text/javascript">
//<!--   
function resize(e) {

	y = e.clientY;
	document.getElementById("monimage").style.height = y-15 + "px";
	return false;
	}



function drag(){
	document.onmousemove = resize;
	document.onmouseup= drop;
	return false;
}

function drop(){
	document.onmousemove = null;
	document.onmouseup= null;
}
//-->  
</script> 
</head>



<body>

<div id="conteneur">
<img id="monimage" src="big_smile.png" alt=":D" /><br />
<span onmousedown="javascript:drag()" class="poignee">drag me </span> <img class="poignee" src="poignee.png" alt="" onmousedown="javascript:drag()" />
</div>
On peut voir ici que lorsqu'on redimensionne en cliquant sur le texte, il reste possible de sélectionner le texte. Pire lorsqu'on redimensionne en cliquant sur l'image, le navigateur essaye de faire du drag'n drop avec l'image pour la copier, et ça fait tout planter.
</body>



PS : code html crade qui valide pas, javascript pas externalisé, tout ça tout ça, je sais, c'était pas ma priorité j'ai fait ça en 30 sec pour vous montrer le problème.
Modifié par BlueScreenJunky (04 Jun 2007 - 22:37)
essai ceci :

<script type="text/javascript">
   document.body.oncontextmenu = function(){return false;}
</script>


A+
Merci, mais c'est pas plutôt pour bloquer le clic droit ça ?


ps : en fait j'ai trouvé un début de solution, pour l'instant ça marche mais c'est trop crade pour que je le poste (avec des setTimeout et tout lol Smiley lol )
Modifié par BlueScreenJunky (04 Jun 2007 - 22:19)
pourquoi réinventer la roue?
des librairies javascript existe pour ca : prototype, mootools, etc...
bprod a écrit :
pourquoi réinventer la roue?
des librairies javascript existe pour ca : prototype, mootools, etc...

Pourquoi utiliser des librairies pour alourdir un site web quand on peut coder ça en 15 lignes ?
Modérateur
Salut,

@bprod :

Si on a déjà une librairie, autant l'exploiter oui parce qu'elles sont en général prévues pour maximiser la compatibilité. En revanche, la conseiller d'entrée de jeu, c'est une erreur.

A titre d'exemple, jQuery n'inclus pas le rafraichissement automatique d'un conteneur il me semble et j'ai vu quelqu'un dire : "ben passe par prototype !"
Ben voyons... comme ça, on se retrouve avec deux bibliothèques alors qu'il ne s'agit que de mettre un setTimeout en place... C'est fou ce qu'on oublie comment se servir de Javascript à avoir des codes tout fait. Smiley ravi

Pourquoi réinventer la roue ? ... pour en comprendre le fonctionnement et savoir agir sur le moindre des composants en cas de problème. Rien ne vaut un code qu'on connait parfaitement ; cette dernière solution est celle qui devrait être tentée en premier lieu parce que se servir d'une bibliothèque sans connaître les bases, c'est faire de la soupe. Smiley cligne
Modifié par koala64 (05 Jun 2007 - 09:33)
Gatsu35 a écrit :

Pourquoi utiliser des librairies pour alourdir un site web quand on peut coder ça en 15 lignes ?

Pour etre sûr que ca fonctionne Smiley biggrin ,
gagner du temps, on peut très bien isoler la fonction pour alléger,
comprendre comment ca fonctionne et assurer la pérénité du code.
Bref que d'avantage, après chacun sa m***de, si vous préférez galérer à réécrire des choses qui fonctionnent parfaitement pour que ca ne marche pas et se prendre le chou dessus 3 jours...
EDIT : houla en me relisant, ca pue le troll, alors OUI je comprend votre point de vue, mais étant une bille en javascript j'opte pour la facilité ! Smiley ohwell
Modifié par bprod (05 Jun 2007 - 09:38)
Modérateur
a écrit :
Pour etre sûr que ca fonctionne Smiley biggrin ,
Prend 15 navigateurs différents et constate. Smiley cligne

Croire que les bibliothèques sont parfaites est bien mal les connaître. Très souvent, c'est compatible sur les navigateurs les plus courants, de préférence sur Windows. Tout dépend de tes besoins (ou des exigences du client).

a écrit :
je comprend votre point de vue, mais étant une bille en javascript j'opte pour la facilité ! Smiley ohwell
C'est le problème de 2 utilisateurs sur 3... génération mac do' qu'on appelle ça. Smiley lol (sous-entendu : je veux tout tout de suite...)

PS : Attention, l'obésité est le mal du siècle.
bprod a écrit :
pourquoi réinventer la roue?
des librairies javascript existe pour ca : prototype, mootools, etc...


Pour la même raison que je fais du php, du xhtml et du CSS : Parceque ça m'intéresse de comprendre comment ça fonctionne.
Sinon je me prendrais pas la tête hein, je prendrais un CMS tout fait.

Bon, en tout cas j'ai résolu mon problème, en fait on ne peut empecher le comportement par défaut du navigateur qu'en utilisant un "document.onmousedown = fonction" où fonction retourne "false", ce qui oblige ensuite à récupérer l'id (par exemple) de l'objet sur lequel on a cliqué pour vérifier si oui ou non on doit démarrer la fonction de drag'n drop.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>redimensionneur javascript</title>
<style type="text/css">
#conteneur {background-color: #DDD;}
#monimage {height: 30;}
.poignee {cursor:n-resize;}
</style>

<script type="text/javascript">
//<!-- 
var y_origine = 0;
var height_origine = 0;


function resize(e) {
	y = e.clientY;
	document.getElementById("monimage").style.height = height_origine+y-y_origine + "px";
	return false;
}


function drag(e){
	if (e.target.className == "poignee"){
		y_origine = e.clientY;
		height_origine = document.getElementById("monimage").height;
		document.onmousemove = resize;
		document.onmouseup= drop;
		return false;
	}
}

function drop(){
	document.onmousemove = null;
	document.onmouseup= null;
}

document.onmousedown = drag;
//-->  
</script> 
</head>



<body>
<div id="conteneur">
<img id="monimage" src="big_smile.png" alt=":D" /><br />
<span class="poignee">drag me </span> <img class="poignee" src="poignee.png" alt="" />
</div>
</body>
</html>


Vala, si ça peut servir à quelqu'un.