Javascript元素处理
Javascript element handling
我制作了一个表,其中包含来自数据库的许多网格项。
我使用纯javascript和AJAX来编辑和删除这些griditems。
代码:
var main_table=document.getElementById('main-table'),//get the element handler for the table
griditems=main_table.querySelectorAll('.griditem'),//get an array with all the griditems in the main-table
griditems_count=griditems.length;
var griditem_array = [];
for(var i=0;i<griditems_count;i++){
griditem_array[i] = new create_griditem(griditems, i); //here i create a array for every single element and pass the handler for the griditems and the position on the table to the object
function create_griditem(griditems, griditems_count){
var pos=griditems_count;
var id=griditems[pos].getAttribute('data-id'); //the griditem div's also have the id from the Database
var griditems_buttons=griditems[pos].querySelectorAll('.griditem-buttons');
var del_button = griditems_buttons[0].querySelectorAll('.delete')[0];
del_button.addEventListener('click', function() {
alert('Delete '+id);
}, false);
//there are more things called for creating a delete and edit button for every griditem
}
我从表中获取每个griditem,并为每个griditem创建一个对象数组,以便为相应的项目创建适当的按钮。
我的问题是,正如您在第13行(griditems[pos])中看到的那样,我通过从主表的查询选择器中的位置获得元素句柄(或DOM句柄)。但是这个网格是一个可排序的网格,所以我可以拖放项目,并且具有相应id的griditem的位置完全不同。
那么我如何通过我的id获得DOM处理程序,我传递给对象?或者有人能给我一些建议,如何以更好的方式编码整个情况?
编辑:我已经创建了一个小提琴来查看整个程序的运行:http://jsfiddle.net/MCRte/
如您所见,在最后一行main_table.removeChild(griditems[pos]);
中,我通过查询选择器(.griditem)中的位置为主表获取DOM句柄。但是,如果在我删除一个之前,它们的排序发生了变化……其他的将被删除。
如何通过id获得DOM句柄?
根本不需要使用自动执行的匿名函数。只需使用浏览器的事件API。
事件处理程序函数接收一个名为event
的参数,该参数是单击事件对象。event.target
属性是由用户点击的元素,在您的情况下,它将是具有类名"。delete"的按钮。您可以从该元素开始爬上文档树,直到到达具有"。griditem"类名,并抓取data-id
属性,以便知道要删除哪个元素。
var gridItems = document.querySelectorAll('#main-table .griditem'),
i = 0,
length = gridItems.length;
for(i; i < length; i++) {
gridItems[i]
.querySelector(".griditem-buttons .delete")
.addEventListener("click", deleteGridItem);
}
function deleteGridItem(event) {
event.preventDefault();
var gridItem = event.target;
// Climb the document tree from the .delete button to the .griditem
while (gridItem) {
if (gridItem.classList.contains("griditem")) {
break;
}
else {
gridItem = gridItem.parentNode;
}
}
if (gridItem) {
alert("Delete item: " + gridItem.getAttribute("data-id"));
}
else {
throw new Error("Failed to find griditem");
}
}
我假设在某个时候表行将从文档中删除。必须分离事件处理程序以避免内存泄漏。我发现最好的方法是使用事件委托。
JsFiddle: http://jsfiddle.net/Yj2eg/
var table = document.getElementById("main-table");
table.addEventListener("click", function(event) {
if (event.target.nodeName === "BUTTON") {
event.preventDefault();
console.log("BUTTON");
if (event.target.classList.contains("delete")) {
deleteItem(event.target);
}
else if (event.target.classList.contains("edit")) {
editItem(event.target);
}
}
});
function deleteItem(button) {
var gridItem = getGridItem(button);
if (confirm("Delete item: " + gridItem.getAttribute("data-id") + "?")) {
gridItem.parentNode.removeChild(gridItem);
}
}
function editItem(button) {
var gridItem = getGridItem(button);
alert("Edit item: " + gridItem.getAttribute("data-id"));
}
function getGridItem(button) {
var gridItem = button;
while (gridItem) {
if (gridItem.classList.contains("griditem")) {
break;
}
else {
gridItem = gridItem.parentNode;
}
}
if (!gridItem) {
throw new Error("Could not find griditem");
}
return gridItem;
}
我不完全确定您的实际问题是什么,但如果您试图为您的griditem中的一个按钮设置一个单击侦听器,该按钮根据griditem的data-id属性执行操作,那么像这样的东西将完成这项工作:
var main_table = document.getElementById('main-table'); //get the element handler for the table
var griditems = main_table.querySelectorAll('.griditem'); //get an array with all the griditems in the main-table
for (var i = 0; i < griditems.length; i++) {
var griditem = griditems[i];
var id = griditem.getAttribute('data-id');
var del_button = griditem.querySelector('.delete');
del_button.addEventListener('click', function(id) {
alert('Delete ' + id);
}(id), false);
}
- 如何使用jquery处理php循环通过元素
- 处理表行的当前子级,而不是名称或类的所有元素
- 在MVVM视图模型中处理应用程序范围的元素
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- stickyfloat无法处理绝对定位的元素
- SVG元素——处理和选择文本
- 如何在元素中处理鼠标事件,但不能在其子元素上处理
- jQuery on('单击',..)未处理附加的元素
- 如何使用角度事件处理程序引用输入元素的值
- d3与svg在处理元素时的对比
- 基于类附加点击处理程序,只要元素获得该类
- Meteor - 从另一个模板事件处理程序访问 DOM 元素
- stopPropagation是否还会阻止同一元素上的其他处理程序运行
- 在动态创建的元素中包含参数的事件处理程序
- 在处理元素单击事件期间,在循环内部调用window.open()
- 在Javascript中处理元素和使用Jquery Remove方法删除元素之间有什么区别
- 在AngularJS中处理元素大小调整
- 处理元素后面的鼠标事件
- Javascript -需要使用泛型类处理元素
- 处理元素上的单击,但不处理该元素内链接上的单击