11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous.

Si vous êtes amateur de casse tête je vous en prie, vous allez prendre votre pied!

J'ai une page contenant un ensemble de facture présentées sous forme de tableau.
Je dois réaliser une chose très bête et banale: si je coche une case à cocher à côté de l'intitulé d'une facture, je dois pouvoir lire la cellule "Status" de ce tableau. Ou plus exactement prendre l'information dans un champ de type "hidden".

Inutile de dire que ça fonctionne impeccablement bien sous Firefox et tout autre navigateur moderne.
Mais là où le bas blesse... c'est que:
- ça ne fonctionne pas sur IE si la requête provient du serveur
- ça fonctionne sur IE si de la même page provenant du serveur je fais "afficher la source" > enregistrer dans un fichier .html et que je le lance... :aie:

La seule différence entre les 2? IE m'indique dans la version locale que pour me protéger il a restreint l'exécution des scripts... (blablabla) et je lui donne l'autorisation de supprimer la restriction...

Des petits screenshot valent la peine je pense:

http://www.jer-rebecq.be/ie_serveur.jpg
http://www.jer-rebecq.be/ie_local.jpg

Note du modérateur: attention aux images trop grandes qui déforment le forum!

Alors je vous donne la version HTML Locale (sauvée depuis IE):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title></title>
  <script src="/js/jquery-1.2.6.js" type="text/javascript"></script>
  <script src="/js/tablecloth.js" type="text/javascript"></script>
  <script src="/js/general.js" type="text/javascript"></script>
  <!--[if lt IE 8]>
	<script src="/js/IE8.js" type="text/javascript"></script>
  <![endif]-->
  <link rel="stylesheet" media="screen" type="text/css" title="General" href="/css/general.css" />
  
  </head>
<body class="tundra">
  <div>
    <img src='/img/logo_xxx.jpg' alt='xxx'/><br/><br/>
  </div>
  <div class="content">
    	<script type="text/javascript">
		var rulesStatus = new Array();
					rulesStatus["In Preparation"] = new Array();
							rulesStatus["In Preparation"] ["Approved"] = 7;
							rulesStatus["In Preparation"] ["Delete"] = 0;
								rulesStatus["Approved"] = new Array();
							rulesStatus["Approved"] ["Sent"] = 8;
								rulesStatus["All"] = new Array();
							rulesStatus["All"] ["Sent"] = 8;
							rulesStatus["All"] ["Paid"] = 9;
							rulesStatus["All"] ["Partial paid"] = 10;
					
		function displayGeneralActions() {
			i = 0;
			currentCheckbox = document.getElementById('checkboxInvoice_'+i);
			currentStatus = '';
			isNotPossible = false;
			while (currentCheckbox != null) {
				if (currentCheckbox.checked == true) {
					status = document.getElementById('statusName_'+i).value;
					alert(status);
					if (currentStatus == '')
						currentStatus = status;
					if ((status == 'In preparation' && currentStatus != 'In Preparation') || (status == 'Approved' && currentStatus != 'Approved')) {
						isNotPossible = true;
						i = 0; 
						break;
					}
					if (status != 'In preparation' && status != 'Approved')
						currentStatus = 'All';
				}
				i++;
				currentCheckbox = document.getElementById('checkboxInvoice_'+i);
			}
			alert('INFO: '+i+'\nStatus: '+currentStatus+'\n boolean: '+isNotPossible);
			/*
				TESTER si i=0 => masquer menu else afficher
				si aucun checked status est vide!
			*/
			selection = document.getElementById('selectionGeneralActions');
			if (i==0 || currentStatus=='') 
				selection.style.display = 'none';
			else {
				selection.style.display = 'block';
			}
		
		}
	</script>
	<select id='filter_0' name='centerFilter' onchange="filterPage('/invoice')">
		<option value='all'>All centers</option>
	<select id='filter_1' name='companyFilter' onchange="filterPage('/invoice')">
		<option value='all'>All companies</option>
	<select id='filter_2' name='statusFilter' onchange="filterPage('/invoice')">
		<option value='all'>All status</option>
		<option value="In Preparation">In Preparation</option><option value="Approved">Approved</option>	</select>
	<select id='filter_3' name='periodFilter' onchange="filterPage('/invoice')">
		<option value='all'>All periods</option>
		<option value="2008-09-01 2008-09-30">2008/09/01 - 2008/09/30</option><option value="2008-10-01 2008-10-31">2008/10/01 - 2008/10/31</option><option value="2008-10-02 2008-10-15">2008/10/02 - 2008/10/15</option>	</select>
	<select id='filter_4' name='numberFilter' onchange="filterPage('/invoice')">
		<option value='all'>All numbers</option>
		<option value="-">-</option><option value="2008/1">2008/1</option><option value="2008/2">2008/2</option><option value="2008/3">2008/3</option><option value="2008/4">2008/4</option>	</select>
	<input type='button' value='Remove filters' onclick='document.location.href="/invoice"'>
	<div id="overview">
	<table class="tableCSS">
		<tr>
			<th><input type="checkbox" onclick="javascript:controlCheckbox('checkboxInvoice_',this);displayGeneralActions();"/></th>
			<th>Center</th>
			<th>Number</th>
			<th>Company</th>
			<th>Period</th>
			<th>Due date</th>
			<th>Amount</th>
			<th>Status</th>
			<th>Operation</th>
		</tr>
								<tr>
			<td><input type="checkbox" id="checkboxInvoice_0" name="96" onclick="javascript:displayGeneralActions()"/> </td>
			<td><span id="centerName_0">XX</span></td>
			<td><span id="invoiceNumber_0">-</span></td>
			<td><span id="companyName_0">XX</span></td>
			<td><span id="startDate_0">2008/10/01</span> - <span id="endDate_0">2008/10/31</span></td>
			<td><span id="dueDate_0">2009/12/30</span></td>
			<td><span id="totalPrice_0">295</span>€</td>
			<td>
				In Preparation				<input type="hidden" id="statusName_0" value="In Preparation" />
			</td>
			<td>
				<a href="/invoice/view?id=96"><img src="/img/view-trans.png"/></a>
									<a href="/invoice/edit?id=96"><img src="/img/edit-trans.png"/></a>
					<a href="/invoice/delete?id=96"><img src="/img/delete-trans.png"/></a>
								<input type="hidden" id="idInvoice_0" value="96"/>
			</td>
		</tr>
						<tr>
			<td><input type="checkbox" id="checkboxInvoice_1" name="32" onclick="javascript:displayGeneralActions()"/> </td>
			<td><span id="centerName_1">XX</span></td>
			<td><span id="invoiceNumber_1">-</span></td>
			<td><span id="companyName_1">XX</span></td>
			<td><span id="startDate_1">2008/09/01</span> - <span id="endDate_1">2008/09/30</span></td>
			<td><span id="dueDate_1">2008/11/30</span></td>
			<td><span id="totalPrice_1">340</span>€</td>
			<td>
				In Preparation				<input type="hidden" id="statusName_1" value="In Preparation" />
			</td>
			<td>
				<a href="/invoice/view?id=32"><img src="/img/view-trans.png"/></a>
									<a href="/invoice/edit?id=32"><img src="/img/edit-trans.png"/></a>
					<a href="/invoice/delete?id=32"><img src="/img/delete-trans.png"/></a>
								<input type="hidden" id="idInvoice_1" value="32"/>
			</td>
		</tr>
			</table>
	<div style="height:40px;"></div>
	<fieldset id="selectionGeneralActions" class="validationButton" style="display: none;">
		<legend>Pour la sélection</legend>
	</fieldset>
