comportamento anomalo con IE 9 e 10

  • Creatore Discussione Creatore Discussione ans66
  • Data di inizio Data di inizio
Marino,

Ho modificato il file tab5.js come mi hai suggerito.

Ho fatto delle prove con:

IE 11 su Windows 8
Google Chrome su Windows 8
Mozilla Firefox su Windows 8

Solo IE si comporta in maniera anomala. In maniera del tutto casuale talvolta carica solo una parte delle Select e talvolta aggiorna il contatore solo su talune scelte di Select. Facendo un refresh (F5), capita che successivamente si comporti in maniera corretta.

Ho potuto constatare, da diverse prove fatte negli scorsi giorni, che ho un diverso comportamento fra IE su diversi sistemi operativi (IE 11 su Windows 7 funzionava bene - devo ancora verificare dopo questi ultimi cambiamenti).

Credo davvero sia stato fatto il massimo possibile e non voglio approfittare troppo del prezioso tempo che mi hai dedicato.

Sono molto soddisfatto dei risultati raggiunti e delle numerose cose che ho appreso!

Grazie davvero.:):)
 
Ciao Marino,

Ti vorrei aggiornare su un'ultima prova che ho fatto in questo momento, per non lasciare nulla al caso.

Ho provato a riutilizzare tabella5.js (con $post); la versione precedente all'ultima che mi hai inviato.

Vedo che il comportamento anomalo con IE 11 su Windows 8 è migliorato ma, per favore, non chiedermi il motivo.

Comunque nelle versioni i IE 10 (in giù), provate con IE tester, ho come risultato delle select non popolate.

Avevo letto anch'io in rete che il codice usato nella tua ultima versione rendeva lo script compatibile con tutti i browser ma onestamente non ne comprendo il motivo. Con quali browser la penultima tua versione di tabella5.js non è compatibile?

Grazie ancora per tutto l'aiuto che mi hai dato!
 
ti confermo che,
1a versione
PHP:
		$.post("characteristics.php", {funzione:'Diametro',id:applic,id2:comeR}, function(data){
			$("select#Diametro").removeAttr("disabled"); 
			$("select#Diametro").html(data);
		});

2a versione suggerita da criric
PHP:
		$.ajax ({   
			type: "POST",
			url: "characteristics.php",
			data: {
				funzione: funzione,
				id	: applic,
				id2	: comeR,
				lng	: lang
			},
			dataType: "html",
			success: function(data)
			{
				$("select#"+form_tag).removeAttr("disabled"); 
				$("select#"+form_tag).html(data);
			},
			error: function() { alert("malfunzionamento select "+form_tag); }
		});

3a versione trovata in internet
PHP:
		if (window.XMLHttpRequest)	{ xmlhttp=new XMLHttpRequest(); }
		else				{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }

		xmlhttp.onreadystatechange=function()
		{
			if (xmlhttp.readyState==4 && xmlhttp.status==200)
			{
				$(form_tag).removeAttr("disabled"); 
				$(form_tag).html(xmlhttp.responseText);
			}
		}
		xmlhttp.open("POST","characteristics.php",true);
		xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlhttp.send
		(
			"funzione="	+ funzione
		+	"&id="		+ applic
		+	"&id2="		+ comeR
		+	"&lng="		+ lang
		);
ho verificato che tutte non rispettano la sequenza del codice,
la loro sequenza di esecuzione é sicuramente casuale,
ho letto che si può definire una sequenza ma non ho ancora provato

pensavo con la terza versione di vedere xp e ie8 funzionare ma se questa versione é l'ultima che hai reso disponibile come test,
purtroppo le select sono desolatamente vuote

quindi ricapitolando,
1) andrebbe introdotto il controllo di esecuzione forzando il rispetto della sequenza (per contare "bene" gli elementi)
2) risolvere la compatibilità tra browers (per popolare correttamente le select)

qualche idea ?
ciao
Marino

ps: le mie prove con win7pro ie11
 
Ciao Marino,

