2015-10-15 80 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事件处理程序的范围。”

相关问题