【问题标题】:Search values from first column in html table using JS?使用JS从html表中的第一列搜索值?
【发布时间】:2014-10-21 20:31:33
【问题描述】:

我有这张桌子

<th>Example No.</th>
<th>Column 1</th>
<tr>
<td id="SampleId">3512376894</td>
<td>two.test2@hotmail.com</td>
</tr>

我有按所有列搜索值的脚本。但我要做的就是仅使用 td id 按第一列搜索值。但我不知道该怎么做。请好心,帮我做吗?谢谢!

Here's the jsfiddle file

这是 JScript:

function doSearch() {
        var searchText = document.getElementById('searchTerm').value;
        var targetTable = document.getElementById('dataTable');
        var targetTableColCount;
        for (var rowIndex = 0; rowIndex < targetTable.rows.length; rowIndex++) {
            var rowData = '';
            if (rowIndex == 0) {
                targetTableColCount = targetTable.rows.item(rowIndex).cells.length;
                continue; //do not execute further code for header row.
            }
            for (var colIndex = 0; colIndex < targetTableColCount; colIndex++) {
                rowData += targetTable.rows.item(rowIndex).cells.item(colIndex).textContent;
                if (rowIndex <= 1) {
                    document.getElementById('noresults').style.display = "block";
                }
            }
        }
    }