Confermo che ho inserito sul server la 2a versione che risulta essere più stabile della terza visto che, comunque, l'ultima versione non è compatibile con versioni IE precedenti alla versione 10 (in quanto le Select non si popolano).

Per quanto riguarda i seguenti punti:
1) andrebbe introdotto il controllo di esecuzione forzando il rispetto della sequenza (per contare "bene" gli elementi)

Premesso che è fuori dalla mia portata trovare una soluzione in Ajax a questo tipo di problematica, devo rifarmi per forza a quel poco di esperienza fatta in VB. Se esiste il sistema in AJAX di verificare tutti gli eventi di "Select changed" (tipo Select is changed), lancerei la funzione Contarecord solo dopo aver verificato che tutte le Select siano cambiate.

2) risolvere la compatibilità tra browser (per popolare correttamente le select).

qui è davvero buio completo! Ho speso un sacco di ore per trovare una soluzione in rete senza trovare nulla di concreto.

Spero di aver detto qualcosa di utile per trovare una qualche soluzione.
 
Ciao Marino,

è possibile fare qualcosa del genere?

Codice:
$(document).on('change', '#select#applicazione', function () {
    $(document).on('change', '#select#comeRuota', function () {
     $(document).on('change', '#select#comeRuota', function () {
     $(document).on('change', '#select#Diametro', function () {
     $(document).on('change', '#select#TipoSupporto', function () {
     $(document).on('change', '#select#TipoLamiera', function () {
     
     ecc.

    ContaRecords();

});
});
});
});
});
});
 
Ciao Marino,

Non considerare questo mio ultimo messaggio. In effetti tabella5.js già svolge questo compito. Stavo solo cercando un modo per forzare il rispetto della sequenza.
 
Vedi l'allegato tabella5.zip

il problema della sequenza lo abbiamo solo quando si sceglie applicazione o comeruota
non quando si sceglie una singola caratteristica ... e credo di aver risolto,

ti do l'inizio della matassa ... lasciando a te dipanarla (leggere le modifiche),

PHP:
var attendere = '<option value="-1">Attendere...</option>';

ho introdotto un ritardo di 0,5 secondi che dovrebbe influire men di niente
ho protetto contro un eventuale crash del browser per 10 .... ma con alert ho sempre visto 1
(non posso svelarti tutto ... altrimenti ... dipano io)

poi ho lasciato due alert nel conteggio, che dicono quale metodo viene utilizzato per il "post"
PHP:
if (window.XMLHttpRequest)	{ xmlhttp=new XMLHttpRequest(); 
				  alert('new XMLHttpRequest'); }
else				{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
				  alert('new ActiveXObject'); }
sarebbe interessante su tu potessi verificare x S.O. e "marca" del browser quale viene usato
giusto per capire se le vecchie versioni utilizzano il metodo Microsoft

in ogni caso tolti i due alert, questa versione dovrebbe essere un passo avanti
fammi sapere
ciao
Marino
 
Ciao Marino,

Ho letto e ho riletto il codice che mi hai inviato ma oggi faccio davvero fatica a trovare il bando della matassa (la giornata lavorativa assai pesante forse non mi aiuta molto).

Passi una variabile "i" in ContaRecord con valore 0 a cui segue un incremento di +1 (ciclo massimo di 10). Mi è chiaro il loop a Contarecord con incremento della variabile i di +1 e il ritardo di 0,5 secondi. Se ho capito bene si ha il loop fino a che tutte le Select sono state riempite e presentano un valore di 0
Codice:
<option value="0">scegli...</option>
e solo a questo punto parte la funzione ContaRecord. E' corretta la mia interpretazione?

Non capisco cosa intendi dire con
ma con alert ho sempre visto 1
(non posso svelarti tutto ... altrimenti ... dipano io)

i due alert chiaramente servono per capire, come hai detto tu, quale metodo viene utilizzato per il "post". Ti farò sapere in proposito
 
e solo a questo punto parte la funzione ContaRecord. E' corretta la mia interpretazione?
si è proprio così, scusa se è poco javascript e molto vb ... ma così mi sento più sicuro
in questo modo dovrebbe essere stabile nel contare i record

