Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaScript为tr元素动态添加onclick事件_Javascript_Html_Onclick - Fatal编程技术网

从JavaScript为tr元素动态添加onclick事件

从JavaScript为tr元素动态添加onclick事件,javascript,html,onclick,Javascript,Html,Onclick,我正在动态创建一个表,在添加每个元素时,我需要为每个元素添加一个onclick事件,但这需要一个动态参数add,我尝试了以下方法 trElements[i + 1].onclick = function () { navigateToController('/Home/Client', "'" + machine.DeviceID + "'"); }; 但这将onclick事件显示为navigateToController'/Home/Client'、“+machine.Devic

我正在动态创建一个表,在添加每个元素时,我需要为每个元素添加一个onclick事件,但这需要一个动态参数add,我尝试了以下方法

trElements[i + 1].onclick = function () { 
    navigateToController('/Home/Client', "'" + machine.DeviceID + "'"); 
};
但这将onclick事件显示为navigateToController'/Home/Client'、“+machine.DeviceID+”

而不是导航到控制器“/Home/Client”、“DeviceName”;正如我所想,我还尝试在html中使用onclick事件,并用实际的DEVICEID替换DEVICEID

var element = trElements[i + 1].outerHTML.replace('DEVICEID', machine.DeviceID);
trElements[i + 1].outerHTML = element; 
这显示为正确的,但是当页面加载时,它仍然有deviceid在其中


我相信这是非常简单的事情。。。但是如果有任何建议,我都会很感激。

我不完全确定我是否理解这个问题,但这可能是一个范围问题。您可能需要使用创建当前值为DeviceID的处理程序:

var=0; 函数navigateToControllermachineId{ alertmachineId; } 函数addRow{ var t=document.getElementById'thetable'; var tr=t.insertRow; var td=tr.insertCell; td.appendChilddocument.createTextNodemachine+machineId; tr.addEventListener'click',navigateToController.bindnull,machineId; machineId++; } 添加行
做这件事最好的办法是根本不做

最好将事件处理程序附加到现有容器中。在这种情况下,表看起来不错,并检查冒泡事件

使用jQuery非常简单:

var myTable = $("table#theTable");
myTable.on("click", "tr", function(){ // Click event handler.
    var clickedRow = $(this);
    ...
});
如果您需要一些与每行相关的数据,只需在标记的数据-属性(即«data myId=someId»)中附加到它。然后,您可以通过事件处理程序函数中的clickedRow.datamyId简单地读取它们


这样,您就有了一个函数来处理所有行的所有事件。更简单,浪费更少的内存。

好的,因此我无法深入了解动态添加onClick函数的细节,因此,我更改了代码,并传递了一个viewModel数组,其中包含创建表所需的所有数据,因此当我打开clients视图时,我会发送所有相关客户端的列表,当我选择所需的行时,我只需传递客户端的单个viewmodel,然后用c code@model.variable更新html。一旦信号器代码被创建,我就可以很容易地从中更新它们

trElements[i + 1].onclick = (function () { 
    var deviceId = machine.DeviceID;
    return function(){
       navigateToController('/Home/Client', "'" + deviceId  + "'");
    } 
})();
谢谢大家的意见

为了更新,我找到了一个解决方案,我认为,我可以创建元素,将数据添加到innerHtml,并使用:

setAttributeonclick,navigateToController'/Home/Client',“+deviceId+”


我已经在我的解决方案的另一部分中使用了它,它可以工作…

您也可以提供相应的HTML标记吗?作为一个功能强大的嵌入式代码片段或类似JSFIDLE的链接将是理想的选择。我尝试只使用machine.DeviceID,但当我循环到下一个元素,并检查上一个元素的onclick函数时,它显示为-function{navigateToController'/Home/Client',machine.DeviceID;}?我已经用一个演示使用的代码片段更新了上面的答案。如果我在设备上循环,并检查我设置的上一个的onclick函数,它会像上面一样显示在调试器中,而不是像我认为的那样仅显示navigateToController'/Home/Client',deviceid,或者我可能在这方面完全错了…你是说navigateToController接收到错误的值,还是只是在inspector中查看行的onclick属性时看不到值?如果我查看onclick属性,正如我上面所示,因此它的变量名应该是变量值所在的位置。。。很奇怪?