2013-04-29 18 views
1

我想設置一個小文章選擇器。雖然它適用於Firefox和Chrome以及IE7,但它在IE8和IE9上存在問題。Javascript在NaN中顯示錯誤的表單字段在IE中 - 在Firefox和Chrome中工作

  • 在IE 8和9中,點擊時會將「增加」字段更改爲「NaN」。 (編輯:將信函在號碼前解決)
  • 在IE9中會更新「Warenkorb」,但地方「NaN」或
    領域「\/」爲「Anzahl」。 (編輯:通過在數字前面放置一個字母來解決)
  • 在IE8中它完全忽略了更新函數。 (編輯:與innerHTML-Bug有關)

對我來說,似乎我無法達到窗體本身。我已經嘗試使用document.forms[0]document.getElementById["bestmult"]來代替,以防交付的對象不是表單中的字段,但這並沒有改變任何內容。 我覺得這個解決方案非常簡單,但我不能把它放在手指上。

下面是代碼:

<script> 
     var sumarray = new Array(); 
     var artarray = new Array(); 
     var costarray = new Array(); 
     var counter=0; 

    function increase(obj, field, type){ 
     var form = obj.form; 
     var value = parseInt(form.elements[field].value, 10); 
     value++; 
     form.elements[field].value = value; 
     updateCosts(obj, field, type); 
    } 
    function decrease(obj, field, type){ 
     var form = obj.form; 
     var value = parseInt(form.elements[field].value, 10); 
     if(value > 0){ 
      value--; 
      form.elements[field].value = value; 
      updateCosts(obj, field, type); 
     } 
    } 

    function updateCosts(obj, field, type){ 
     var form = obj.form; 

     var exist = artarray.indexOf(form.elements[field].name); 

     var preis = 0; 
     if (type == 'b'){ 
      preis = 19.95; 
     }else if (type == 'p') { 
      preis = 29.95; 
     } 

     if (exist != -1){ 
      if (form.elements[field].value == 0){ 
       sumarray.splice(exist , 1); 
       artarray.splice(exist , 1); 
       costarray.splice(exist , 1); 
       counter--; 
      }else {  
       sumarray[exist] = form.elements[field].value; 
       artarray[exist] = form.elements[field].name; 
       costarray[exist] = preis; 
      } 
     }else { 
      sumarray[counter] = form.elements[field].value; 
      artarray[counter] = form.elements[field].name; 
      costarray[counter] = preis; 
      counter++; 
     } 

     var completestring = ""; 

     if (counter > 0) { 
      var product = 0; 
      completestring += "<h1>Warenkorb</h1><table border=0><tr style='background:gray;' align='center'><td width=110 align='center'>Artikel</td><td width=80>Anzahl</td><td align='center' width=60>Preis</td><td align='center' width='40'>Del</td></tr>"; 

      for(var i=0;i<counter;i++){ 
       completestring += "<tr><td>"+artarray[i].replace("_", " ")+"</td><td align=center>"+sumarray[i]+"</td><td align=center>"+costarray[i]+"</td><td align=center><img src='img/trash.png' onclick='setZero(\""+artarray[i]+"\")'></td></tr>"; 
       product += parseInt(sumarray[i])*parseInt(costarray[i]); 

      } 
      completestring += "</table><h2>"+(product).toFixed(2)+"</h2>"; 
     } else { 
      completestring += "<h1>Warenkorb</h1>"; 

     } 

     document.getElementById("sum").innerHTML = completestring; 
    } 

    function setZero(element) { 
     var form = document.forms[0]; 
     form.elements[element].value = "0"; 
     var obj = form.elements[element]; 
     updateCosts(obj, element, "b"); 

    } 
</script> 
<div id="sum"> 
</div> 
<form id="bestmult" action="test2.html" method="post"> 
<table cellpadding="0" cellspacing="0" border="0"> 
    <tr> 
     <td rowspan="2"><input type="text" name="1_Basis" value="0" onblur="updateCosts(this, '1_Basis', 'b')" /></td> 
     <td><input type="button" value=" /\ " onclick="increase(this, '1_Basis', 'b')" class="button" ></td> 
    </tr><tr> 
     <td><input type="button" value=" \/ " onclick="decrease(this, '1_Basis', 'b')" class="button" ></td> 
    </tr> 
</table> 

此代碼是事業不是一切有(雖然這可能會影響眼前的一切問題),所以不要用腳本打擾標籤,或不完整的表格,這些地方只是添加完成,展現這一切是如何結合在一起,而無需張貼整個代碼。

編輯:看來,IE8和9與我通過文本框命名方式有問題。我可以通過簡單地在開始處放置一個z來解決大部分問題,以後我可以簡單地剝離以恢復正確的文本。現在只是IE8似乎並不喜歡innerHTML。我在互聯網上發現了很多,但沒有任何真正的工作。

