我需要帮助来理解用于使用搜索栏搜索列表的 Javascript 函数,以便我可以修改它来搜索 table

I need help understanding a Javascript function used to search a list with a search bar so I can modify it to search a table

我正在做一项大学作业,我使用 PHP class 生成 table 值,然后 Javascript 函数使用搜索栏进行搜索。它建立在以前使用相同搜索栏搜索无序列表的作业的基础上。它对列表非常有用,但它使用了一个已经提供给我的函数,坦率地说,我不知道它是如何工作的。现在,一旦我添加了一个包含多个单元格的 table 行,它所做的就是搜索第一个单元格。它仍然是 returns 整行,但我还需要它来搜索整行。

似乎 a = tr[i].getElementsByTagName("a")[0]; 只有 returns 第一个 <a> 这可能是问题所在,但我不知道如何解决这个问题'破坏功能。

让我困惑的功能如下。我向其中添加了自己的代码以隐藏 list/table ,这显然是我理解的。我不会包括那个,但这就是为什么你没有看到我关闭该功能,这样你就不会对此感到困惑。

function myFunction() {
    var input, filter, table, tr, a, i, txtValue;
    input = document.getElementById("myInput");
    filter = input.value.toUpperCase(); 
    table = document.getElementById("myTable");
    tr = table.getElementsByTagName("tr");
            
    for (i = 0; i < tr.length; i++) {
        a = tr[i].getElementsByTagName("a")[0];
        txtValue = a.textContent || a.innerText;
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
            tr[i].style.display = "";
        } else {
            tr[i].style.display = "none";
        }
    }

作为参考,这是我为测试添加的多单元格 table 行,它现在给我带来了问题。我还包括实际的搜索栏本身,因为它包含用于解释功能的相关语法。还有其他行,因此 table 稍后关闭。

<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">     <!--This is my search bar-->
<table id="myTable" onload="hideList()">
    <tbody>
        <tr id="1">
            <?php 
                $pr0 = new productRow(0);
                echo 
                    "<td><a href=\"#\">" . $pr0->itemNumber . "</td></a>" . 
                    "<td><a href=\"#\">" . $pr0->name . "</td></a>" . 
                    "<td><a href=\"#\">" . $pr0->type . "</td></a>" .               //These rows concatenate the class instances with the elements in which they are supposed to appear
                    "<td><a href=\"#\">" . $pr0->model . "</td></a>" . 
                    "<td><a href=\"#\">" . $pr0->brand . "</td></a>" . 
                    "<td><a href=\"#\">" . $pr0->description . "</td></a>";
            ?>
        </tr>

我会把 PHP class 包括进来,这样你就可以看到它是如何输入东西的,但别担心,它是有效的。

<?php
    class productRow {
        var $itemNumber = [];
        var $name = [];
        var $type = [];
        var $model = [];
        var $brand = [];
        var $description = [];
        function __construct($i) {                                  //receives argument when class is called with an argument
            $this->itemNumber = $this->make_table_row($i)[0];
            $this->name = $this->make_table_row($i)[1];
            $this->type = $this->make_table_row($i)[2];
            $this->model = $this->make_table_row($i)[3];            //This function allows the instance values of the attributes to be taken from the make_table_row function
            $this->brand = $this->make_table_row($i)[4];
            $this->description = $this->make_table_row($i)[5];
        }
        function make_table_row($i) {                               //receives argument when class is called with an argument
            $row = 1;
            $tablerows = [];
            if (($input = fopen("input.csv", "r")) !== FALSE) {                 //gets the CSV with my table data
                while (($tabledata = fgetcsv($input, 1000, ",")) !== FALSE) {   //cycles through the rows of data creating arrays
                    if ($row == 1) {
                        $row++;     
                        continue;       //skips the first row because it's a header row I don't want on my input
                    }
                    $tablerows[] = $tabledata;      //uses the roles to populate a multidimensional array
                    $row++;
                }
                fclose($input);
                if (isset($tablerows[$i])) {
                    return $tablerows[$i];              //uses argument to return the appropriate array
                }
            }
        }
    }
?>

任何人都可以阐明这里发生了什么,以及我如何在不破坏功能的情况下获得所有 <a> 元素?

所以最后我自己弄明白了。结果是因为我不认识 MDN 文档上的一些术语,所以我正在阅读的关于 indexOf() 方法的文档是针对不同类型的参数的。因此 a = tr[i].getElementsByTagName("a")[0]; return 只是其当前迭代行的第一个标签,该标签被 txtValue 用于 return textContent 的字符串或innerTexttxtValue.toUpperCase().indexOf(filter) 将这些字符串的大写字母与带有参数 filter 的输入的大写字母值进行比较,将当前迭代行上的 if-else 语句切换为隐藏或显示该行。

我意识到来自 table.getElementsByTagName("tr")tr[i] 将使用当前迭代的标签,[i] 将其定位在数组上,只是为tr[i].getElementsByTagName("a")[0] 正在使用的节点以获取在那里 return 编辑的标签的行。所以我意识到,如果我只是单独使用 tr[i],它会给我整行而不是该行的第一个 a。工作起来很有魅力。

function myFunction() {
    var input, filter, table, tr, a, i, txtValue;
    input = document.getElementById("myInput");
    filter = input.value.toUpperCase(); 
    table = document.getElementById("myTable");
    tr = table.getElementsByTagName("tr");
        for (i = 0; i < tr.length; i++) {
        a = tr[i];
        txtValue = a.textContent || a.innerText;
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
            tr[i].style.display = "";
        } else {
            tr[i].style.display = "none";
        }
    }