TypeError: объект не является функцией - PullRequest
4 голосов
/ 11 мая 2011

Я разрабатываю это веб-приложение для своей школы.Страница должна фильтровать записи по параметру url «класс».Насколько я могу судить, это работает отлично, но когда я пытаюсь изменить фильтр, выдается «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>

Ответы [ 3 ]

4 голосов
/ 11 мая 2011

Похоже, что обработчик "oninput" вызывает функцию фильтра из области действия формы (document.forms [0]), а не глобально. Если вы проверите значение document.forms [0] .filter, он вернет тег ввода. Вам просто нужно убедиться, что имя функции отличается от имени ввода / идентификатора.

Это также означает, что вам не нужно каждый раз получать поле ввода по идентификатору, оно уже определено как this

<input type="text" id="filterField" oninput="filter(this.value)"/>
2 голосов
/ 11 мая 2011

Проблема в том, что у вашего ввода текста и вашей функции общее имя.Попробуйте переименовать следующим образом:

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

В вашем коде все еще есть проблемы, но я оставлю их вам, чтобы разобраться, учитывая, что это школьное задание; -)

0 голосов
/ 11 мая 2011

Посмотрите, решит ли это вашу проблему

<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>

Пояснение:

Вы назвали функцию с тем же именем, что и идентификатор входного текстового поля. Когда я изменил название функции, она прекратила ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...