[javascript] Problema con internet explorer 8 [risolto]

Blackorgasm
Buonasera a tutti :D
ho dei problemi con IE8 quando devo eseguire la mia applicazione web; in pratica tramite un tasto dovrei lanciare una animazione (un immagine che appare e scompare), solo che il debug di IE mi da errore ad un if, di preciso il primo if dentro la funzione "inizia()" (mi dice 'interfaccia sconosciuta'), non riesco a capire il perché, qualcuno può aiutarmi? di seguito il codice:


var stop;
var immagine;
var paragrafo;
var elemento;
var tasti3;
var tasti4;


function lampeggia(imm,pr){
                                            if(imm.style.visibility == 'visible' || pr.style.background == 'red'){
												                                            imm.style.visibility = 'hidden';
																												                                    pr.style.background = 'red';
																											                                           }
												   else {
												            imm.style.visibility = 'visible';
												            pr.style.background = 'yellow';
													   }
	                                 }
												 
function fermati(){
                            blocca = document.getElementById('none');
									 blocca.getElementsByTagName('button')[1].disabled = false;
                                                                         clearInterval(stop);
									 elemento.removeChild(immagine);
									 elemento.removeChild(paragrafo);
									 partasti.removeChild(tasti3);
									 partasti.removeChild(tasti4);
									 elemento.getElementsByTagName('button')[0].disabled = false;
									 elemento.getElementsByTagName('button')[1].disabled = true;
									 alert('Lavorazione terminata con successo');
									 }


function inizia(){
                       for(t=0; t<2; t++){
				                 if(campo[t].value>Number(vettore[t]) || campo[t].value=='' || campo[t].value<=0 || isNaN(campo[t].value)){
																					                                                                                                         campo[t].value = 'ERRORE!';
																								                                                                                              campo[t].style.background = 'red';
																								                                                                                              return;
																				                                                                                                  }
				    else campo[t].style.background = 'white';
						                         }
								         blocca = document.getElementById('none');
									 blocca.getElementsByTagName('button')[1].disabled = true;
									 elemento = document.getElementById('a');
									 elemento.getElementsByTagName('button')[1].disabled = false;
									 
									 
									 tasti3 = document.createElement('button');
									 tasti4 = document.createElement('button');
									 valore3 = document.createTextNode('Aumenta velocità');
									 valore4 = document.createTextNode('Diminuisci velocità');
									 tasti3.appendChild(valore3);
									 tasti4.appendChild(valore4);
									 tasti3.attachEvent('onclick',aumenta);
                   tasti4.attachEvent('onclick',diminuisci);
									 tasti4.disabled = true;
									 partasti.appendChild(tasti3);
									 partasti.appendChild(tasti4);
									 
										
									 immagine = document.createElement('img');
									 immagine.src = './immagini/lavori-in-corso.gif';
								   immagine.id = 'posizionamento';
									 immagine.alt = 'lavori in corso';
									 opera = document.getElementById('a');
									 opera.appendChild(immagine);
									 opera.getElementsByTagName('button')[0].disabled = true;
									 paragrafo = document.createElement('p');
									 paragrafo.setAttribute('id','locazione');
									 paragrafo.style.background = 'yellow';
									 scritta = document.createTextNode('LAVORAZIONE IN CORSO');
									 paragrafo.appendChild(scritta);
									 opera.appendChild(paragrafo);
									 stop = setInterval('lampeggia(immagine,paragrafo)',2000);
									 setTimeout('fermati()',30000);
									}
									
function termina(){
                            blocca = document.getElementById('none');
									 blocca.getElementsByTagName('button')[1].disabled = false;
                                                                         clearInterval(stop);
									 elemento.removeChild(immagine);
									 elemento.removeChild(paragrafo);
									 partasti.removeChild(tasti3);
									 partasti.removeChild(tasti4);
									 elemento.getElementsByTagName('button')[0].disabled = false;
									 elemento.getElementsByTagName('button')[1].disabled = true;
									 alert('Lavorazione terminata forzatamente');
									 }


Risposte
cyd1
IE fa schifo.

comunque campo non è stato definito

Blackorgasm
campo è definito in un altro script come variabile globale (è un array in realtà), mi sono dimenticato di dirlo. Praticamente tutta l'applicazione funziona con Firefox, ma non funziona con IE ](*,) il debug mi da errore proprio in quel punto

