dannato IE, problema javascript VS jscript

Stato
Discussione chiusa ad ulteriori risposte.

Cynical

Utente Silver
10 Febbraio 2011
2
1
0
51
Buon giorno ragazzi,
oggi vi delizierò con una nuova puntata dellla faida tra browser, o meglio tra javascript e jscript.
Ho scritto un calcolatore di mutuo (approssimativo ovviamente...con tanto di disclaimer :) ) per il sito di una agenzia immobiliare.
Su firefox funziona perfettamente, su chrome anche....rullo di tamburi :tamburomg:....non funziona su IE.
Ecco il codice :

Codice:
// questa funzione dato un numero num a virgola mobile ne restituisce uno con n cifre decimali...
function nCifre(num, n)
{
  var powTen = Math.pow(10,n);
  var corrected = powTen * num;
  corrected = Math.round(corrected);
  corrected /= powTen;
  return corrected;
}
//il nome della funzione parla da solo...
function isInteger(num)
{ 
  if(num == Math.round(num))
       return true;
  else
       return false;  
}
// approssima i centesimi ad un multiplo di 10...per estetica
function approxCents(num)
{
  num = nCifre(num, 2);
  if(!isInteger(num))
    {
      var buff = num*100;
      var cents = buff%10;
      cents = nCifre(cents,0);
      buff /= 10;
      buff = nCifre(buff,0);
      cents += (buff%10)*10;
      cents = nCifre(cents,0);
      buff /=10;
      buff = nCifre(buff,0);
      while(cents%10)
           cents++;

      buff *= 100;
      buff += cents;
      return buff/100;
    }
    else
         return num;
}
/* dato un numero num a virgola mobile restituisce una stringa
   contenente le cifre del numero con la virgola al posto del punto... */
function printFloatVirgola(num)
{ 
  var numStr = num.toString();
  var size = numStr.length;
  
  var formatted = "";
  for(var i=0; i<size; i++)            
      if(numStr.charAt(i) == '.')
           formatted += ',';
      else 
           formatted += numStr.charAt(i);

  return formatted;
}

/* dato un numero num a virgola mobile restituisce una stringa del tipo "€ c1 c2 ... cn,d1 d2"
   dove c1, c2, ..., cn sono le cifre della parte intera del numero e d1 d2 sono le cifre dei centesimi di euro... */
function formatEuro(num)
{ 
  num = approxCents(num);
  var money = "€ ";

  if(!((num*100) % 10)) // se la seconda cifra decimale è 0...
       if(!((num*10) % 10)) // se lo è anche la seconda...
           money += (num+",00");
       else
          {
            money += printFloatVirgola(num);
            money += '0';
          }
  else
       money += printFloatVirgola(num); 
 
  return money;
}

// restituisce i tassi per calcolare il mutuo in funzione del numero degli anni e del tipo di mutuo, fisso o variabile...
function calcTasso(tipoM, anniM)
{
  if(tipoM == "fisso")
  {
      if(anniM == 5)
           return 1.0286;
      else
           if(anniM == 10) 
                 return 1.0344;
           else 
                 if(anniM == 15) 
                      return 1.0375;
                 else
                      if(anniM == 20) 
                          return 1.0382;
                      else
                          if(anniM == 25)
                               return 1.0377;
                          else
                               if(anniM == 30)
                                   return 1.0375;
  }
  else
       {return 1.01;
       }
}
//il nome parla da solo....
function calcMutuo()
{  
   var tipoM = document.getElementsByName("tipo")[0].value; 
   var capitaleM = document.getElementsByName("capitale")[0].value;
   var durataM = document.getElementsByName("durata")[0];
   durataM = durataM.options[durataM.selectedIndex].value;
   var rataM = document.getElementsByName("rata")[0];
   var tassoM = calcTasso(tipoM, durataM);

   rataM.innerHTML = "<p style='font-size:1;'>Importo rata "+formatEuro((capitaleM*1.015*tassoM)/(durataM*12))+"</p>";

   rataM.innerHTML += "\n\n*L'importo risultante è puramente indicativo, calcolato utilizzando il tasso Euribor 3 mesi o il tasso IRS di periodo maggiorati di uno spread medio pari a 1,5%";
}

mi potreste aiutare a renderlo compatibile?
:)
 
Codice:
 rataM.innerHTML +=

il problema dovrebbe stare qua: fino a IE8, avevo notato io stesso, chrome e IE avevano attributi diversi per modificare un elemento
 