i due alert servono proprio a capire quale metodo viene usato, per i vecchi IE dovrebbe essere usato ActiveX

nel frattempo cerco di trovare altri esempi e/o idee per la compatibilità
ciao
Marino
 
Ultima modifica:
Adesso che ho provato con il file tabella5.js, ho capito cosa intendevi...sappi che in locale ho come alert 'new XMLHttpRequest' e non 1. Vedrò domani cosa succede una volta caricato su server.
 
per cortesia prova questa versione e metti questa sul server
ho inserito qualcosa in più x IE vecchi in tutte e due le funzioni, tabelle e conta
buona notte ...
Marino

Ciao Marino,

Ho un po' di cose da relazionarti:

a) versione con alert provata su XP versione 2002 IE 8
alert ('XmlHTTPRequest')
undefined variables che rendono vuote le select e creano errore su query "Contatore" (nella Query errata si vedeva chiaramente il riferimento a variable undefined!).

a1) non ho mai visto alert 1 ma sempre alert XmlHTTPRequest con Windows 8 e IE 11, Windows 7 e IE 11

a2) Questa versione (penultima) ha risolto il problema del contatore che parte non alla fine del riempimento Select ed è quindi parificabile alla versione Ajax (consigliata da criric). Questo ovviamente dopo che hai creato il loop con attesa del Contatore.

b) Ultima versione. Caricata al volo sul server oggi nel tardo pomeriggio . Già provata al volo su Windows XP e IE 8 e purtroppo non risolve il problema delle variabile undefined (post non passa le variabili) anche se guardando al volo nel file Tabella5.js ho visto che hai tentato di affrontare il problema.

b1) il risultato di quest'ultima versione su Windows 8 e IE 11 è peggiore di quello della precedente versione. Non viene rispettato il ciclo. Il contatore non parte a fine ciclo popolamento Select per cui solo alcune Select vengono riempite. Altre sono ferme a valore -1 (wait).

Non ricordo altro d'interessante da relazionarti.
 
Vedi l'allegato tabella5.zip

provo a fare il punto della situazione,

1) la ricerca dei prodotti nel database é stata ricondotta a query senza più join con incremento delle prestazioni,

2) il dialogo con il server poteva essere inficiato dalla cache, lo abbiamo risolto semplicemente mettendo il "time" nel URL

3) qualunque metodo fosse usato per la richiesta dei dati al server, c'era un problema di sequenza che é stato risolto con un timeout controllato con un loop per evitare crash del browser (per loop infinito)

4) compatibilità con browser diversi che ad oggi non è risolto

tutto ciò che hai elencato dipende da quest'ultimo punto o da situazioni che andrebbero verificate, la tabella non caricata ed in "attesa" significa che il server non ha risposto
non sono dovute alle situazioni già risolte,

per esempio, cambiando il "js" sottostante, deve essere pulita la cache del client per evitare di lavorare con la versione in cache
di nuovo, pensavo di vedere un alert differenziato tra xp ie8 e sistemi successivi, questo non è successo,

c'é un post di criric che, suggerisce di passare tutto il pacchetto
<select> <option 1> <option 2> ... </select>
per evitare il blocco per errori, a me sembra che non siano possibili errori, perchè le letture del database restituiscono una struttura dei dati corretta, vedi figura
in ogni caso noi stiamo passando solo le option

trovi ancora "js", nulla di nuovo, ho solo inserito tutti e 3 i metodi che abbiamo usato, il terzo in 2 versioni,
ho lasciato molti "alert" commentati, che puoi utilizzare per vedere qualche dettaglio,
per esempio se guardi le risposte del server, vedi chiaramente la "non" sequenza
(ovviamente attivi il metodo che preferisci con "1==1")

ma in questo momento non ho altre idee per risolvere la compatibilità
ciao
Marino
Cattura1.PNG
 
considerato che qualche volta hai visto le variabili non definite,
se sei d'accordo posso provare a modificare usando GET anziché POST,
passando i parametri sulla "riga di comando" forse si comporta in modo diverso,
le modifiche non sono significative ...
ciao
Marino
 
