Как выбрать HTML с помощью jQuery, если у него нет уникальных идентифицирующих атрибутов, но есть комментарий HTML? - PullRequest
4 голосов
/ 14 декабря 2011

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

В любом случае, я могу запускать пользовательские сценарии с помощью полезного расширения Chrome.Я могу изменить любые части страницы, где узлы HTML имеют классы, идентификаторы или даже атрибуты с небольшим количеством уникальной информации, но я не могу понять, как выбрать и удалить следующий HTML с помощью jQuery.

    <tr>
      <td colspan="2">
        <!--Signature-->
            <div class="resultText">
                <!-- sig -->
                    <div>Signature text</div>
                <!-- / sig -->

            </div>
      </td>
    </tr>

Если бы был способ, которым я мог бы схватить родителя <!--Signature-->, это было бы идеально, но я не уверен, что это даже возможно.

Есть один класс resultText, ноэтот класс используется везде, где есть текст, введенный пользователем, а не только в подписи.Так что я не могу ухватиться за это.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2011

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

Из сопоставленногоэлементы, вы можете получить их родителей contents () , использовать filter () для изоляции узлов комментариев (их свойство nodeType равно 8)и сравните значение этих узлов с вашей Signature строкой:

$(".resultText").parent().each(function() {
    var $this = $(this);
    var signature = $this.contents().filter(function() {
        return this.nodeType == 8 && this.nodeValue == "Signature";
    });
    if (signature.length) {
        // Signature found, $this is the <td> element.
        $this.closest("tr").remove();  // For example.
    }
});
1 голос
/ 14 декабря 2011

Вы можете использовать .contents(), чтобы получить все дочерние узлы элемента: http://api.jquery.com/contents

Из документов:

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

$('tr').each(function (index, obj) {
    $(this).children('td').contents();//this selects all the nodes in each TD element in the table, including comment nodes
});

Вот демонстрационная версия: http://jsfiddle.net/NLhz9/1/

0 голосов
/ 15 декабря 2011

Поскольку скрипт в основном только для вас, используйте xpath для поиска комментариев.

Попробуйте что-то вроде этого:

var comment, comments = document.evaluate('//comment()', document);
while ((comment=comments.iterateNext())) {
  if (comment.data=='Signature') { // found one
    comment.parentNode.parentNode.removeChild(comment.parentNode);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...