2011-05-11 107 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

相關問題