Salut,
Alors là, tu vois, tu viens de me donner LA solution...
mmh... ton tuto... tu as une chose extrêmement intéressante à portée de main depuis le début mais non, tu ne l'as que touché du doigt !
Prenons ta fonction anonyme :
(function() {
function init()
{
document.body.className = jsClassName;
}
var jsClassName = "jsActif";
window.onload = init;
})();
Quel est son principal soucis (qui est d'ailleurs le même que pour mes objets) ?
C'est que si je récupère un script comme suit :
function init()
{
alert('coucou');
}
window.onload = init;
ben, t'as l'un des deux qui plante... car tu n'élimines pas totalement le risque d'interaction avec d'autres bibliothèques... Pourquoi ?
Simplement parce que tu te sers de onload...
Pourtant, le véritable intérêt de ta fonction est justement qu'elle n'a pas d'interface publique DONC si tu es capable de la rendre non intrusive, tu l'élimines bien ce risque...
Voici un exemple concret de comment coder le micmac :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Exemple</title>
<script type="text/javascript">//<![CDATA[
// Biblio 1
( function() {
var fConnect = function(oElem, sEvType, fn, bCapture)
{
oElem.addEventListener ?
oElem.addEventListener(sEvType, fn, bCapture):
oElem.attachEvent ?
oElem.attachEvent('on' + sEvType, fn):
oElem['on' + sEvType] = fn;
};
var fLink = function()
{
var oBouton = document.createElement('a');
oBouton.setAttribute('href','#clic');
var oTxt = document.createTextNode('clique');
oBouton.appendChild(oTxt);
fConnect(oBouton, 'click', fAlert, false);
var oBody = document.getElementsByTagName('body')[0];
oBody.appendChild(oBouton);
var oA = document.getElementById('test');
fConnect(oA, 'click', function(e)
{
alert('çà va ?');
return fCancelClick(e);
}, false);
};
var fCancelClick = function(e)
{
if(e && e.stopPropagation && e.preventDefault)
{
e.stopPropagation();
e.preventDefault();
return false; // Pour Safari
}
else if(window.event && window.event.cancelBubble && window.event.returnValue)
{
window.event.cancelBubble = true;
window.event.returnValue = false;
return false;
}
else return false;
};
var fAlert = function(e)
{
alert('coucou');
return fCancelClick(e);
};
fConnect(window, 'load', fLink, false);
} )();
//Biblio 2
function fLink()
{
var oA = document.getElementById('test');
oA.onclick = function()
{
alert('bien ?');
return false;
};
alert('salut');
}
window.onload = fLink;
//]]></script>
</head>
<body>
<p>Test des fonctions associées au clic :</p>
<a href="#" id="test">test</a>
<p>Insertion d'un lien qui fait coucou avec la fonction anonyme :</p>
</body>
</html>
Ici, ta biblio1 ne craint plus rien et ne dérange pas le code ( tout pourri récupéré d'on ne sait où
) qu'est la biblio2... Le risque d'interaction avec d'autres scripts est bien réduit à néant.
Dès lors, tes réelles contraintes sont de coder proprement quelquesoit les événements et de faire attention au sein de tes propres fonctions... (voir dans la première bibliothèque ci-dessus comment sont déclenchées les actions)
Elle est là la conclusion à laquelle tu dois arriver...
Pour ce qui est du reste, je t'avouerais que la première version me semblait plus accessible aux débutants. En ce moment, certaines des phrases que tu emploies me paraissent un peu âpres à comprendre... Il faut que tu minimises leur longueur en évitant les rallonges... Développe en deux phrases si besoin est mais c'est important d'argumenter de manière concise.
Enfin, pour mieux cerner le pourquoi du comment, je verrais bien un commencement avec une explication complète du fonctionnement des parenthèses... (quand est-ce qu'on doit les employer, quand est-ce qu'on ne le doit pas, ce qu'elles permettent de faire, etc...) car c'est un point obscur pour beaucoup, en particulier lorsqu'on joue avec les événements.
En tout cas, si je ne me suis pas trompé, j'adopte direct cette technique et je déclare ce post sous licence creative !
PS : A ceux qui ont croisé
ce sujet ainsi que celui ici présent, vous n'avez pas fini d'en bouffer de la gestion d'événements.
Bonne nuit !
Modifié par koala64 (14 Nov 2006 - 00:25)