è un tentativo che avevo fatto anch'io ma molte versioni fa. Vale la pena di ritentare. Io posso guardarci solo questa sera comunque. Avevo letto anche di tag che rendevano le versioni IE compatibili a nuove versioni ma è una strada che non mi ha portato a niente e per questo non te ne avevo parlato
 
Ultima modifica:
Vedi l'allegato 2388
trovi ancora "js", nulla di nuovo, ho solo inserito tutti e 3 i metodi che abbiamo usato, il terzo in 2 versioni,
ho lasciato molti "alert" commentati, che puoi utilizzare per vedere qualche dettaglio,
per esempio se guardi le risposte del server, vedi chiaramente la "non" sequenza
(ovviamente attivi il metodo che preferisci con "1==1")

ma in questo momento non ho altre idee per risolvere la compatibilità
ciao
Marino

Ciao Marino,

Ho gradito il tuo file zip tabella5.js che riepiloga i 3 metodi. Finalmente ho avuto modo di guardare il codice con calma.

Premesso che ho mantenuto valido il metodo 2, avrei modificato il codice con GET come segue (posso procedere con la prova su server?):

Codice:
$(document).ready(function(){
	var scegli = '<option value="0">Scegli...</option>';
	var attendere = '<option value="-1">Attendere...</option>';

	$("select#Diametro").html(scegli);
	$("select#Diametro").attr("disabled", "disabled");

	$("select#TipoSupporto").html(scegli);
	$("select#TipoSupporto").attr("disabled", "disabled");

	$("select#TipoLamiera").html(scegli);
	$("select#TipoLamiera").attr("disabled", "disabled");

	$("select#TipoPavimenti").html(scegli);
	$("select#TipoPavimenti").attr("disabled", "disabled");

	$("select#volvenza").html(scegli);
	$("select#volvenza").attr("disabled", "disabled");

	$("select#TipoRuota").html(scegli);
	$("select#TipoRuota").attr("disabled", "disabled");

	$("select#Portata").html(scegli);
	$("select#Portata").attr("disabled", "disabled");

	$("select#SerieSupporti").html(scegli);
	$("select#SerieSupporti").attr("disabled", "disabled");


	$("select#applicazione").change(function(){ SelezionaTabelle(); });

	$("select#comeRuota").change(function(){ SelezionaTabelle(); });


	$("select#Diametro").change(function(){ ContaRecords() });

	$("select#TipoSupporto").change(function(){ ContaRecords() });

	$("select#TipoLamiera").change(function(){ ContaRecords() });

	$("select#TipoPavimenti").change(function(){ ContaRecords() });

	$("select#volvenza").change(function(){ ContaRecords() });

	$("select#TipoRuota").change(function(){ ContaRecords() });

	$("select#Portata").change(function(){ ContaRecords() });

	$("select#SerieSupporti").change(function(){ ContaRecords() });


	function SelezionaTabelle() 
	{
		var applic = $("select#applicazione option:selected").attr('value');
		var comeR  = $("select#comeRuota option:selected").attr('value');

		// applicazione non scelto è di default Collettività
		// comeruota non scelta è di default Ruota montata
		if(applic==0) {applic=1}; if(comeR==0) {comeR=3};

		var lang = 'it';

		loadXMLDoc('select#Diametro', 'Diametro', applic, comeR, lang);
		loadXMLDoc('select#TipoSupporto', 'Supporto', applic, comeR, lang);
		loadXMLDoc('select#TipoLamiera', 'Lamiera', applic, comeR, lang);
		loadXMLDoc('select#TipoPavimenti', 'Pavimenti', applic, comeR, lang);
		loadXMLDoc('select#volvenza', 'Volvenza', applic, comeR, lang);
		loadXMLDoc('select#TipoRuota', 'Ruota', applic, comeR, lang);
		loadXMLDoc('select#Portata', 'Portata', applic, comeR, lang);
		loadXMLDoc('select#SerieSupporti', 'SerieSup', applic, comeR, lang);

		ContaRecords(0);
		return;
	}

 
	function loadXMLDoc(form_tag, funzione, applic, comeR, lang)
	{
		$(form_tag).html(attendere);
		$(form_tag).attr("disabled", "disabled");

if (1==0){//	alert('*** METODO 1 ***');
		$.post("characteristics.php", {funzione:funzione, id:applic, id2:comeR, lng:lang},
		function(data)
		{
// alert(data);
			$(form_tag).removeAttr("disabled"); 
			$(form_tag).html(data);
		});
}
if (1==1){//	alert('*** METODO 2 ***');
		$.ajax ({   
			type: "GET",
			url: "characteristics.php",
			data:
			{
				funzione: funzione,
				id	: applic,
				id2	: comeR,
				lng	: lang
			},
			dataType: "html",
			success: function(data)
			{
// alert(data);
				$(form_tag).removeAttr("disabled"); 
				$(form_tag).html(data);
			},
			error: function() { alert("malfunzionamento "+form_tag); }
		});
}
if (1==0){//	alert('*** METODO 3-a ***');
		var xmlhttp;

		if (window.XMLHttpRequest)	{ xmlhttp=new XMLHttpRequest(); }
		else				{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }

		xmlhttp.onreadystatechange=function()
		{
			if (xmlhttp.readyState==4 && xmlhttp.status==200)
			{
				data = xmlhttp.responseText;
// alert(data);
				$(form_tag).removeAttr("disabled"); 
				$(form_tag).html(data);
			}
		}
		xmlhttp.open("POST","characteristics.php?timestamp=" + new Date().getTime(),true);
		xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlhttp.send
		(
			"funzione="	+ funzione
		+	"&id="		+ applic
		+	"&id2="		+ comeR
		+	"&lng="		+ lang
		);
}
if (1==0){//	alert('*** METODO 3-b ***');
		var xmlhttp=catchthebrowser();

		xmlhttp.onreadystatechange=function()
		{
			if (xmlhttp.readyState==4 && xmlhttp.status==200)
			{
				data = xmlhttp.responseText;
// alert(data);
				$(form_tag).removeAttr("disabled"); 
				$(form_tag).html(data);
			}
		}
		xmlhttp.open("POST","characteristics.php?timestamp=" + new Date().getTime(),true);
		xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlhttp.send
		(
			"funzione="	+ funzione
		+	"&id="		+ applic
		+	"&id2="		+ comeR
		+	"&lng="		+ lang
		);
}
	}


	function ContaRecords(i)
	{
		i++; if (i > 10) { return false; }

		var applic	= $("select#applicazione option:selected").attr('value');
		var comeR	= $("select#comeRuota option:selected").attr('value');
		var v_dmt	= $("select#Diametro option:selected").attr('value');
		var v_suppt	= $("select#TipoSupporto option:selected").attr('value'); 
		var v_lamier	= $("select#TipoLamiera option:selected").attr('value');
		var v_pavt	= $("select#TipoPavimenti option:selected").attr('value'); 
		var v_vol	= $("select#volvenza option:selected").attr('value'); 
		var v_Ruot	= $("select#TipoRuota option:selected").attr('value');
		var v_por	= $("select#Portata option:selected").attr('value');
		var v_seriesup	= $("select#SerieSupporti option:selected").attr('value'); 

		if(applic==0) {applic=1}; if(comeR==0) {comeR=3};

		if (
			v_dmt==-1
		||	v_suppt==-1
		||	v_lamier==-1
		||	v_pavt==-1
		||	v_vol==-1
		||	v_Ruot==-1
		||	v_por==-1
		||	v_seriesup==-1
		) { setTimeout(function () { ContaRecords(i); }, 500); return false; };

		var xmlhttp=catchthebrowser();

		xmlhttp.onreadystatechange=function()
		{
			if (xmlhttp.readyState==4 && xmlhttp.status==200)
			{
				data = xmlhttp.responseText;
				$("#result").html(data);
			}
		}
		xmlhttp.open("GET","elementscount.php?timestamp=" + new Date().getTime(),true);
		xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlhttp.send
		(
			"id="		+ applic
		+	"&id2="		+ comeR
		+	"&dmt="		+ v_dmt
		+	"&suppt="	+ v_suppt
		+	"&lamier="	+ v_lamier
		+	"&pavt="	+ v_pavt
		+	"&vol="		+ v_vol
		+	"&Ruot="	+ v_Ruot
		+	"&por="		+ v_por
		+	"&seriesup="	+ v_seriesup
		);
		return true;
	}


	function catchthebrowser()
	{
		var xmlhttp=false;

		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
// alert('passo1');
			try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
			catch (e)
			{
// alert('passo2');
				try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
				catch (e) { xmlhttp = false; }
			}
		@end @*/

		if (!xmlhttp && typeof XMLHttpRequest!='undefined')
		{
// alert('passo3');
			try { xmlhttp = new XMLHttpRequest(); }
			catch (e) { xmlhttp = false; }
		}
		if (!xmlhttp && window.createRequest)
		{
// alert('passo4');
			try { xmlhttp = window.createRequest(); }
			catch (e) { xmlhttp = false; }
		}
		return xmlhttp;
	}
});

