childNode не работает в Firefox и Chrome, но работает в IE - PullRequest
4 голосов
/ 28 января 2010

У меня есть gridview в 3-й ячейке, есть текстовое поле управления, я вызываю функцию javascript на onchange.

Может кто-нибудь сказать мне, почему это не работает в Firefox и Chrome, но работает в IE

grd.rows[rowindex].cells[3].childNodes[0].value

Возвращает правильное значение в IE, но не в Chrome и Firefox (In FF and Chrome it return undefined)?

Пожалуйста, также предложите мне решение этой проблемы.

Редактировать

alert(grd.rows[ri].cells[3].childNodes[0].value);//IE value=correct value, FF and chrome value=undfined
alert(grd.rows[ri].cells[3].childNodes[1].value);//IE value=undfined, FF and Chrome value= correct value

Спасибо

Ответы [ 9 ]

3 голосов
/ 28 января 2010

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

<p><!-- This comment represents a text node.
    --><em>text</em>
</p>
2 голосов
/ 28 января 2010

попробовать grd.rows [RowIndex] .cells [3] .childNodes [1] .value

или лучше, посмотрите на таблицу в интегрированном инструменте разработчика

1 голос
/ 13 января 2015

Ответ Ишвара об изменении дочерних узлов на детей работал для меня.

1 голос
/ 07 июля 2014

Попробуйте это. У меня та же проблема, и эта проблема решается просто заменив "childNodes" на "children"

alert(grd.rows[ri].cells[3].children[0].value);
1 голос
/ 24 июля 2012

@ ChaosPandion:

Эй, друг, не используйте этот тип проверки для дочерних узлов.

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

OR

просто проверьте имя вашего браузера.

если это IE, то, поскольку он игнорирует пустой текстовый узел, дочерний узел в нем меньше на один номер, чем другие браузеры.

например,

var isIE = navigator.appName;
if (isIE == "Microsoft Internet Explorer") {                
    var removeProductID = document.getElementById(obj.childNodes[0].id).getAttribute("abc");
}
else {
    var removeProductID = document.getElementById(obj.childNodes[1].id).getAttribute("abc");
}

Надеюсь, это поможет. Наслаждайтесь кодированием.

0 голосов
/ 09 марта 2016

Используйте children[0] вместо ChildNode, как показано ниже:

var oText = grd.rows[rowindex].cells[3].children[0];
0 голосов
/ 09 января 2012

попробуйте getElementsByTagName () вместо ChildNodes. это будет работать и для FF, и для Chrome, и для IE.

0 голосов
/ 01 февраля 2010

Как говорит ChaosPandion, IE игнорирует пустые текстовые узлы. Следующее должно работать кросс-браузерно:

var cell = grd.rows[rowindex].cells[3];
for (var textbox=cell.firstChild; textbox.nodeType!==1; textbox=textbox.nextSibling);
alert(textbox.value);

Однако вы говорите, что вызываете функцию onchange. Предположительно это означает событие onchange для рассматриваемого текстового поля. В этом случае аргумент события в вашем обработчике событий должен иметь указатель на текстовое поле. Посмотрите на свойство target или srcElement. например

function onChange(e) {
 e = e || window.event;
 var textbox = e.target || e.srcElement;
 alert(textbox.value);
}
0 голосов
/ 28 января 2010

Если вы ищете текст, используйте grd.rows [rowindex] .cells [3] .childNodes [0] .data для браузеров не IE.

Получение текстового значения узла элемента

var oCell = grd.rows[rowindex].cells[3];
alert(oCell.textContent || oCell.innerText)

Получение текстового значения текстового узла (менее безопасно по сравнению с предыдущим)

* +1007 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...