2013-07-02 2 views
0

Так что это должно быть довольно просто, но, похоже, это заставляет меня споткнуться. У меня есть капля в ячейке в таблице. Когда это значение изменяется, я вызываю функцию javascript и передаю ее в функцию. Как мне получить таблицу? Пример кода:Получить таблицу из данных ячейки

<table><tr> 
<td>DATA</td> 
<td><select id='leadState' onChange='updateData(this)'><option selected='selected' value='new'>New</option><option value='old'>Contacted</option></select></td> 
</tr> 
</table> 

JavaScript:

function updateData(select) { 
    var table = select.parentNode.parentNode.parentNode; 
    var row = select.parentNode.parentNode; 
    var cell = select.parentNode; 
} 

Почему это не возвращает таблицу правильно?

+0

OT: Но 'OnChange()' невозможно или раздражает, если вы просматриваете с помощью других средств, кроме мыши. –

ответ

1

Потому что вы забыли о tbody элемента (который не является обязательным, но большинство, если не все браузеры добавить к table обернуть tr элементов Попробуйте другой parentNode:.

function updateData(select) { 
       // select -> td -> tr  -> tbody -> table 
    var table = select.parentNode.parentNode.parentNode.parentNode; 
    var row = select.parentNode.parentNode; 
    var cell = select.parentNode; 
} 

JS Fiddle demo .

И вы действительно не должны пересекать table для каждого переменных:

function updateData(select) { 
    var td = select.parentNode, 
     tr = td.parentNode, 
     tbody = tr.parentNode, 
     table = tbody.parentNode; 
} 

JS Fiddle demo.

Предполагая, что вы хотели бы придерживаться простой JavaScript, и не хотелось бы, чтобы вручную перебирать DOM при извлечении элементов, здесь простая реализация равнинно-JavaScript в closest():

HTMLElement.prototype.closest = function (selector) { 
    var self = this.length ? this[0] : this; 
    while (self.tagName.toLowerCase() !== selector.toLowerCase() && self.tagName.toLowerCase() !== 'body') { 
     self = self.parentNode; 
    } 
    return self.tagName.toLowerCase() == 'body' ? this : self; 
} 

function updateData(select) { 
    var td = select.closest('td'), 
     tr = select.closest('tr'), 
     table = select.closest('table'); 
    console.log(td, tr, table); 
} 

JS Fiddle demo.

+0

Это было! Благодарю. И ya, я добавил переменные tr и td, чтобы показать свое представление о том, как я попадал в переменную таблицы. На самом деле я их не использую – LiverpoolFTW

+0

Ты очень рад, и я рад помочь! Я добавил (очень) простую реализацию метода 'ближайшего()' jQuery к ответу, чтобы сохранить навигацию/обход вручную DOM. –

+0

Я на самом деле использую jQuery, я не знал о ближайшем(), поскольку я начал заниматься веб-разработкой только на прошлой неделе. Я буду изучать это. – LiverpoolFTW

1

Ответ Дэвида Томаса, вероятно, лучший ответ. Хотя, если у вас есть jQuery на вашей странице, вы также можете использовать функцию «ближайший()».

$(select).closest('table') 

Это будет учитывать браузеры, которые автоматически добавляют контейнер tbody, и браузеры, которые этого не делают.

+0

Элегантный ... спасибо. –

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