poi cercherò attraverso gli alert di capire il diverso comportamento delle variabili su XP IE8 o precedenti. Cosa ne dici è corretto l'approccio?

Ovviamente modifico anche le variabili in php
 
Ultima modifica:
Vedi l'allegato tabella5_GET.zip

ti passo un nuovo zip, funziona tutto con le GET, non ci sono più POST per essere chiari

ma ho cambiato il formato delle GET rispetto al POST, ho passato tutti i parametri nell' URL
ovvero, per intenderci, script.php?par1=xyz&....
ho pensato di fare in questo modo perché, succede come se io scrivessi l' URL direttamente nel browser,
da cui se noti, tutti i send sono vuoti (forse era meglio mettere un NULL ma non sono sicuro)

poi ho eliminato i POST (GET) dalla classe preferendo passare le variabili direttamente alle funzioni,
non dovrebbe cambiare nulla ma così lavoriamo con variabili definite, i due script si incaricano di passarle
eventuali errori devono essere imputabili solo agli script

non ho toccato altro ... salvo inezie per risparmiare tempo nelle modifiche e prove

ora utilizzando la versione GET,
suggerirei di scegliere uno dei metodi, attivando l'alert che visualizza la risposta del server,
in modo da capire se il server risponde bene ed é veramente il browser ad andare in tilt
o viceversa il server risponde male