Malex ha detto:
Codice:
 rataM.innerHTML +=

il problema dovrebbe stare qua: fino a IE8, avevo notato io stesso, chrome e IE avevano attributi diversi per modificare un elemento

si anche io credo che sia nell'innerHTML il problema....dannata microsoft.
Ecco l'html :

Codice:
<table style="margin-left: 10px; size=10;">

  <tr> 

      <h1>Mutuo facile!</h1>

  </tr>

  <tr>

    <!--  <img src="<?php bloginfo('template_url'); ?>/includes/renderCalc.jpeg" /> -->

  </tr>

  <tr>

     <td><br>Tipo :  

         <select name ="tipo">

            <option value="variabile">Tasso Variabile</option>

            <option value="fisso">Tasso Fisso</option>

         </select>

         <br>

     </td>

  </tr>

  <tr>

     <td><br>Capitale in € :

         <input type="text" name ="capitale" size="10" maxlength="10" />

     </td>

  </tr>

  <tr>

     <td><br>Durata :

         <select name ="durata">

            <option value="5">5 anni</option>

            <option value="10">10 anni</option>

            <option value="15">15 anni</option>

            <option value="20">20 anni</option>

            <option value="25">25 anni</option>

            <option value="30">30 anni</option>

         </select><br>

     </td><br>

  </tr>

  <tr>

     <td><br>

        <a class="button" align="center" style="margin-left: 5px;" OnClick="calcMutuo()"> Calcola </a><br>

     </td>

  </tr>

  <tr>  

     <td><br><p style="font-size: 4;" name="rata"></p></td>

  </tr>

  

</table>
 
http://www.smashingmagazine.com/2009/10/14/css-differences-in-internet-explorer-6-7-and-8/

^ intanto di do questo link nel caso tu avessi problemi coi css anche.

http://balanagaraj.wordpress.com/2008/05/07/javascript-differences-in-mozilla-firefox-and-internet-explorer/

^ la funzione setText qua dovrebbe essere quello che fa per te

http://www.impressivewebs.com/7-javascript-differences-between-firefox-ie/

^ per una consultazione rapida

GIYF
 
Ho apportato delle modifiche:

ecco il javascript :
Codice:
function setText(control, value)
{
if (document.all)
    {
        control.innerText = value;
    }
else
    {
        control.textContent = value;
    }
}
// questa funzione dato un numero num a virgola mobile ne restituisce uno con n cifre decimali...
function nCifre(num, n)
{
  var powTen = Math.pow(10,n);
  var corrected = powTen * num;
  corrected = Math.round(corrected);
  corrected /= powTen;
  return corrected;
}
//il nome della funzione parla da solo...
function isInteger(num)
{ 
  if(num == Math.round(num))
       return true;
  else
       return false;  
}
// approssima i centesimi ad un multiplo di 10...per estetica
function approxCents(num)
{
  num = nCifre(num, 2);
  if(!isInteger(num))
    {
      var buff = num*100;
      var cents = buff%10;
      cents = nCifre(cents,0);
      buff /= 10;
      buff = nCifre(buff,0);
      cents += (buff%10)*10;
      cents = nCifre(cents,0);
      buff /=10;
      buff = nCifre(buff,0);
      while(cents%10)
           cents++;

      buff *= 100;
      buff += cents;
      return buff/100;
    }
    else
         return num;
}
/* dato un numero num a virgola mobile restituisce una stringa
   contenente le cifre del numero con la virgola al posto del punto... */
function printFloatVirgola(num)
{ 
  var numStr = num.toString();
  var size = numStr.length;
  
  var formatted = "";
  for(var i=0; i<size; i++)            
      if(numStr.charAt(i) == '.')
           formatted += ',';
      else 
           formatted += numStr.charAt(i);

  return formatted;
}

/* dato un numero num a virgola mobile restituisce una stringa del tipo "€ c1 c2 ... cn,d1 d2"
   dove c1, c2, ..., cn sono le cifre della parte intera del numero e d1 d2 sono le cifre dei centesimi di euro... */
function formatEuro(num)
{ 
  num = approxCents(num);
  var money = "€ ";

  if(!((num*100) % 10)) // se la seconda cifra decimale è 0...
       if(!((num*10) % 10)) // se lo è anche la seconda...
           money += (num+",00");
       else
          {
            money += printFloatVirgola(num);
            money += '0';
          }
  else
       money += printFloatVirgola(num); 
   
  return money;
}