Rggb1
Cosa è 'vettore'?

Blackorgasm
allora alcune cose, tipo array variabili che non sono state definite sono appunto variabili o vettori globali che sono definite all'interno di altri script. L'applicazione è troppo grande e su più file quindi non posso postarla tutta :( comunque il debug di IE mi da errore lì, invece la console degli errori di Firefox non mi da nessun tipo di errore (e l'applicazione infatti funziona).

cyd1
posta la definizione di campo e delle altre variabili contenute in quell'espressione, probabilmente sarà il fatto che IE bisogna di metodi diversi da tutti gli altri browser che preferiscono rispettare gli standard per accedere ai tag html

Blackorgasm

miopar = new Array();
campo = new Array();
text = new Array();
window.funzione=aggiorna; /*assegno all'oggetto window il "metodo" aggiorna*/
var vettore;
var partasti;
var x = new Array();


Oltre a quelle presenti nel codice sopra postato, negli altri script c'è la definizione di queste altre variabili e vettori. L'ultima è da sola in uno script (il vettore x), le altre sono definite tutte insieme in un altro script.

Rggb1
Hai provato con IE7? Perché imho il problema è su IE8 e quindi hai bisogno di un workaround, magari
if(isNaN(campo[t].value) || campo[t].value=='' || campo[t].value<=0 || campo[t].value>Number(vettore[t]))

o controlli il browser e fai in un altro modo...

cyd1
blackorgasm, cosa assegni a campo?
per definizione intendevo che valore\oggetto hai assegnato alle variabili in gioco. è forse un array che deve puntare a dei tags html della pagina? se si, come hai assegnato alle sue celle i tags?

Blackorgasm
purtroppo l'applicazione deve andare su Firefox 3.# e IE 8, quindi devo farlo funzionare a tutti i costi lì.

Campo è un vettore che contiene 2 numeri inseriti da form (questa form è creata dinamicamente), la funzione inizia serve a controllare che i campi siano stati inseriti correttamente (ovvero rispettando le specifiche contenute nei primi due elementi di 'vettore', che è un altro array alfanumerico precedentemente riempito); se i campi sono giusti vengono creati due bottoni, un'immagine ed un paragrafo dinamicamente.

Scusate le mie difficoltà ma la programmazione non è il mio ambito di studi :(

Rggb1
"Blackorgasm":
purtroppo l'applicazione deve andare su Firefox 3.# e IE 8, quindi devo farlo funzionare a tutti i costi lì.

Si ma devi isolare il problema, prova con IE7 e controlla se funziona, e dopo prova con il mio workaround - che mette il controllo isNan per primo. Almeno sai da dove partire.

Blackorgasm
ho messo isNaN per primo ma non è cambiato niente :( sempre solito problema, ora provo con IE7

Blackorgasm
una domanda, ho Windows 7 come SO, e non so se sia possibile installare IE7, in quanto non ho trovato siti dove mi confermano questa cosa :(
Comunque ho installato IE9, ed il problema è sempre lì, al solito posto, anche dopo aver fatto il workaround da te consigliatomi, non so dove sbattere la testa, l'errore però ora è: "L'oggetto invocato si è disconnesso dai client corrispondenti".

Blackorgasm
Dopo un bel po' di tentativi ho trovato che l'errore è proprio nell'array 'vettore', ovvero IE probabilmente non lo riconosce.
Siccome quando 'vettore' viene compilato, Firefox ed IE hanno due comportamenti diversi: FF apre un'altra scheda, dove posso inserire i dati che andranno in 'vettore', mentre IE apre proprio un'altra finestra: può essere questa la causa del malfunzionamento su IE?

Blackorgasm
Non penso sia quello il problema, in quanto ho impostato ad IE di aprire la pagina in una nuova scheda e non è cambiato nulla.
Penso che il problema sia in "window.opener", mi spiego meglio.
Allora ho una finestra madre che tramite un tasto apre la finestra figlio. La finestra figlio contiene un modulo da compilare; una volta compilato c'è un tasto che invia i dati inseriti (e messi dentro l'array 'x') alla finestra madre tramite attributo con questa sintassi: window.opener.attributo = x;. Dopo il click la finestra figlio viene chiusa e nella finestra madre appaiano due campi input (dove andranno inseriti dati che devono rispettare i primi due campi di 'vettore'), e dei paragrafi contenenti dati presi sempre da 'vettore'. La variabile vettore viene riempita nello script che crea tutto questo tramite assegnamento vettore=window.attributo;. Vettore è una variabile globale.

In FF questo mi è permesso, ma in IE no. Qualcuno conosce una alternativa valida?

cyd1
come apri la finestra? posta un po di codice altrimenti andiamo poco in la

Blackorgasm
function crea_bottale(){
                        var s = confirm("Vuoi installare un nuovo bottale?");
												if(s){
												      finestra = window.open('Modulo_Bottale.html');
															elemento1 = document.getElementById('none');
															elemento1.getElementsByTagName('button')[0].disabled = true;
															}
												else return;
												}
												
function numero(frm,i){
                      if (isNaN(frm.elements[i].value) || frm.elements[i].value<=0 || frm.elements[i].value == ''){
									                                                                                    alert('Errore al punto:'+frm.elements[i].name);
																			    flag=true;							                                                                                               
										 			                                                    }
										  else x[i]=frm.elements[i].value;							 
									    }
										 
function spunta(frm,i){
                                 if(frm.elements[i].checked){
		                                                            x.push(frm.elements[i].value);
									 }										 
											 else return;
				  }

function control(){
                   if(x.length != 5){
									                    alert('Non hai riempito tutti i campi'); 
									                    finestra.location.reload();
																		 }
									 }
												
function inoltra(frm){
                      flag=false;
											for(var i=0; i<frm.elements.length-1; i++){
											                                if(flag) return;
											                                switch(frm.elements[i].type){
																											                              case 'text':
																															                                  numero(frm,i);
																																											          break;
																																										case 'radio':
																																										             spunta(frm,i);
																																															   break; 
																																										}
																											            }
											control();
											window.focus('Pagina_Principale.html');
											window.opener.arr=x;
										  window.opener.funzione(); /*chiamata ed esecuzione della funzione aggiorna presente nell'altro script*/
											window.close('Modulo_Bottale.html');															 
                     }
										 


questo è uno script condiviso tra la pagina madre e quella figlia: quando clicco sul tasto della pagina madre viene lanciata la funzione "crea_bottale" (per la cronaca il bottale è un macchinario per la concia delle pelli). Quando invece clicco sul tasto che mi restituisce l'array x alla pagina madre viene lanciata la funzione "inoltra", le altre funzioni sono di controllo.

cyd1
non ci trovo nulla di sbagliato, ma quando e come assegni i valori a campo? cioè nella funzione in cui ti da errore accedi ai valori di campo ma con che codice ce li assegni? posta quel codice, magari gli assegni dei valori in un modo che a IE non piace

Blackorgasm
no no campo non c'entra nulla, perché ho provato a togliere la condizione "campo[t].value>Number(vettore[t])" e il programma viaggia. Ho sostituito anche a 'vettore' altre condizioni e il tutto funziona anche con IE, quindi l'errore è proprio lui. Temo che sia "window.opener", perché sul web ho trovato che altre persone hanno avuto problemi simili, ma non nel passare alla finestra madre un intero oggetto come me :(.
Comunque per completezza i valori di campo li assegno tramite una form (che viene generata dinamicamente da un altro script ancora).

Rggb1
Allora probabilmente è un problema di protezione. A causa di problemi legati al sistema sul quale funziona, IE ha delle opzioni terrificanti. Prova dalle opzioni a disattivare tutte le protezioni possibili (esegui script, permetti script et al, non me le ricordo certo tutte a mente... sono legione).

Noi per esempio utilizziamo alcune webapps di fornitori esterni, e molte hanno delle pagine di test; spesso su firefox è sufficiente dire "abilita javascript" ed il test passa, mentre su IE bisogna mettere l'indirizzo fra i "siti attendibili" e poi abilitare indistintamente tutte le esecuzioni di script.

Blackorgasm
ho provato da opzioni internet -> avanzate e poi anche in sicurezza a disabilitare tutte le limitazioni degli script ma niente :( non mi resta che parlarne col professore. Un metodo alternativo a window.opener esiste?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.