se poi sei gentile da metterla in linea in un ambiente di test, vorrei vedere l'effetto che fa nelle condizioni sopraddette

ho quindi cercato di "assegnare le responsabilità" ai vari pezzettini di software
ora dovremmo essere nella condizione di capire chi va in default ... se ci va
ciao
Marino
 
Ciao Marino,

Per la prima volta ho visto l'alert (1>10) in IE 11 su Windows 8. Non riesco davvero a capire il motivo di questi continui cambiamenti nella risposta da server! E' possibile aumentare il valore di sospensione di 500 (0,5 sec)? Ho provato a fissarlo a 750 ma comunque ho lo stesso il messaggio di alert (1>10).

Vorrei poi chiederti se sei sicuro che sia opportuno inserire il seguente codice in Contarecord:

Codice:
var xmlhttp=catchthebrowser();

		xmlhttp.onreadystatechange=function()
		{
			if (xmlhttp.readyState==4 && xmlhttp.status==200)
			{
				data = xmlhttp.responseText;
// alert(data);
				$("#result").html(data);
			}
		}

Se ho inteso bene questa parte di codice viene lanciata comunque i tutti i 3 i metodi e ho la sensazione ( e non la certezza) che peggiori i risultati sotto Windows 8 IE 11 (per me basilare perché attualissima).

Caricherò la nuova versione e vediamo un po' come funziona.

Devo farti davvero i complimenti per la tua tenacia!
 

Discussioni simili