2009-09-16 6 views
1

Я пытаюсь отображать строки в зависимости от выбора пользователей. Предположим, что ему нужны только 3 строки, затем прячется четвертая и пятая строки. Ниже вы найдете часть html и javascript.Ошибка JavaScript при попытке скрыть строки таблицы

HTML

<table> 
    <tr id="sRow1"> 
    <td>1a</td> 
    <td>1b</td> 
    </tr> 
    <tr id="sRow2"> 
    <td>2a</td> 
    <td>2b</td> 
    </tr> 
    <tr id="sRow3"> 
    <td>3a</td> 
    <td>3b</td> 
    </tr> 
    <tr id="sRow4"> 
    <td>4a</td> 
    <td>4b</td> 
    </tr> 
    <tr id="sRow5"> 
    <td>5a</td> 
    <td>5b</td> 
    </tr> 
</table> 

JavaScript

// b gets value from xml file   
    while (b <= 5) 
    { 
     var rowName = "sRow" + b; 
     alert(rowName); 
     try { 
      document.getElementById(rowName).style.display = "none"; 
     } 
     catch (err) 
     { 
      alert(err.description) 
     } 
     b++; 
    } 

Я получаю сообщение об ошибке Требуется объект в document.getElementById (rowName) .style.display = "нет" ;. Вы можете помочь.

+2

Я не понимаю, зачем вам здесь нужно попробовать. Вы уверены, что 'document.getElementById (rowName)' фактически находит элемент? Если это не так, оно должно возвращать 'null', а дополнительный доступ к ресурсу, то есть' .style.display', должен приводить к ошибке. Чтобы предотвратить это, просто проверьте существование элемента, прежде чем пытаться установить его стиль. – kangax

+0

Работает для меня, например. 'Б = 4'. Может быть, 'b' - это не то, что вы ожидали? Что такое rowName, которое вы получите перед ошибкой? – bobince

+0

Еще одно странное замечание, если я изменю имена идентификаторов от sRow до sib, оно работает. Является sRow ключевым словом. С уважением – kobra

ответ

1

Вы пропустили интересный бит (где b приходит от), так что я буду просто угадать: иногдаb не на самом деле это число от 1 до 5 включительно. Возможно, это строка, которая не форматирует чисто однозначную цифру 1-5, или, может быть, это что-то еще полностью ... Давайте сделаем ваш код более безопасным, на всякий случай, если я прав:

// b gets value from xml file 

// ensure b is a number - will fail comparison if NaN 
b = new Number(b); 
while (b <= 5) 
{ 
    var rowName = "sRow" + b; 
    var row = document.getElementById(rowName); 
    if (row) // verify element was found before trying to modify it! 
    row.style.display = "none"; 
    b++; 
} 

Обратите внимание, что я удалил try {} catch - ты лучше просто испытывать возвращаемое значение getElementById(), так что не будет мешать при отладке, если вы хотите использовать отладчик позже ...

+0

Спасибо. alert (rowName) показывает правильный идентификатор. Таким образом, значение b не является проблемой. С уважением – kobra

+0

@kobra: ты * уверен *? Как правило, трудно увидеть пробелы в конце строки, отображаемой в диалоговом окне «alert()» ... –

+0

@Vagabond - размещение декларации внутри try {} решило проблему, что делает ее проблемой с областью. – karim79

1

в моей вы получите противоречивые результаты в разных браузерах, пытающихся сделать строки таблицы невидимыми, изменяя атрибуты стиля. Более безопасная вещь - фактически удалить и вставить строки из таблицы с помощью методов insertRow() и deleteRow() dom на объект таблицы. Это правильно поддерживается во всех основных браузерах, с которыми вы, вероятно, столкнетесь.

+0

Спасибо. Можете ли вы указать на какой-то пример? Я нахожу этот путь интересным. С уважением. – kobra

+0

Конечно. В моем ответе есть примеры кода в ссылках имени метода. См. Выше. :) – Asaph

+0

Спасибо. Извините за просмотр. С уважением – kobra

0

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

+0

Его простая html-страница с javascript. Поэтому вопрос о сервере или клиенте runat не возникает. С уважением – kobra

Смежные вопросы