Альтернатива кода JQuery на чистом JavaScript

177
15 ноября 2018, 23:40

Здравстуйте. Есть рабочий скрипт написанный на JQuery высветляющий значение "No Results" при введении в input несуществующего значения в таблице("Живой поиск"). Пробовал переписать самостоятельно, читать документацию, но безуспешно. Работающий код в JQuery:

$(".search").keyup(function () {
    var search = $(this).val();
    $(".list").children().show();
    $('#noresults').remove();
    if (search) {
        $(".list").children().not(":containsNoCase(" + search + ")").hide();
        $(".list").each(function () {
            if ($(this).children(':visible').length == 0) 
              $(this).append('<tr class="noresults"><td style="text-align:center; font-size:17px; padding:25px 0 25px 0!important">No Results</td></tr>');
        });
    }
});
$.expr[":"].containsNoCase = function (el, i, m) {
    var search = m[3];
    if (!search) return false;
    return new RegExp(search, "i").test($(el).text());
};

Сам скрипт, собственно, взят отсюда:

Неработающий код в чистом JS, переписанный мною:

document.getElementByClassName('search').onkeyup = function() {
      var search = this.value;
      document.getElementByClassName('list').children().show();
      document.getElementById('noresults').remove();
      if(search) {
        document.getElementByClassName('list').children().not(":containsNoCase(" + search + ")").hide();
        document.getElementByClassName('list').each = function () {
          if(this.children(':visible').length == 0)
            this.append('<tr class="noresults"><td style="text-align:center; font-size:17px; padding:25px 0 25px 0!important">No Results</td></tr>');      
        }
      }
    };
expr[":"].containsNoCase = function (el, i, m) {
    var search = m[3];
    if (!search) return false;
    return new RegExp(search, "i").test($(el).text());
};

Особенно не могу найти альтернативу на JS для второй функции:

expr[":"].containsNoCase = function (el, i, m) {
    var search = m[3];
    if (!search) return false;
    return new RegExp(search, "i").test($(el).text());
};

Помогите переписать его на чистый JS. Заранее спасибо!

Answer 1

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

 document.getElementById("search-input").addEventListener("keyup", function (evt) {
        let mylist = document.querySelectorAll(".list");
        for (let tbody of mylist) {
          let noresults = true;
          let noresultsrow = tbody.querySelectorAll(".noresults");
          if (noresultsrow.length > 0)
            for (let row of noresultsrow)
              row.parentElement.removeChild(row);
            for (let row of tbody.querySelectorAll("tr")) {
              let includes = row.textContent.toLowerCase().search(evt.target.value.toLowerCase()) > -1;
              if (includes) noresults = false;
              row.style.display = includes ? "" : "none";
            }
            if (noresults) {
              tbody.innerHTML += "<tr class='noresults'><td style='text-align:center; font-size:17px; padding:25px 0 25px 0!important'>Brak wyników</td></tr>";
            }
        }
      });
Answer 2

Пример работающего скрипта на JQuery: http://jsfiddle.net/bk13detv/26/

Построчный разбор...

// $("#my-search-input").keyup(function () { 
document.getElementById('my-search-input').onkeyup = function(e) { 
 
  // var search = $(this).val(); 
  var search = e.target.value; 
 
  // $(".my-list") 
  document.querySelectorAll('.my-list').forEach(function(elem) { 
    // .children() 
    for (let child of elem.children) { 
      // .show() 
      child.style.display = ''; 
    } 
  }); 
 
  // $('.noresults') 
  document.querySelectorAll('.noresults').forEach(function(elem) { 
    // .remove() 
    elem.remove(); 
  }); 
 
  // if (search) { 
  if (search) { 
    // $(".my-list") 
    document.querySelectorAll('.my-list').forEach(function(elem) { 
      // .children() 
      for (let child of elem.children) { 
        // .not(":containsNoCase(" + search + ")") 
        if (!containsNoCase(child, search)) { 
          // .hide() 
          child.style.display = 'none'; 
        } 
      } 
    }); 
  } 
 
  // $(".my-list").each(function() { 
  document.querySelectorAll('.my-list').forEach(function(elem) { 
 
    // if ($(this).children(':visible').length == 0)  
    if (!elem.offsetHeight) { 
      // $(this).append('<tr class="noresults"><td colspan="3"><em>No Results</em></td></tr>'); 
      elem.insertAdjacentHTML('beforeend', '<tr class="noresults"><td colspan="3"><em>No Results</em></td></tr>'); 
    } 
  }); 
} 
 
// $.expr[":"].containsNoCase = function(el, i, m) { 
var containsNoCase = function(el, search) { 
  // if (!search) return false; 
  if (!search) return false; 
  // return new RegExp(search, "i").test($(el).text()); 
  return new RegExp(search, 'i').test(el.textContent); 
};
input { 
  padding: 10px 8px; 
  width: 300px; 
} 
 
table { 
  background-color: lightgrey; 
  margin: 24px 0; 
  text-align: left; 
  width: 100%; 
} 
 
th { 
  background-color: darkgrey; 
} 
 
th, 
td { 
  padding: 4px 8px; 
}
<section> 
  <input id="my-search-input" type="text" placeholder="Search list" /> 
  <div class="something"> 
    <table> 
      <thead> 
        <tr> 
          <th>Name</th> 
          <th>2nd column</th> 
          <th>3rd column</th> 
        </tr> 
      </thead> 
      <tbody class="my-list"> 
        <tr> 
          <td>Lorem ipsum</td> 
          <td>123</td> 
          <td>Right</td> 
        </tr> 
        <tr> 
          <td>Dolor sit</td> 
          <td>100</td> 
          <td>Wrong</td> 
        </tr> 
      </tbody> 
    </table> 
  </div> 
  <div class="something"> 
    <table> 
      <thead> 
        <tr> 
          <th>Name</th> 
          <th>2nd column</th> 
          <th>3rd column</th> 
        </tr> 
      </thead> 
      <tbody class="my-list"> 
        <tr> 
          <td>Element</td> 
          <td>321</td> 
          <td>Something</td> 
        </tr> 
        <tr> 
          <td>More elements</td> 
          <td>444</td> 
          <td>Cowabunga</td> 
        </tr> 
        <tr> 
          <td>boom</td> 
          <td>yo</td> 
          <td>enough</td> 
        </tr> 
      </tbody> 
    </table> 
  </div> 
</section>

READ ALSO
JS/JQUERY складывать все теги li и сделать средняю арифметику

JS/JQUERY складывать все теги li и сделать средняю арифметику

надо с помощью js делать вот такую операцию (45+100+56+23)/4

173
Альтернатива socket.io

Альтернатива socket.io

У нас фронт на angular и бэк на nodejs

157
Передать пароль при подключении по websocket

Передать пароль при подключении по websocket

Рефакторим один легаси проектВ нем таким вот образом устанавливается вэбсокет соединение между node

177
передача шаблона в шаблон с параметрами в express-handlebars

передача шаблона в шаблон с параметрами в express-handlebars

Проблема следующаяшаблон "index" загружается, в переменную body передаю шаблон, но в шаблон не передаются параметры для работы handlebars шаблонизатора

150