Выделите совпадающую часть строки в TD, когда наведен другой TD

0

Если я нахожусь над элементом TD, я хочу выделить часть строки в другом TD. Пример: если я наведите курсор на яблоко, я хочу выделить яблочную часть applebanana.

Я пробовал несколько вещей, но не стал ближе к любому решению. Спасибо за помощь.

Мой код до сих пор: нельзя использовать слово param, потому что он не определен. this.innerText не возвращает "яблоко". Также onMouseout удаленная часть строки удаляется.

function hightlightInput(word){
    $(document.getElementById("testid")).html($(document.getElementById("testid")).html().replace(new RegExp("(apple)(?![^\">]*\"[^>]*>)", "i"), "<mark>$1</mark>"));
}

function resetHighlight() {
    $(document.getElementById("testid")).find("mark").replaceWith(function() {
        return $(document.getElementById("testid")).contents();
    });
}

HTML

<table>
<tr>
   <td onMouseOver="hightlightInput(this.innerText)"onMouseOut="resetHighlight()">apple</td>
   <td id="testid">applebanana</td>
</tr>
</table>
Теги:

1 ответ

0
Лучший ответ

В этих ситуациях я всегда использую regexp и помещаю текст в элемент <mark>, который я удаляю позже.

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

HTML:

<table>
    <tr><td id="change">applebanana</td></tr>
    <tr><td onMouseOver="highlightInput(this, this.textContent)"onMouseOut="resetHighlight(this)">apple</td></tr>
</table>

Здесь решение полностью в native JS:

function highlightInput(element, word) {
    element.innerHTML = element.innerHTML.replace(new RegExp("(" + word + ")(?![^\">]*\"[^>]*>)", "i"), "<mark>$1</mark>");
}
function resetHighlight(element) {
    var marks = element.getElementsByTagName("mark");
    var marksLength = marks.length;
    for(var i = (marksLength - 1); i >= 0; --i)
    {
        element.replaceChild(document.createTextNode(marks[i].innerText), marks[i]);
    }
}

Скрипт: http://jsfiddle.net/gpgekko/LshW6/1/


Вот решение, использующее библиотеку jQuery:

function highlightInput(element, word) {
    $(element).html($(element).html().replace(new RegExp("(" + word + ")(?![^\">]*\"[^>]*>)", "i"), "<mark>$1</mark>"));
}
function resetHighlight(element) {
    $(element).find("mark").replaceWith(function() {
        return $(this).contents();
    });
}

Скрипт: http://jsfiddle.net/gpgekko/LshW6/

Я оставлю адаптацию, чтобы найти все элементы, чтобы подчеркнуть вас, сообщите мне, если вам нужна помощь в этом. Но, возможно, просто просматривая таблицу для появления слова, если я правильно прочитал ваш вопрос.

  • 0
    Я обновил свой оригинальный пост изменениями, которые я сделал на основе вашего ответа. Но это на самом деле ничего не делает. Я в недоумении здесь.
  • 0
    @ user2196234 Извините, мой плохой, должен быть дополнительный $(element).html() вокруг заменяющего кода, чтобы установить новое значение. Смотрите обновленный ответ.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню