[Javascript] Firefox <-> Internet Explorer

Résolu/Fermé
crewstyle - 3 mars 2007 à 22:49
 Aide - 22 avril 2010 à 10:45
Bonsoir,

Etant en train de développer une application pour une entreprise assez conséquente, je me retrouve confronter à un problème qui est de taille.
En effet, dans certains cas (comme celui-ci), la question de compatibilité avec les navigateurs ne se pose même pas.
Malheureusement, je me retrouve face à ce problème : 3 fonctions javascript développées (et du même type) fonctionnent très bien sous Firefox, mais pas sous Internet Explorer.
Ces 3 fonctions permettent un dynamisme différent d'une page.

J'aimerai donc que vous m'aidiez à "traduire" une de ces fonctions afin qu'elle soit compatible sous IE (et tous les autres navigateurs si possible). Pour les 2 autres, je me débrouillerai une fois le chemin sous la lumière :)
(j'ai lu quelque part qu'il suffisait de détecter le navigateur et d'agir en conséquence ...)

Bref, voici :
/* -------------------------------------------------------------------------------------- */
/* ---------------------------------- check_line ------------------------------------ */
/* -------------------------------------------------------------------------------------- */
function check_line(line_id, step_id, form)
{
	if( document.getElementById(line_id) != null )
	{
		var status = document.getElementById(step_id).checked;
		var nb_element = document.getElementById(form).elements[line_id].length;

		if( nb_element == undefined )
		{
			document.getElementById(form).elements[line_id].checked = status;
		}
		else
		{
			for (i = 0; i < nb_element; i++)
			{
				document.getElementById(form).elements[line_id][i].checked = status;
			}
		}
	}
}


D'après moi, ce sont les "elements[line_id]" qui ne fonctionnent pas.

Merci d'avance à ceux qui pourront passer un peu de temps sur mon problème.
A voir également:

5 réponses

Bonsoir à toutes et à tous,

Je me permets de relancer le sujet car c'est assez important (comme pour tous).
D'autant plus que votre vas me permettre d'avancer le reste des fonctions.

Cordialement,
crewstyle.
3
Bien le bonsoir,

Même si la tâche paraissait infranchissable, j'ai tout de même réussi à franchir le cap et à rendre cette fonction compatible avec Internet Explorer et Netscape Navigator.

Pour ceux qui sont tombés sur ce même genre de problème, je vous mets la même fonction modifiée pour la compatibilité :

/* -------------------------------------------------------------------------------------- */
/* ---------------------------------- check_line ------------------------------------ */
/* -------------------------------------------------------------------------------------- */
function check_line(line_id, step_id, form)
{
	if( document.getElementById(line_id) != null )
	{
		var nb_element = document.getElementById(form).elements[line_id].length;
		var status = document.getElementById(form).elements[step_id].checked;

		if( nb_element == undefined )
		{
			document.getElementById(line_id).checked = status;
		}
		else
		{
			for (i = 0; i < nb_element; i++)
			{
				document.getElementById(form).elements[line_id][i].checked = status;
			}
		}
	}
}


Nouveau but : rendre cette foncion compatible avec Opera :P
Bonsoir ;)
3
Meme genre de souci, j'aimerai rendre cette fonction compatible avec firefox, mais je ne sais strictement rien sur les méthodes employées pour traiter ce genre de problème ... si quelqu'un a un bon lien ou peux me mettre sur la piste de n'importe quelle manière je l'en remercie d'avance ;)

[code]
function getElementsById(sId)
{
var outArray = new Array();
if(typeof(sId)!='string' || !sId)
{
return outArray;
};

if(document.evaluate)
{
var xpathString = "//*[@id='" + sId.toString() + "']"
var xpathResult = document.evaluate(xpathString, document, null, 0, null);
while ((outArray[outArray.length] = xpathResult.iterateNext())) { }
outArray.pop();
}
else if(document.all)
{

for(var i=0,j=document.all[sId].length;i<j;i+=1){
outArray[i] = document.all[sId][i];}

}else if(document.getElementsByTagName)
{

var aEl = document.getElementsByTagName( '*' );
for(var i=0,j=aEl.length;i<j;i+=1){

if(aEl[i].id == sId )
{
outArray.push(aEl[i]);
};
};

};
/code
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
20 mai 2008 à 13:39
Salut,

Je te propose de mettre ces quelques lignes dans le premier script js que tu load dans ta page :
 if(!document.getElementById) document.getElementById=function (id) {
 return eval("document.all."+id);
 }
 if(!document.getElementsByName) document.getElementsByName=function (name) {
 var el=document.all,result=new Array(),j=0;
 for(var i=0;i<el.length;i++) if(el[i].name.toLowerCase()==name.toLowerCase()) result[j++]=el[i];
 return result;
 }
 if(!document.getElementsByTagName) document.getElementsByTagName=function (tagName) {
 var el=document.all,result=new Array(),j=0;
 for(var i=0;i<el.length;i++) if(el[i].tagName.toLowerCase()==tagName.toLowerCase()) result[j++]=el[i];
 return result;
 } 


Cela va te permettre d'uniformiser les fonctions 'getElementById', 'getElementsByName' et 'getElementByTagName' pour IE et FF (et d'autres navigateur mais ce sont les principaux)

Ensuite pour ce qui est du traitement si j'ai bien compris tu veux prendre dans un tableau tous les éléments qui ont un certain identifiant c'est ça ?
Comme les lignes données ci-dessus uniformisent les traitements selon le navigateur, je pense que tu peux garder uniquement le dernier traitement :
var aEl = document.getElementsByTagName( '*' );
for(var i=0,j=aEl.length;i<j;i+=1){

if(aEl[i].id == sId )
{
outArray.push(aEl[i]);
};
}; 


Mais tu veux un code qui marche toujours quelque soit le navigateur, tu peux t'appuyer uniquement sur du javascript DOM comme dans cet exemple :

function getElementsById ( _id_ ){
   var form = document.forms[0];

   // --- Return retrieved elements (can be null)
   if ( form )
   		return elementsRetrieved = getElements(form,_id_);
}

// --- Recursive method to find elements with id equals to the label parameter
// --- in a root element
function getElements ( _obj_, _label_ ){
   var objects = new Array();
   var tmpObjects = null;
   
   // --- Check if current obj has id equals to the label parameter
   // --- If so, add it to the list to return
   if ( _obj_.id != null && _obj_.id == _label_ )
   		objects.push(_obj_);
   
   // --- If current object has children object, roll on these children to search another objects with id equals to the label
   if ( _obj_.childNodes ){
     for ( var i = 0; i < _obj_.childNodes.length; i++ ){
     	// --- Retrieve return element list
     	tmpObjects = getElements(_obj_.childNodes,_label_);
     	// --- If not null, add it to current list to return
     	if ( tmpObjects != null ){
     		for ( var j = 0; j < tmpObjects.length; j++ )
     			objects.push(tmpObjects[j]);
     	}
     }
   }
   // --- Finally return the list of retrieved elements
   return objects;
}


La méthode 'getElementsById' que tu as essayer de mettre en place devrait mieux fonctionner. Je n'ai pas testé le code donc j'ai peut être fait des erreurs de syntaxe, mais logiquement ça devrait fonctionner.

Si tu as le moindre soucis tu sais où me trouver.

PS: rien ne t'empêche aussi de compléter la méthode pour qu'elle prenne en paramètre un élément à partir duquel commencer le traitement :
function getElementsById ( _id_, _startElementId_ ){
   var form = document.getElementById(_startElementId_);

   // --- Return retrieved elements (can be null)
   if ( form != null )
   		return elementsRetrieved = getElements(form,_id_);
}


Bon courage pour la suite.
-1
a priori la fonction en question a déjà été prévu pour 3 navigateurs différents, puisque la meme action y est présente sous 3 conditions/comportements différentes. Par intuition je dirai que firefox ie et opera fonctionne très bien avec cette fonction.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Même ma réponse est un peu retardée, les autres personnes qui utilise [/ CCM] ils peuvent les utiliser après.

Je pense que l'erreur sur erreur devient de l'attribut checked.

Sur IE : on doit avoir <input type="checkbox" checked="checked"/>
Sur FF : il suffit de mettre <input type="checkbox" "checked" />

Donc, il faut mettre la première qui est acceptée par les deux navigateurs.

Sur Javascript on doit mettre :
ch.setAttribute('checked','checked');

Merci.
0