</div>
  </div>
</body>
</html>


Alors il se trouve que si je rajoute le site dans mes options internet comme "site de confiance" Internet Explorer interprète le javascript correctement. Smiley biggol

Mais ce qui est très amusement c'est que:
- sur la page web envoyée par le serveur il ne me dit pas qu'il a bloqué l'exécution...
- pourquoi me fait-il ça sur cette page alors que j'effectue exactement les mêmes opérations sur d'autres? (getElementById dans un champ hidden etc...)

On me répond sur Développez.com que c'est "comme ça" mais elle est bien belle la réponse à fournir au client...
Non il doit y avoir quelque chose et j'aimerai comprendre quoi.
Modifié par Florent V. (19 Nov 2008 - 12:21)
Bon j'ai trouvé la solution... enregistrez le quelque part dans votre cerveau ça vous évitera de devenir dingue comme moi pendant 24h.

IE 7 (aucune idée pour les versions antérieures) ne tolère pas que vous déclariez une variable portant le nom "status" si votre site ne fait pas partie des "sites de confiance". Changez simplement le nom de la variable et le problème est résolu... Smiley biggol


Et après, il y a encore des gens qui m'assurent qu'Internet Explorer n'est pas une p******** de poubelle!
Oui assez.
Enfin ce n'est pas vraiment un bug, IE déclare une variable window.status....

Mais c'est assez vil pour que cela s'oublie Smiley langue
Hello,
koD a écrit :
Enfin ce n'est pas vraiment un bug, IE déclare une variable window.status....

De façon générale, éviter comme la peste les variables globales... Surtout celles avec des noms aussi courants.
Ah ok, j'ai cru koD déclarait une variable locale avec pour nom "status", et que ça ne marchait pas. Mais c'était une variable globale. Donc le bug était dans la rigueur méthodologique de la personne qui a écrit le script. Smiley cligne
Mmmm en vous lisant je me dis que je me suis trompé ^^

var maVariable = 2 ce n'est pas donc pas ça qui crée une variable globale mais bien maVariable = 2 ?
koD a écrit :
var maVariable = 2 ce n'est pas donc pas ça qui crée une variable globale mais bien maVariable = 2 ?

Ca dépend si ce bout de code est dans la portée globale ou encapsulé dans une fonction.
Si tu déclare une variable "à la racine" (c'est à dire, pas dans une fonction), alors elle sera accessible depuis window (la déclarer en var ou non n'a pas d'importance).

Donc comme window.status est déjà utilisé par IE pour indiquer ce qui est écrit dans la barre de status en bas, il t'y restreint l'accès. La notion de sécurité sur les logiciels Microsoft m'étonnera toujours
Et bien si vous regardez le code la déclaration est faite dans une fonction.
D'où le fait que je me posais des questions sur "var". (N'étant pas à la base un parfait javascripteur).

Donc j'avais bien déclaré une variable encapsulée.
Oui mais tu ne la déclare pas en temps que var dans ta fonction, donc elle est utilisée comme globale