Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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箭头函数获取clicked元素的属性?_Javascript_Html_Dom Events_Arrow Functions - Fatal编程技术网

为什么我不能用这个JavaScript箭头函数获取clicked元素的属性?

为什么我不能用这个JavaScript箭头函数获取clicked元素的属性?,javascript,html,dom-events,arrow-functions,Javascript,Html,Dom Events,Arrow Functions,我正在用从对象数组中提取的数据填充HTML表: 出租汽车=[{ 被许可人:“23456纽约”, 抵达日期:新日期2020年9月16日11月34日30日, 假期:新日期, 标记:正确 }, { 被许可人:“56456纽约”, 抵达日期:新日期2020年8月24日10月33日30日, 假期:新日期2020年8月24日13月50日35日, 标记为:假 }, { 被许可人:“56780纽约”, 抵达日期:新日期2020年5月12日20月33日30日, 假期:新日期2020年5月12日21月33日30日

我正在用从对象数组中提取的数据填充HTML表:

出租汽车=[{ 被许可人:“23456纽约”, 抵达日期:新日期2020年9月16日11月34日30日, 假期:新日期, 标记:正确 }, { 被许可人:“56456纽约”, 抵达日期:新日期2020年8月24日10月33日30日, 假期:新日期2020年8月24日13月50日35日, 标记为:假 }, { 被许可人:“56780纽约”, 抵达日期:新日期2020年5月12日20月33日30日, 假期:新日期2020年5月12日21月33日30日, 标记为:假 } ]; const formatDate=日期=>{ var hours=date.getHours; var minutes=date.getMinutes; var ampm=小时数>=12?“下午”:“上午”; 小时数=小时数%12; 小时数=小时数?小时数:12; 分钟=分钟<10?'0'+分钟:分钟; var strTime=hours+':'+minutes+''+ampm; 返回日期.getDate+/+date.getMonth+1+/+date.getFullYear++strTime; } const secondsToHours=d=>{ d=数字; 设h=Math.ceild/3600; 返回h; } const makeBill=car=>{ 让arrivedAt=new Datecar.arrival.getTime; 让leftAt=new Datecar.leave.getTime; //持续时间(秒) let duration=leftAt-arrivedAt/1000; 让hoursBilled=secondsToHoursduration; 让billValue=car.isParked?-:10+小时计费-1*5+LEI; 返回billValue; } const renterTable==>{ //在顶部显示新的 汽车倒车; 让结果=; 对于变量i=0;i{ 返回车。i标记?输入:输出; } const changeStatus=e=>{ let car=cars[e.target.dataset.row]; 控制台、行车记录仪; } 可出租; 停车场, 停车场运输署{ 空白:nowrap; 字体大小:14px; } 车牌 到了 脱党 地位 支付 行动
由于未传递事件对象,因此未定义。更改:

onclick="changeStatus()"
致:

还要注意,使用内联处理程序不是一个好的实践。如果您关心良好实践,请不要使用内联事件处理程序。而是选择javascript中的元素并将click事件侦听器附加到该元素:


由于未传递事件对象,因此未定义。更改:

onclick="changeStatus()"
致:

还要注意,使用内联处理程序不是一个好的实践。如果您关心良好实践,请不要使用内联事件处理程序。而是选择javascript中的元素并将click事件侦听器附加到该元素:


问题出在按钮标签上:尝试用onclick=changeStatus替换onclick=changeStatus


您应该将函数的引用传递给按钮,这就是变量e未设置的原因。问题出在按钮标记中:尝试用onclick=changeStatus替换onclick=changeStatus

您应该将函数的引用传递给按钮,这就是为什么没有设置变量e的事件

它说它无法读取未定义的目标

因此,e是未定义的

因此,请查看函数的调用位置:

您没有传递任何参数,因此e将获得默认值undefined

不要使用内部事件属性。他们有很多问题

如果使用addEventListener添加事件处理程序,那么它将获得一个事件对象作为第一个参数

const buttons = document.querySelector(".btn-success");
for (let i = 0; i < buttons.length; i++) {
    buttons[i].addEventListener("click", changeStatus);
}
考虑使用而不是将事件处理程序单独绑定到每个按钮

它说它无法读取未定义的目标

因此,e是未定义的

因此,请查看函数的调用位置:

您没有传递任何参数,因此e将获得默认值undefined

不要使用内部事件属性。他们有很多问题

如果使用addEventListener添加事件处理程序,那么它将获得一个事件对象作为第一个参数

const buttons = document.querySelector(".btn-success");
for (let i = 0; i < buttons.length; i++) {
    buttons[i].addEventListener("click", changeStatus);
}

考虑使用,而不是将事件处理程序单独绑定到每个按钮。

首先,您必须将某些内容传递给函数:

onclick="changeStatus(this)"
你的意思是在这个时刻“这个元素”在这个答案中是如此之多的“这个”

这意味着您没有event.target,但有元素:

const changeStatus = (element) => {
  let car = cars[element.dataset.row];
  console.log(car);
}
工作代码:

顺便说一句,更好的选择是addEventListener而不是onclick

@编辑:

在这种特定情况下,最好使用此解决方案:

<button data-row="${i}" onclick="changeStatus(${i})" class="btn btn-sm btn-success">Summary</button>

首先,您必须传递某些内容才能正常工作:

onclick="changeStatus(this)"
你的意思是在这个时刻“这个元素”在这个答案中是如此之多的“这个”

这意味着您没有event.target,但有元素:

const changeStatus = (element) => {
  let car = cars[element.dataset.row];
  console.log(car);
}
工作代码:

顺便说一句,更好的选择是addEventListener而不是onclick

@编辑:

在这种特定情况下,最好使用此解决方案:

<button data-row="${i}" onclick="changeStatus(${i})" class="btn btn-sm btn-success">Summary</button>
在…上
click=changeStatus-您没有显式传递任何参数,因此e是未定义的。有几种方法可以解决这个问题,但我强烈建议不要使用内联onclick属性,而是使用addEventListener。onclick=changeStatus-您没有显式传递任何参数,因此e是未定义的。有几种方法可以解决这个问题,但我强烈建议不要使用内联onclick属性,而是使用addEventListener。也可以执行changeStatusthis,它将传递元素本身,然后处理程序可以是el=>{let car=cars[el.dataset.row];console.logcar;}如果我将函数更改为ChangeStatus,我得到的e未定义。谢谢你的帮助!:@RazvanZamfir不会改变状态。用法:changeStatusevent。event是一个关键字urrgh,这可能会起作用,但使用全局事件是很可怕的,这是在内联事件处理程序之上的。对于OP:如果您关心良好的编码实践,请使用@Quentin的答案,而不是这一个。也可以执行changeStatusthis,它将传递元素本身,然后处理程序可以是el=>{let car=cars[el.dataset.row];console.logcar;}如果我将函数更改为changeStatuse,则未定义I get e。谢谢你的帮助!:@RazvanZamfir不会改变状态。用法:changeStatusevent。event是一个关键字urrgh,这可能会起作用,但使用全局事件是很可怕的,这是在内联事件处理程序之上的。对于OP:如果您关心良好的编码实践,请使用@Quentin的答案,而不是这个答案。onclick的值是一个函数体。即使变量包含函数,提及变量也不会对其产生任何影响。onclick的值是函数体。提到一个变量,即使该变量包含一个函数,也不会对它做任何事情。