从动态生成的表中获取行和单元格值
Get row and cell value from dynamically generated table
我正试图从动态生成的表onClick函数中获取行和单元格。我目前没有定义。
xmlTitles = xmlDoc.getElementsByTagName("title");
document.getElementById('playlist').innerHTML = "Playlist (" + xmlTitles.length + " videos)";
document.getElementById('table').cellSpacing = "5px";
for (var i = 0; i < xmlTitles.length; i++)
{
tr = document.createElement('tr');
tr.style.height = "100px";
titles[i] = xmlDoc.getElementsByTagName("title")[i].childNodes[0].nodeValue;
image[i] = xmlDoc.getElementsByTagName("image")[i].childNodes[0].nodeValue;
filename[i] = xmlDoc.getElementsByTagName("filename")[i].childNodes[0].nodeValue;
td2 = document.createElement('td');
var _image = iPath + image[i];
td2.innerHTML = "<a href='javascript:callVideo(this);'><img src='" + _image + "'/></a>";
td2.style.verticalAlign = "top";
tr.appendChild(td2);
td1 = document.createElement('td');
var _title = titles[i];
td1.appendChild(document.createTextNode(_title));
td1.style.verticalAlign = "top";
td1.style.width = "200px";
td1.style.height = "100px";
td1.style.color = "#0000ff";
td1.style.fontFamily = "arial";
tr.appendChild(td1);
document.getElementById('table').appendChild(tr);
}
}
这是一个名为:的函数
function callVideo(x)
{
console.log("Cell index: " + x.cellIndex);
}
谢谢。
我认为您遇到的问题是callVideo函数的上下文。当您构建动态表时,您在td2中创建一个锚标记,然后将事件处理程序放在a标记href上,并传递这个。我怀疑callVideo中的x根本不是TD元素,而是锚点标签(一个标签),由于标签没有cellIndex,因此它将是未定义的。在callVideo中添加console.log(x),并确定x的确切含义。如果我是正确的,x.parentNode应该会为您提供TD标签
function callVideo(x)
{
console.log(x); //Establish what x is
console.log("Cell index: " + x.parentNode.cellIndex);
}
编辑回应评论。
好的,所以您在建立eventHandler的上下文时遇到了问题。我会改变你的设置方式,因为这不是真正的最佳实践。<a>
是一个锚点/链接,点击时运行一个函数会改变它的默认行为,这意味着你让它添加javascript(void)或href="#"之类的东西,并返回false或e.preventDefault(),只是为了阻止它做应该做的事。所有这些都不是最佳实践。为什么不在img或整个单元格中添加一个单击处理程序呢。例如(为了清晰起见,我删除了样式内容,我认为应该在CSS中,而不是在Javascript中)
xmlTitles = xmlDoc.getElementsByTagName("title");
document.getElementById('playlist').innerHTML = "Playlist (" + xmlTitles.length + " videos)";
document.getElementById('table').cellSpacing = "5px";
for (var i = 0; i < xmlTitles.length; i++)
{
tr = document.createElement('tr');
titles[i] = xmlDoc.getElementsByTagName("title")[i].childNodes[0].nodeValue;
image[i] = xmlDoc.getElementsByTagName("image")[i].childNodes[0].nodeValue;
filename[i] = xmlDoc.getElementsByTagName("filename")[i].childNodes[0].nodeValue;
td2 = document.createElement('td');
//change here
var imgEle = document.createElement('img')
imgEle.src = iPath + image[i];
imgEle.addEventListener('click', callVideo);
td2.appendChild(imgEle);
tr.appendChild(td2);
td1 = document.createElement('td');
var _title = titles[i];
td1.appendChild(document.createTextNode(_title));
tr.appendChild(td1);
document.getElementById('table').appendChild(tr);
}
function callVideo()
{
//'this' will be the img itself
//so this.parentNode will be the cell (TD)
console.log(this.parentNode.cellIndex);
//this.parentNode.parentNode will be the row (TR)
console.log(this.parentNode.parentNode.rowIndex);
}
哦,顺便说一句,所有单元格都会返回0,因为这是它们的索引,记住Javascript索引从0开始(即0是第一个,1是第二个等等)。所以说实话,我不知道你为什么需要cellIndex,因为它总是0(即第一个单元格),因为你已经知道它在第一个单元格中,因为你的代码创建了它。尽管如果这只是更大代码的片段,而你在其他单元格中有图像,那么它是有意义的。
如果DOM的动态生成是正确的,则需要进行两项更改。
-
将
<a href="javascript:callVideo(this)">...</a>
更改为<a href="javascript:void(0);" onclick="callVideo(this)">...</a>
,使其成为事件处理程序。否则,因为通过href执行函数是在全局上下文中执行的,此将有效地成为窗口的全球对象。因此,您的函数将接收窗口作为其参数,这是错误的 -
将
callVideo
函数的主体更改为OJay的解决方案函数callVideo(x){console.log(x)//确定x是什么console.log("单元格索引:"+x.parentNode.cellIndex);}
- 从Javascript中选定的行中获取特定单元格的值
- 使用JavaScript获取Gridview单元格值
- jQuery如何获取td单元格值
- 获取关联单元格onchange的值
- 使用 javascript 获取单元格值
- 如何从包含
元素的 javascript 变量中获取单元格数据 - 如何通过单击按钮获取单元格值
- 如何使用 jQuery 循环访问表行并获取单元格值
- 谷歌表格/Javascript:如何“获取单元格”动态值
- Javascript:获取单元格的列 ID
- 如何用javascript/jquery获取单元格中元素的行
- 从自定义小部件onclick内部的dgrid获取单元格值
- JQuery从行对象获取单元格值
- 如何在gridComplete方法上获取单元格值
- 根据第一行的内容从动态HTML表中获取单元格值
- 获取单元格<它有特定的className
- Javascript:如何在当前单元格元素之上获取单元格背景色
- 如何使用JavaScript从表中获取单元格值
- 使用动手表获取单元格数据
- 从HTML中的动态表中获取单元格值