Rechercher : dans
Par :

[Javascript] Firefox <-> Internet Explorer

Dernière réponse le 20 mai 2008 à 13:41:22 crewstyle, le 3 mar 2007 à 22:49:49 
 Signaler ce message aux modérateurs

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.
Configuration: Windows XP
Internet Explorer 7.0
Mozilla FireFox

Meilleures réponses pour « [Javascript] Firefox < > Internet Explorer » dans :
Réinstaller Internet Explorer VoirLorsque vous essayez de réinstaller Internet Explorer, Windows vous affiche un des messages d'erreur suivants : Le programme d'installation a détecté une version plus récente de Internet Explorer, déjà installée sur votre ordinateur. ou Le programme...
Installer Internet Explorer 7 sur XP SP3 VoirInternet Explorer 7 (IE7) ne s'installe pas quand le Service Pack 3 (SP3) est installé. Il est donc préférable d'installer le SP3 après IE7. Si le SP3 est dejà installé, voici la modification qu'il faut faire: Menu Démarrer > Exécuter >...
Télécharger Internet Explorer VoirInternet Explorer 8 (version finale) est la dernière version du navigateur de Microsoft. Avec Internet Explorer 8, l’accent est mis sur : La compréhension des vrais usages du navigateur web tel que nous l’utilisons aujourd’hui au quotidien, et...

1

crewstyle, le 4 mar 2007 à 21:48:20

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.

Répondre à crewstyle

2

crewstyle, le 7 mar 2007 à 23:07:40
  • +1

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 ;)

Répondre à crewstyle

3

oatson, le 20 mai 2008 à 13:02:59

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

Répondre à oatson

4

kij_82, le 20 mai 2008 à 13:39:25

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.

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82

5

 yorek, le 20 mai 2008 à 13:41:22

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.

Répondre à yorek