这实际上并不是我目前正在尝试做的事情;我刚刚在另一张桌子上工作时发现我不知道我是怎么做的,而且乘坐火车回家的整个过程让我感到困惑的是不同的解决方案,我无法想象这些解决方案。
想象一下这种情况:有一个50行的表。每行是一个按钮。单击时,此按钮应对其所在的行执行某些操作 - 例如,使其所有文本删除,或使用第一个单元格的值进行AJAX调用。
您将如何绑定这些事件处理程序?
我最初的想法就像是
buttons = document.getElementsByTagName("input");
rows = document.getElementsByTagName("tr");
for (i=0;i<buttons.length;i++) {
buttons[i].addEventListener('click',function() {
makeAjaxCall(rows[i]);
});
};
即,
问题当然是makeAjaxCall
会在调用i
时检查i
的值,到时为buttons.length
等于i
,因此该函数只能在表的最后一行上工作。
所以我想你需要找到一些方法来实际硬编码函数处理程序中{{1}}的当前值......这是我不会做的事情。甚至认为是可能的。是吗?你怎么会这样做呢?
答案 0 :(得分:1)
您可以使用“this”
来引用要添加事件侦听器的按钮对象给出这种格式的表格
<table>
<tr>
<td> <input type='button'> </td>
<td> 1st <td>
</tr>
<tr>
<td> <input type='button'> </td>
<td> 2nd <td>
</tr>
<tr>
<td> <input type='button'> </td>
<td> 3rd <td>
</tr>
</table>
以下代码将允许您访问下一个单元格中的数据,使用console.log()而不是任何ajax调用。
buttons = document.getElementsByTagName("input");
for (i=0;i<buttons.length;i++) {
buttons[i].addEventListener('click',function() {
makeAjaxCall(this);
});
};
function makeAjaxCall(btn) {
var sib=btn.parentNode.nextSibling;
while (sib.nodeName !='TD') {
sib=sib.nextSibling;
}
console.log(sib.innerHTML);
}
这可以扩展为查找行中的任何数据。
本节
while (sib.nodeName !='TD') {
sib=sib.nextSibling;
}
跳过单元格之间的任何无关字符(空格等)。
答案 1 :(得分:0)
有趣的问题。我会像@kennebec在上面的评论中所说的那样去做。
这是小提琴:http://jsfiddle.net/u988D/
首先,添加数据属性的标记略有变化
<table>
<tr>
<td data-to-json="id">1</td>
<td data-to-json="text">Lorem ipsum dolor.</td>
<td><button type="button">Click Me</button></td>
</tr>
<tr>
<td data-to-json="id">2</td>
<td data-to-json="text">Lorem ipsum dolor.</td>
<td><button type="button">Click Me</button></td>
</tr>
<tr>
<td data-to-json="id">3</td>
<td data-to-json="text">Lorem ipsum dolor.</td>
<td><button type="button">Click Me</button></td>
</tr>
</table>
然后是javascript。可能可以进一步优化。
var table = document.querySelector("table")
table.addEventListener("click", function(e) {
var element = e.target,
parent
//If the element is a button
if ( element && element.nodeName == "BUTTON" ) {
parent = element.parentNode
//Find the closest parent that is a TR
while ( parent.nodeName !== "TR" ) {
parent = parent.parentNode
}
//Convert Row to JSON
var json = {},
child
for ( var i = 0, _len = parent.children.length; i < _len; i++ ) {
child = parent.children[i]
if ( child.hasAttribute("data-to-json") ) json[child.getAttribute("data-to-json")] = child.innerText
}
// Do your AJAX stuff here
console.log(json)
}
})