0

所以我有一个动态生成表的页面,看起来像

<table id="enProps">
  <tr>
    <td class="en_US">
      <input readonly="readonly" value="shipbillpayplacerequisition" type="text">
    </td> 
    <td class="en_US">
      <input class="longField" readonly="readonly" value="Ship, Bill &amp; Pay : Place Requisition" type="txt">
    </td>
    <td style="display: none;" class="otherIds">
      <input class="identifier" readonly="readonly" value="shipbillpayplacerequisition" type="text">
    </td> 
    <td class="keyValue">
      <input class="value longField" id="shipbillpayplacerequisition" value="" type="text">
    </td>
  </tr>
</table>

行数可以变化,输入框的值字段中存储的内容也可以变化。我正在尝试用 vanilla javascript 编写一个简单的脚本(阅读:没有外部库,如 JQuery)来比较两个字段的“值”值。

到目前为止我所拥有的是

 var table = document.getElementById("enProps");
 var rowCount = table.getElementsByTagName("TR").length;
 var engValue;
 var frenchValue;
 for (var i = 0; i < rowCount; i++){
  var row = table.rows[i];
  var cellCount = row.cells.length;
   for (var j = 0; j < cellCount; j++){
    var cell = row.cells[j];
     if (cell.getAttribute("class") == "en_US"){
       var inputs = cell.getElementsByClassName("longField")[0].getAttribute("value");
     }
   }
 }

每次我尝试运行它时都会出现错误提示

cell.getElementsByClassName("longField")[0] is undefined

奇怪的是,如果我删除 getAttribute 方法调用并使用 alert 或 console.log 打印输入值,它会显示正确的元素。我尝试了许多变体,包括使用 .firstChild、.childNodes[0] 和不串接我的方法调用。每次我收到一个错误,说 .getAttribute 不是函数或者某些东西是未定义的,并且它总是由该行上的 .getAttribute 调用引起的,更奇怪的是每次在我的选择器上调用 console.log 都会显示适当的输入标签。所以我的问题是,当我尝试使用它来获取输入标签的“值”类的值时,为什么 .getAttribute 会出错?

4

1 回答 1

3

这是因为您的 first<td class="en_US">没有包含 class 的嵌套元素"longField"

您需要确保找到匹配项。

 if (cell.getAttribute("class") == "en_US"){
     var inputs = cell.getElementsByClassName("longField");
     if (inputs.length)
         inputs[0].getAttribute("value");
 }

或者只是getElementsByClassName从那里打电话tr

for (var i = 0; i < rowCount; i++){
    var inputs = table.rows[i].getElementsByClassName("longField");
    for (var j = 0, len = inputs.length; j < len; j++) {
        inputs[j].getAttribute("value");
    }
}
于 2012-11-30T20:35:54.987 回答