JWhy a écrit a écrit :
essaye de mettre le nom de l'image entre "" dans ton script :
function rien() {document.images["accueil"].src="rubriques/accueil.gif"}
function viseur() {document.images["accueil"].src="rubriques/accueilv.gif"}
|
L'erreur objet attendu vient du fait qu'il n'y a pas d'objet nommé accueil dans le document (que ce soit une variable globale de script, ou un élément dont précisant l'attribut id="accueil" ).
Le script ne marcherait pas non plus tel quel si l'élément <IMG> précisait cet attribut id="accueil". L'attribut name="accueil" d'une image ne crée pas de propriété dans le document au contraire de l'attribut id. Il n'est utilisable que pour indéxer par valeur le tableau images[] qui est une propriété implicite d'un document HTML. Les guillemets sont donc nécessaires.
Par contre si tu écris <IMG id="accueil" ...>, il n'est pas nécessaire d'utiliser en JavaScript (document.images["accueil"].src), mais on peut directement utiliser (document.accueil.src), car l'attribut id de n'importe quel élément HTML4 ajoute la propriété de nom indiqué au document, et l'utilisation de l'attribut name="accueil" devient superflue. Il y a toutefois une différence ici entre IE et Netscape: pour éviter des conflits, les éléments dont l'id est précisé sont tous référencés dans l'objet document.all mais pas forcément dans document, si par exemple cela écrasait une autre propriété vitale du HTML: ainsi si on écrit <IMG id="images"> en HTML, cela ne crée pas une propriété .images dans l'objet document, car cela rendrait inaccessible l'objet document.images qui permet de référencer non pas cette image précise, mais toutes les images du document. Netscape 6 ne fait pas la différence, et rend le tableau document.images inaccessible en Javascript, de sorte qu'alors document.images["images"] déclencherait une erreur.
Aussi il faut toujours éviter d'utiliser dans l'attribut id="nom" d'un élement HTML un nom qui entre en conflit avec une propriété connue de l'objet document. La même remarque est valable pour les noms de variables globales JavaScript qui doivent elles aussi ne pas être déclarées avec un nom homonyme d'une propriété connue de l'objet document: par exemple la déclaration JavaScript "var images;" déclencherait de tels conflits et rendrait là aussi le tableau document.images inaccessible !
De même il faut éviter de répéter l'occurence du même id dans des éléments différents du document.
Certains navigateurs ne vont alors référencer qu'une seule occurence dans l'objet document, et/ou ils vont référencer (comme IE) toutes les occurences dans l'objet document.all, en transformant par exemple document.all.nom en tableau indicé par un index numérique, de sorte qu'on peut accéder à chaque occurence par document.all.nom[0], etc... Ceci a pour effet de trasnformer le type de l'objet document.all.nom qui devient un Array d'éléments au lieu de référencer un élément individuel.
Ainsi IE ne plante pas si on crée une image dans le document HTML avec <IMG id="images">: l'image ne sera pas référencée par document.images, mais aura quand même une entrée dans document.images["images"] ou document.images.images et aussi sera référencée dans document.all par document.all.images.
Pour le cas où deux images on le même id, IE remplace aussi la référence simple document.images.nom à une image par un tableau indicé contenant les références à toutes les images ayant ce nom (c'est le comportement de "collections" décrit dans JavaScript2)
Si on ne précise pas l'attribut name="..." dans un élément <IMG>, l'image est quand même référencée dans le tableau document.images[], mais le comportement concernant l'indice sous lequel il est inséré est variable suivant les navigateurs: l'indice peut être numérique ou bien il peut prendre une valeur nommée ayant la valeur de id).
Sans utiliser id="accueil", tu peux aussi utiliser l'écriture (document.images.accueil.src) car en fait en JavaScript les tableaux sont aussi des objets (et vice-versa), et les noms de propriétés (par exemple ici la propriété .accueil de l'objet document.images) d'un objet sont équivalents aux valeurs d'indices d'un tableau (ici l'indice ["accueil"] du tableau document.images): toutefois la notation avec un point n'est possible que si la propriété a un nom qui soit compatible avec un symbole.
La norme JavaScript interdit en effet d'utiliser le point pour accéder sans guillemets à une propriété dont le nom contient des caractères autres qu'un chiffre, une lettre, ou un soulignement, et qui ne commence pas par une lettre ou un soulignement. Dans de tels cas, a notation indicée avec le nom entre guillements est obligatoire.
Cela ne remet pas en cause l'équivalence Tableau/Objet de JavaScript. En fait en JavaScript, le tableau est plus général que l'objet, car les indices ne sont pas restreints à des chaines de caractères, mais peuvent être numériques ou même un autre type objet en JavaScript 2. En JavaScript 1, il y avait des restrictions, et c'était plutôt l'objet qui était plus générique que le tableau.
A noter toutefois: si on utilise la notation tableau indicé, le seul fait d'affecter une valeur à une position numérique (indice entier) d'un tableau met à jour automatiquement sa propriété length (tableau.length ou tableau["length"] est toujours égal à la valeur maximale plus un, des indices ou propriétés du tableau dont le nom est un entier).
[edit]--Message édité par verdy_p--[/edit]