2011-05-11 111 views
4

我正在为我的学校开发这个webapp。该页面应该通过url参数“class”过滤条目。这工作正常,据我所知,但当我尝试更改过滤器时,它给“TypeError:对象不是一个函数”。我究竟做错了什么? TypeError:对象不是函数

<html> 
    <head> 
     <TITLE>Cancelled lessons</TITLE> 

    </head> 
    <body> 

     <script>   
      function filter(text){ 
       text = text.toLowerCase(); 
       for (i=0;i<lessonList.length;i++){ 
        if(lessonList[i].innerHTML.toLowerCase().indexOf(text)==-1){ 
         lessonList[i].style.display = "none"; 
        } 
        else{ 
         lessonList[i].style.display =""; 
        } 
       } 
      } 

      function gup(name) 
      { 
       name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
       var regexS = "[\\?&]"+name+"=([^&#]*)"; 
       var regex = new RegExp(regexS); 
       var results = regex.exec(window.location.href); 
       if(results == null) 
       return ""; 
       else 
       return results[1]; 
      } 
     </script> 

     <form> 
      Filter: <input type="text" id="filter" oninput="filter(document.getElementById('filter'))"/> 
     </form> 

     <div id="lessons"> 
      <div class="entry"> MaA 11:00 C131 Ej NV3C</div> 
     </div> 

     <script> 
      var lessonList = document.getElementsByClassName("entry"); 
      var filterField =document.getElementById("filter"); 
      filterField.value = gup("class"); 
      filter(filterField.value); 
     </script> 
    </body> 
</html> 
+0

[oninput](http://msdn.microsoft.com/en -us/library/gg592978%28v = vs.85%29.aspx)是html5,在IE <9中不受支持,并且有一些[问题](http://blog.danielfriesen.name/2010/02/16/ html5-browser-maze-oninput-support /) - onkeypress或onkeyup怎么样? – mplungjan 2011-05-11 05:28:38

+0

怎么了'text = text.toLowerCase();'如果在这种情况下,'text'是一个参数,其值是一个'object' document.getElementById('filter')''你通过'filter(document。的getElementById( '过滤器'))'? – tradyblix 2011-05-11 05:36:31

+0

错误在我这边,它的意思是要通过filter.value(现在改为filterfield.value) – remuladgryta 2011-05-11 08:36:13

回答

4

它看起来像“ oninput“处理程序从窗体范围(document.forms [0])调用过滤器函数,而不是全局调用。如果您检查document.forms [0] .filter的值,它将返回输入标记。您只需确保函数名称与输入名称/ ID不同。

这也意味着你不需要通过ID每次得到的输入域,它已经作用域为

<input type="text" id="filterField" oninput="filter(this.value)"/> 
+0

谢谢,这是我在js中做的第一件事,作为一名c#程序员,这真是愚蠢,我没有想到! – remuladgryta 2011-05-11 08:12:56

0

看看这个解决您的问题

<html> 
    <head> 
     <TITLE>Cancelled lessons</TITLE> 

    </head> 
    <body> 

     <script>   
      function fltr(text){ 
       text = text.toString().toLowerCase(); 
       for (i=0;i<lessonList.length;i++){ 
        if(lessonList[i].innerHTML.toLowerCase().indexOf(text)==-1){ 
         lessonList[i].style.display = "none"; 
        } 
        else{ 
         lessonList[i].style.display =""; 
        } 
       } 
      } 

      function gup(name) 
      { 
       name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
       var regexS = "[\\?&]"+name+"=([^&#]*)"; 
       var regex = new RegExp(regexS); 
       var results = regex.exec(window.location.href); 
       if(results == null) 
       return ""; 
       else 
       return results[1]; 
      } 
     </script> 

     <form> 
      Filter: <input type="text" id="filter" oninput="fltr(document.getElementById('filter'))"/> 
     </form> 

     <div id="lessons"> 
      <div class="entry"> MaA 11:00 C131 Ej NV3C</div> 
     </div> 

     <script> 
      var lessonList = document.getElementsByClassName("entry"); 
      var filterField =document.getElementById("filter"); 
      filterField.value = gup("class"); 
      fltr(filterField.value); 
     </script> 
    </body> 
</html> 

说明:

你与输入文本框的id相同名称进行命名的功能。 当我更改函数的名称时,它停止了该错误。

+0

'text = text.toString()。toLowerCase()''会给你'[object htmlinputelement]'因为'text'是一个参考'document.getElementById('filter')' – tradyblix 2011-05-11 05:37:35

2

你的问题是你的文本输入和你的功能共享一个共同的名字。尝试仍然有一些问题,你的代码重新命名如下

<input type="text" id="filterText" oninput="filter(document.getElementById('filterText'))"/> 

,但我会离开那些你要弄清楚,因为这是学校里的功课;-)

+0

从这个意义上说,这不是一个学校任务,因为我是我们学校计算机联盟的负责人,所以我被校长要求做。 – remuladgryta 2011-05-11 08:26:20

相关问题