回答

0

好了,所以這裏是一起打包成一個答案解決方案:

我面臨兩個問題:

第一個是,在XML屬性名稱不能以數字開頭。我通過簡單地在前面添加一個字母來解決這個問題,我可以使用替換函數稍後刪除字符串。

第二個問題是IE8沒有Array函數indexOf()。謝謝你555k的幫助,你給了我最後一塊拼圖。我寫了一個小的解決辦法,適合我的情況:

var exist = -1; 
var needle = form.elements[field].name; 
for (var i=0;i<counter;i++){ 
    if (artarray[i].indexOf(needle) != -1){ 
     exist = i; 
    } 
} 

這不正是我想要的,所以它適合我的問題。原因並不是解決老年人瀏覽器不具備「indexOf()」功能的問題,但也許有人可以使用它。

1

檢查我修改的腳本代碼

<script> 
     var sumarray = new Array(); 
     var artarray = new String(); 
     var costarray = new Array(); 
     var counter=0; 

    function increase(obj, field, type){ 
     var form1 = obj.form; 
     //alert(obj.form1.elements[0].value); 
     var value = parseInt(form1.elements(field).value, 10); 
     value++; 
     form1.elements(field).value = value; 
     updateCosts(obj, field, type); 
    } 
    function decrease(obj, field, type){ 
     var form = obj.form; 
     var value = parseInt(form.elements(field).value, 10); 
     if(value > 0){ 
      value--; 
      form.elements(field).value = value; 
      updateCosts(obj, field, type); 
     } 
    } 

    function updateCosts(obj, field, type){ 
     var form = obj.form; 

     var exist = artarray.indexOf(form.elements(field).name); 

     var preis = 0; 
     if (type == 'b'){ 
      preis = 19.95; 
     }else if (type == 'p') { 
      preis = 29.95; 
     } 

     if (exist != -1){ 
      if (form.elements(field).value == 0){ 
       sumarray.splice(exist , 1); 
       artarray.splice(exist , 1); 
       costarray.splice(exist , 1); 
       counter--; 
      }else {  
       sumarray[exist] = form.elements(field).value; 
       artarray[exist] = form.elements(field).name; 
       costarray[exist] = preis; 
      } 
     }else { 
      sumarray[counter] = form.elements(field).value; 
      artarray[counter] = form.elements(field).name; 
      costarray[counter] = preis; 
      counter++; 
     } 

     var completestring = ""; 

     if (counter > 0) { 
      var product = 0; 
      completestring += "<h1>Warenkorb</h1><table border=0><tr style='background:gray;' align='center'><td width=110 align='center'>Artikel</td><td width=80>Anzahl</td><td align='center' width=60>Preis</td><td align='center' width='40'>Del</td></tr>"; 

      for(var i=0;i<counter;i++){ 
       completestring += "<tr><td>"+artarray[i].replace("_", " ")+"</td><td align=center>"+sumarray[i]+"</td><td align=center>"+costarray[i]+"</td><td align=center><img src='img/trash.png' onclick='setZero(\""+artarray[i]+"\")'></td></tr>"; 
       product += parseInt(sumarray[i])*parseInt(costarray[i]); 

      } 
      completestring += "</table><h2>"+(product).toFixed(2)+"</h2>"; 
     } else { 
      completestring += "<h1>Warenkorb</h1>"; 

     } 

     document.getElementById("sum").innerHTML = completestring; 
    } 

    function setZero(element) { 
     var form = document.forms[0]; 
     form.elements[element].value = "0"; 
     var obj = form.elements[element]; 
     updateCosts(obj, element, "b"); 

    } 
</script> 

IE8的indexOf()方法Array會給錯誤。​​

+0

感謝您的快速回答,但'indexOf()'也是Array的一個函數。雖然你的解決方案可能會解決一些問題 – HolgerS 2013-04-29 09:37:33

+0

快速回答:-) ..我不認爲這很快...我在這裏檢查我ie8。因爲ie 8 indexOf會給出錯誤。請看這個鏈接http://stackoverflow.com/questions/3629183/why-doesnt-indexof-work-on-an-array-ie8 – 999k 2013-04-29 09:44:26

+0

啊,是的,那就是它 – HolgerS 2013-04-29 10:14:32

0

我認爲這個問題是有關通過「本」的功能。它似乎在傳遞按鈕。

嘗試用

var form=document.forms[0] 

更換

var form = obj.form; 

而忽略了對 「目標文件」

+0

是的,正如前面提到的我已經嘗試過,沒有太多運氣。 'object.form'確實在我迄今爲止測試過的任何瀏覽器中提供了正確的表單。那不是。 – HolgerS 2013-04-29 09:41:59

相關問題