JQuery каждый tr.children не определен в Firefox 3.0

У меня есть фрагмент кода, с которым я работаю для фильтрации строк в таблице. Он отлично работает во всех браузерах, кроме Firefox v3.0.x (отлично работает с 3.1 beta 2). Когда я запускаю фрагмент в Firefox 3.0.x, он говорит, что children is undefined. Я также использую jQuery v1.2.6.

Фрагмент кода:

var bodyRows = $("#resultsTable tbody tr");
bodyRows.each(function(n){
    if (!filterPattern.test($.trim(this.children[2].innerHTML))){ //errors here
            this.style.display = 'none';
    }
    else {
            this.style.display = '';
    }
});

Код выбирает все строки таблицы, а затем просматривает их, проверяя текст innerHTML 3-го столбца. Если тест RegEx не проходит, строка скрывается, в противном случае она отображается.

Кто-нибудь видел эту проблему и / или знает, как заставить ее работать?

Спасибо

Обновлено: Вот HTML-разметка таблицы. Для краткости я привожу в нем только 2 записи, хотя заполнены больше.

<table id = "resultsTable" cellpadding = "0" cellspacing = "0">
    <thead>
        <tr>
            <th>First</th>
                <th>Last</th>
            <th>City</th>
            <th>State</th>
            <th>Zip</th>
            <th>Email</th>
            <th>&nbsp;</th>
        </tr>
    </thead>    
    <tbody id = "resultsBody">
        <tr>
            <th>James</th>
                <th>Eggers</th>
            <th>SomeCity</th>
            <th>IA</th>
            <th>55555</th>
            <th>[email protected]</th>
            <th>&nbsp;</th>
        </tr>
        <tr>
            <th>John</th>
                <th>Doe</th>
            <th>SomeCity</th>
            <th>KY</th>
            <th>88888</th>
            <th>[email protected]</th>
            <th>&nbsp;</th>
        </tr>
    </tbody>        
</table>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
16 423
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

вы можете проверить количество элементов в дочерних элементах, прежде чем пытаться получить доступ к третьему.

Это не помогло бы с ошибкой о том, что дети не определены. В любом случае хорошая идея, но не решает проблемы.

Ray Booysen 11.01.2009 01:22

В таблице много 6 столбцов, поэтому дочерние элементы [2] должны быть допустимыми. Я также ожидаю, что одни и те же тесты будут успешными во всех браузерах, но только FF3.0 дает сбой.

JamesEggers 11.01.2009 01:28

Вы явно добавляете

<tbody>
   ...
</tbody>

тег к вашей таблице? Если нет, я бы посоветовал отбросить часть «tbody» из: $ ("# resultsTable tbody tr");

просто $ ("# resultsTable tr");

Мне любопытно, не создает ли эта версия Firefox его для вас неявно.

Я явно добавил вкладку tbody. Сейчас я обновлю основной вопрос с помощью html-разметки.

JamesEggers 11.01.2009 01:33
Ответ принят как подходящий

Почему бы вместо этого не использовать jQuery для обхода элементов DOM.

var bodyRows = $("#resultsTable tbody tr");
bodyRows.each(function(){
    var thirdCell = $(this).find('td').eq(2);
    if (!filterPattern.test($.trim(thirdCell.html()))){
        this.style.display = 'none';
    } else {
        this.style.display = '';
    }
});

Вы также можете использовать «.text()», если хотите, чтобы текст был возвращен без какой-либо возможной разметки.

Свойство children - это свойство DOM только для IE, которого нет ни в одном другом браузере (насколько мне известно). Firefox использует стандартное свойство childNodes для доступа к детям. Проблема с childNodes заключается в том, что он считает пробелы и текст узлом (или, по крайней мере, Firebug так говорит), что делает (на мой взгляд) очень сложным иметь дело. Если у вас есть JavaScript API, вы должны воспользоваться им, чтобы вам не приходилось сталкиваться с различиями между методами обхода DOM браузеров.

Я использую jQuery 1.2.6. После изменения дочерних узлов на childNodes, как вы упомянули, он начал работать без проблем. Спасибо!

JamesEggers 11.01.2009 02:10

Я предложил использовать jQuery потому, что разные браузеры требуют разного кода для доступа к элементам. Если вы используете jQuery вместо childNodes или children, вам не нужно беспокоиться о том, какое свойство использовать.

Dan Herbert 11.01.2009 02:20
if (!filterPattern.test($.trim(this.children[2].innerHTML)))

Когда jQuery вызывает обратный вызов each, this является прямым узлом DOM браузера, а не объектом jQuery.

Путаница возникает из-за того, что jQuery предлагает «дочерний» метод в своих оболочках DOM, а IE предлагает нестандартную «дочернюю» коллекцию на своих собственных узлах DOM, но эти два интерфейса почти полностью несовместимы.

Поэтому используйте $ (this) .children () [2] или аналогичный для версии jQuery или this.getElementsByTagName ('td') [2] для стандартной версии DOM.

(Предполагая, что вы хотели сделать элементы данных таблицы 'td', а не 'th', что вы, вероятно, сделали. Также вы, вероятно, захотите получить необработанный текст ячейки, а не версию innerHTML, в которой символы могут быть экранированы неожиданным образом. )

Другие вопросы по теме