// restituisce i tassi per calcolare il mutuo in funzione del numero degli anni e del tipo di mutuo, fisso o variabile...
function calcTasso(tipoM, anniM)
{
  if(tipoM == "fisso")
  {
      if(anniM == 5)
           return 1.0286;
      else
           if(anniM == 10) 
                 return 1.0344;
           else 
                 if(anniM == 15) 
                      return 1.0375;
                 else
                      if(anniM == 20) 
                          return 1.0382;
                      else
                          if(anniM == 25)
                               return 1.0377;
                          else
                               if(anniM == 30)
                                   return 1.0375;
  }
  else
       {return 1.01;
       }
}
//il nome parla da solo....
function calcMutuo()
{   
   var tipoM = document.getElementsByName("tipo")[0].value; 
   var capitaleM = document.getElementsByName("capitale")[0].value;
   var durataM = document.getElementsByName("durata")[0];
   durataM = durataM.options[durataM.selectedIndex].value;
   var rataM = document.getElementsByName("rata")[0];
   var disclaimerM = document.getElementsByName("disclaimer")[0];
   var tassoM = calcTasso(tipoM, durataM);

   setText(rataM, "Importo rata "+formatEuro((capitaleM*1.015*tassoM)/(durataM*12)));
   setText(disclaimerM, "\n\n*L'importo risultante è puramente indicativo, calcolato utilizzando il tasso Euribor 3 mesi o il tasso IRS di periodo maggiorati di uno spread medio pari a 1,5%");
 
}

ecco l'html

Codice:
<table style="margin-left: 10px; size=10;">

  <tr> 

      <h1>Mutuo facile!</h1>

  </tr>

  <tr>

    <!--  <img src="<?php bloginfo('template_url'); ?>/includes/renderCalc.jpeg" /> -->

  </tr>

  <tr>

     <td><br>Tipo :  

         <select name ="tipo">

            <option value="variabile">Tasso Variabile</option>

            <option value="fisso">Tasso Fisso</option>

         </select>

         <br>

     </td>

  </tr>

  <tr>

     <td><br>Capitale in € :

         <input type="text" name ="capitale" size="10" maxlength="10" />

     </td>

  </tr>

  <tr>

     <td><br>Durata :

         <select name ="durata">

            <option value="5">5 anni</option>

            <option value="10">10 anni</option>

            <option value="15">15 anni</option>

            <option value="20">20 anni</option>

            <option value="25">25 anni</option>

            <option value="30">30 anni</option>

         </select><br>

     </td><br>

  </tr>

  <tr>

     <td><br>

        <a class="button" align="center" style="margin-left: 5px;" OnClick="calcMutuo()"> Calcola </a><br>

     </td>

  </tr>

  <tr>  

     <td><br><p style="font-size: 4;" name="rata"></p><p name="disclaimer"></p></td>

  </tr>

  

</table>

in teoria adesso utilizzando l'attributo innerText per IE e textContent per FF dovrebbe funzionare tutto,ma continua a funzionere solo su FF.
Ho fatto delle prove su IE....tutte le altre funzionevanno bene, ho seguito passo passo l'esecuzione dello script con delle alert,esegue tutte le dovute operazioni fino a che non deve andare a mettere i risultati conclusivi nel componente html opportuno, che faccio?
 
io a suo tempo invece, al posto della funzione ecc (sono andato a vedere asd) scrivevo

Codice:
roba.innerHTML = roba.textContent = contenuto

prova a vedere così (prova anche ad invertire l'ordine asd)
Più di questo non so che dirti.
 
innertHTML, innerText ecc. NON sono standard dom 2.
innerHTML credo sia stato inserito nello standard dom3 (che ie9 supporta, ma non ie8)
 
ho detto che non è standard, non che non è implementato... ma se non è standard, la differenza nei comportamenti è una cosa non criticabile
 
ragazzi ho risolto con la libreria jquery...
rende l'innerHTML cross-browser....

così:

$(#id_elemento).html("codice html da inserire...");

tutto qui. Ora devo studiarmi come funzione perchè non mi piace usare black box ignote, ma intanto ho risolto il problema che è di tipo lavorativo :)
 
se non erro ${elemento} non funziona coi vecchi IE (in particolare IE7 sono abbastanza sicuro di no, l'8 non so).
Megglio che controlli.
 
Stato
Discussione chiusa ad ulteriori risposte.