【问题讨论】:

    标签: javascript search search-engine html-table


    【解决方案1】:

    使用下面的 sn-p 在给定列中搜索某个术语。

    <!-- HTML -->
    <table id="dataTable">
      <th>Example No.</th>
      <th>Column 1</th>
      <th>Column  2</th>
      <tr>
        <td>345678917</td>
        <td>Test 1</td>
        <td>one_test1@gmail.com</td>
      </tr>
      <tr>
        <td>3512376894</td>
        <td>Test 2</td>
        <td>two.test2@hotmail.com</td>
      </tr>  
    </table>
    
    // JavaScript
    window.onload = function(){
      var term = "3512376894";                   // term you're searching for
      var column = 0;                            // which column to search
      var pattern = new RegExp(term, 'g');       // make search more flexible 
      var table = document.getElementById('dataTable');
      var tr = table.getElementsByTagName('TR');
      for(var i = 0; i < tr.length; i++){
        var td = tr[i].getElementsByTagName('TD');
        for(var j = 0; j < td.length; j++){
          if(j == column && td[j].innerHTML == term){
    
          // for more flexibility use match() function and the pattern built above
          // if(j == column && td[j].innerHTML.match(pattern)){
    
            console.log('Found it: ' + td[j].innerHTML);
          }
        }    
      }
    };
    

    输出:

    Found it: 3512376894
    

    Working jsBinjsFiddle 或此版本jsFiddle

    Verions 4 | Verions 5 | Verions 6

    【讨论】:

    • 你为什么要遍历所有单元格来只找到其中​​一个?
    • @JLRishe 我知道我可以使用[rows][cells] 集合来做同样的事情,但不知何故我更喜欢这种方式。但是,[rows][cells] 在内部的工作方式不同;)而且,是的,您的解决方案也很好。
    • 我并不是要建议您使用rowscells。您可以使用td[column] 来获取所需的单元格并取消内部for 循环。
    • @User014019 if(td[j].id == SampleId &amp;&amp; td[j].innerHTML == term)
    • @User014019 var term = document.getElementById('searchTerm').value; 检查新的jsBIn
    【解决方案2】:

    听起来你的问题是遍历 DOM。以下是如何遍历表行:

    var trs = document.getElementsByTagName('tr');
    
    for(i = 0; i < trs.length; i++){
        //trs[i] is the current table row, .children[0] selects the first child
        console.log(trs[i].children[0]);
    }
    

    然后您可以使用正则表达式或indexOf 检查innerHtml 中的搜索词。

    【讨论】:

      【解决方案3】:

      很确定这是你想要做的:

      function findRows(table, column, searchText) {
          var rows = table.rows,
              r = 0,
              found = false,
              anyFound = false;
      
          for (; r < rows.length; r += 1) {
              row = rows.item(r);
              found = (row.cells.item(column).textContent.indexOf(searchText) !== -1);
              anyFound = anyFound || found;
      
              row.style.display = found ? "table-row" : "none";
          }
      
          document.getElementById('noresults').style.display = anyFound ? "none" : "block";
      }
      
      function performSearch() {
          var searchText = document.getElementById('searchTerm').value,
              targetTable = document.getElementById('dataTable');
      
          findRows(targetTable, 0, searchText);
      }
      
      document.getElementById("searchTerm").onkeyup = performSearch;
      

      working jsFiddle

      【讨论】:

      • @User014019 请查看我更新的答案和小提琴。如果您不添加按钮,那么如果用户将文本粘贴到搜索框中,则搜索将不起作用。
      • 我不太明白。这对用户来说不是更烦人吗?
      【解决方案4】:
      function processTable(tableId, searchTerm, colNumber, hideCallback, showCallBack) {
      
          var mySearchTerm = searchTerm || "",
              myTable = document.getElementById(tableId) || document.createElement("TABLE"),
              myRowsArray = getElements(null, "TR", myTable), //convert to array
              myRowsArrayLength = myRowsArray.length;
      
          var index = 0;
          for (var i = myRowsArrayLength; --i;) {
              var myTempRowElement = myRowsArray[i],
                  myTempColArray = getElements(null, "TD", myTempRowElement),
                  myTempCol = (myTempColArray.length > 0 ? myTempColArray[colNumber - 1] : document.createElement("TD")),
                  myText = getText(myTempCol);
              if (myText === mySearchTerm) {
                  showCallBack(myTempRowElement);
              }
              else {
                  hideCallback(myTempRowElement);
              }
          }
      };
      
      function init() {
      
          var myHandler = function (e) {
              var myTermEl = document.getElementById("searchTerm"),
                  myTextContent = getText(myTermEl) || myTermEl.value || "";
      
              processTable("dataTable", myTextContent, 1,
                  function hideCallback(el) {
                      el.style.display = 'none';
                  },
                  function showCallBack(el) {
                      el.style.display = 'table-row';
                  }
              );
          };
      
          myHandler();
      
          document.getElementById("searchTerm").onkeyup = myHandler;
          document.getElementById("searchTerm").onchange = myHandler;
          document.getElementById("searchTerm").onclick = myHandler;
      };
      
      (function () {
          if (this.addEventListener) {
              this.addEventListener("load", init, false)
          }
          else {
              window.onload = init;
          }
      }());
      var isClassMember = function (element, classname) {
          var classes = element.className;
          if (!classes) {
              return false;
          };
          if (classes == classname) {
              return true;
          };
          var whitespace = /\s+/;
          if (!whitespace.test(classes)) {
              return false;
          };
          var c = classes.split(whitespace);
          for (var i = 0; i < c.length; i++) {
              if (c[i] == classname) {
                  return true;
              };
          };
          return false;
      };
      var getElements = function (classname, tagname, root, firstFlag, depth) {
          if (!root) {
              root = document;
          }
          else {
              if (typeof root == "string") {
                  root = document.getElementById(root);
              };
          };
          if (!tagname) {
              tagname = "*";
          };
          if (depth) {
              var maxRecursion = depth;
              var all = (function getChildsElementsLevel(root, tagName, currentLevelNumber) {
                  var result = [],
                      currentLevelChilds = (function getLevelChilds(root, tagName) {
                          var result = [];
                          var children = root.firstChild;
                          do {
                              if (children.nodeName == tagName) {
                                  result.push(children);
                              };
                          } while (children = children.nextSibling);
                          return result;
                      })(root, tagName),
                      currentLevelChildsLength = currentLevelChilds.length,
                      nextLevelNumber = ++currentLevelNumber;
      
                  for (var f = currentLevelChildsLength; f--;) {
      
                      var currentEl = currentLevelChilds[f];
                      result.push(currentEl);
                      if (nextLevelNumber < maxRecursion) {
                          result.concat(getChildsElementsLevel(currentEl, tagName, nextLevelNumber));
                      }
                  }
                  return result;
              })(root, tagname, 0);
          }
          else {
              var all = root.getElementsByTagName(tagname);
          }
          if (!classname) {
              return all;
          };
          var elements = [],
              allLength = all.length,
              isMyClass = isClassMember;
          if (firstFlag) {
              for (var i = 0; i < allLength; i++) {
      
                  var element = all[i];
                  if (isMyClass(element, classname)) {
                      return element;
                  };
              };
          }
          else {
              for (var i = allLength; i--;) {
      
                  var element = all[i];
                  if (isMyClass(element, classname)) {
                      elements.push(element);
                  };
              };
          }
      
          return elements;
      };
      var getText = function (n) {
          function getStrings(n, strings) {
      
              if (n.nodeType == 3 /* Node.TEXT_NODE */) {
                  strings.push(n.data);
              }
              else {
                  if (n.nodeType == 1 /* Node.ELEMENT_NODE */) {
                      for (var m = n.firstChild; m != null; m = m.nextSibling) {
                          getStrings(m, strings);
                      };
                  };
              };
          };
          var strings = [];
          getStrings(n, strings);
          return strings.join("");
      };
      

      【讨论】:

      • 您介意告诉我们这么大的代码块完成了什么吗?
      • 我稍微调整了代码。您需要做的就是找到事件并开始处理函数processTable。
      • 你能给我们一些运行的例子吗?
      猜你喜欢
      • 2014-10-23
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2013-09-06
      • 2016-07-07
      相关资源
      最近更新 更多