включает функцию, не распознающую подстроку в текстовой переменной - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь добавить атрибут "title" к элементам HTML td на основе их текста.

Я написал следующее:

$("tr.sel-rtac-first td:first-child").each(function(t,x){
    var hours = "";
    var text = $(x).text();
    switch (text) {
        case (text.includes("מרכזית-מדף פתוח") == true):
            hours = "יהדות 401: א - ה  08:00 - 19:00"
            break;
        default: hours = "text"
    }
    $(x).attr("title",hours);
});

В своих тестах я вижу, чтотекстовая переменная получает правильный текст:

"
                        Cen.lib-Stacks - מרכזית-מדף פתוח -#Four weeks - ארבעה שבועות#
                    "

Текст на иврите, но вы можете ясно видеть, что текст, который я ищу, действительно является частью текста переменной.Тем не менее, он возвращается к значению по умолчанию, не признавая, что текст включает этот сегмент.

Я также пытался без == в коде:

case (text.includes("מרכזית-מדף פתוח")):

Но это тоже не работает.

Предыдущее решение, которое я тестировал, состояло в том, чтобы использовать функцию .title (), но это тоже не сработало (подозреваю, потому что элемент не имеет атрибута title для начала, я добавляю один).

Как я могу убедиться, что функция include распознает, что подстрока действительно есть в тексте?

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Используйте оператор if вместо регистра переключателя, как предложено @ mark.hch.

Что касается включенных ошибок, проблема не может быть воспроизведена с помощью предоставленного вами кода:

const haystack = 'Cen.lib-Stacks - מרכזית-מדף פתוח -#Four weeks - ארבעה שבועות#';
const needle = 'מרכזית-מדף פתוח';
console.log(haystack.includes(needle));

Вероятно, ошибка, которую вы наблюдаете, возникла откуда-то еще.

1 голос
/ 27 марта 2019

Лучший способ обработать этот тип поиска - RegExp с флагом Unicode: u:

// RegEx literal syntax for unicode ex. a => U+61 => \u{61}
  /\u{5DE}\u{5E8}\u{5DB}\u{5D6}\u{5D9}\u{5EA}\x2D\u{5DE}\u{5D3}\u{5E3} \u{5E4}\u{5EA}\u{5D5}\u{5D7}/u

Когда я пытался выделить определенные буквы, редактор стеков пропускал их. Чтобы избежать любых несовместимостей, полученных из разных языков, Юникод является возможным решением. Перевод был возможен с помощью ES2015 Unicode-транспортера регулярных выражений .

В дополнение к вышеприведенному предложению - необходимо обратиться к логике jQuery:

  • При использовании метода .each() и обращении к текущему элементу используйте $(this)

    var text = $(this).text() 
    
  • Методы, такие как .includes() и .test() (метод Regexp в демоверсии), возвращает true или false. Менее подробный синтаксис в условии:

    if (RegExp.test("String")) {...
    

    Использование == true даст тот же результат, но в других случаях это может изменить тип, поэтому будьте осторожны.

$("tr td:first-child").each(function(){
  var text = $(this).text();
  if (/\u{5DE}\u{5E8}\u{5DB}\u{5D6}\u{5D9}\u{5EA}\x2D\u{5DE}\u{5D3}\u{5E3} \u{5E4}\u{5EA}\u{5D5}\u{5D7}/u.test(text)) {
    $(this).attr("title", "יהדות 401: א - ה  08:00 - 19:00");
  } else {
    $(this).attr('title', text);
  }
});
table {
  table-layout: fixed;
  width: 80vw;
  height: 80vh;
  margin: 5vh auto
}

td {
  width: 33%;
}

table, td {
  border: 1px solid #000
}

td::before {
  content: ' ';
  min-height:20px;
}
<table>
<tr><td>Cen.lib-Stacks - מרכזית-מדף פתוח -#Four weeks - 
ארבעה שבועות#</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>Cen.lib-Stacks - מרכזית-מדף פתוח -#Four weeks - 
ארבעה שבועות#</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
<tr><td>Cen.lib-Stacks - מרכזית-מדף פתוח -#Four weeks - 
ארבעה שבועות#</td><td></td><td></td></tr>
<tr><td>TEST</td><td></td><td></td></tr>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
1 голос
/ 27 марта 2019

Неправильно использование «переключателя» и «регистра».

Вы можете просто написать:

$("tr.sel-rtac-first td:first-child").each(function(t,x){
 var hours = "";
 var text = $(x).text();

 if (text && text.includes("מרכזית-מדף פתוח")) {
   hours = "יהדות 401: א - ה  08:00 - 19:00";
 } else {
   hours = "text";
 }

 $(x).attr("title",hours);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...