2015-10-15 77 views
2

上次我發現這段代碼包含在一些 教程中。它只是在定義的範圍內打印數字。Javascript「write」as function name and more

<!DOCTYPE html> 
<html lang="pl"> 
<html> 
    <head> 
     <meta charset="utf-8" /> 

     <script type="text/javascript"> 

      function wypisz() 
      { 
       var liczba1 = document.getElementById("pole1").value; 
       var liczba2 = document.getElementById("pole2").value; 
       var napis = ""; 

       for (i=liczba1; i<=liczba2; i++) 
       { 
        napis = napis + i + " "; 
       } 
       document.getElementById("wynik").innerHTML = napis; 
      } 

     </script> 

    </head> 
    <body> 

     <input type="text" id="pole1" /> 
     <input type="text" id="pole2" /> 
     <input type="submit" value="Pokaż" onclick="wypisz()"/> 

     <div id="wynik"></div> 

    </body> 
</html> 
  1. 當我改變函數名「wypisz()」到「寫()」,我按下按鈕時,頁面變成白色和永無止境的開始裝載。 是否將「寫入」保留爲全局函數名稱?我看不出在這裏: JavaScript Reserved Words
  2. 在相同的代碼,當我定義提起<在第二個第一輸入文本和11-19>的< 2-9範圍>,什麼都不會發生。但是,當我在第一個數字前加零時,它就起作用了。這是什麼意思?

這是我的解決方法(我增加了一個功能,從上往下數):

<head> 
    <meta charset="utf-8" /> 

    <script type="text/javascript"> 

     function _write() 
     { 
      var number1 =document.getElementById("field1").value; 
      var number2 =document.getElementById("field2").value; 
      var tab=new Array(); 
      var number=Math.abs(number2-number1); 

      if(number1<10 && number1>1) number1=0+number1;//add zero 


       for(i=0;i<=number;i++) 
       { 
        tab.push(number1); 
        if(number1<number2) 
        ++number1;   
        else 
        --number1;   //bigger-smaller 
       } 


      document.getElementById("result").innerHTML=tab.join(" "); 
     } 

    </script> 

</head> 
<body> 

    <input type="text" id="field1" /> 
    <input type="text" id="field2" /> 
    <input type="submit" value="SHOW" onclick="_write()"/> 

    <div id="result"></div> 

</body> 

心想: 「問題解決」。然後我看到了這一點:

result

+1

'寫()'似乎調用'document.write()的',而不是你的自己的功能。 – Barmar

+0

@Barmar我永遠無法找到它在spec中寫入的位置,但_JavaScript_寫入的屬性具有'__proto__ === Object.prototype'和一些行爲,就像'with(this){/ * code * /} ',還有更多的東西,我現在也不能確定 –

回答

0

當你做「的getElementById」文本字段,我相信這是返回值的字符串。這就是爲什麼在第一個數字更改答案之前添加「0」的原因,因爲字符串比較比較字符從左到右,並且在添加它之前將0轉換爲字符串,因爲該變量已經是字符串。

您可能想要將您的值轉換爲int。你可以做一些類似「number1 = parseInt(number1)」的東西,甚至可以將整個document.getelement函數包裝在「parseInt」命令中。這應該可以工作,因爲你期待它的工作。

編輯:回答關於寫入的問題,它看起來像是一個DOM函數。 http://www.w3schools.com/jsref/met_doc_write.asp

它不是保留的,但它看起來像是在頁面加載後調用函數,它會替換頁面中的所有HTML。您的onclick函數可能會綁定到文檔的寫入功能,而不是腳本中的函數。

0

  function wypisz() 
 
      { 
 
       var liczba1 = parseInt(document.getElementById("pole1").value); 
 
       var liczba2 = parseInt(document.getElementById("pole2").value); 
 
       var napis = ""; 
 
       for (i=liczba1; i<=liczba2; i++) 
 
       { 
 
        napis = napis + i + " "; 
 
       console.log('inseide'); 
 
\t \t \t \t } 
 
\t \t \t \t 
 
       document.getElementById("wynik").innerHTML = napis; 
 
      }

0

要只回答你的第一個問題,當你通過一個元素的onClick屬性設置爲的javascipt的代碼片段(或任何其他「的OnEventName」屬性)在HTML中定義事件處理程序,瀏覽器會爲您的代碼片段創建一個函數,但不在全局範圍中。

HTML事件處理函數給出,直到達到DOM的頂部,其搜索處理程序隨後依次搜索父對象(在你的情況下的<INPUT>元件)上設置的對象的屬性的對象範圍鏈,然後搜索全局變量以查找標識符的值。

因此,當您從HTML中調用write時,在處理程序的作用域鏈中找到document.write,然後才能在全局作用域中獲得同名的函數。如果您使用element.addEventListener添加處理程序,它應該按預期工作。

範圍鏈的起源是Netscape認爲窗體的屬性和文檔對象應該位於事件處理函數的範圍鏈中以簡化編程。搜索元素和文檔對象之間的每個父節點都是在20世紀90年代後期的瀏覽器戰爭中出現的。

另請參見: 「JavaScript中的權威指南」 奧賴利,節 「19.1.6事件處理程序的範圍。」

相關問題