想要通过在某一行的 td 中添加事件监听器来调用一个 javascript 函数
2021-04-08
373
我已完成以下操作。
<td class="text-center"><a href="#" title="" id="signal_<?=$rs['signal_id']?>" addEventListener('click','editSignal(this)') data-toggle="modal" data-target="#send_distress_modal"><i class="fa fa-edit"></i></a></td>
<td class="text-center"><a href="#" title="" id="signal_<?=$rs['signal_id']?>" onclick="deleteSignal(this);"><i class="fa fa-trash"></i></a></td>
我已使用 onclick 完成此操作,但想使用 addeventlistener('click,'anyFunction') 执行相同操作。 因为当我使用 onclick 时,它会出现以下错误;
VM7707 log:330 Uncaught ReferenceError: editSignal is not defined
at HTMLAnchorElement.onclick (VM7707 log:330)
以下这些函数都存在一些问题,单击时都会出现错误。无法弄清楚问题是什么。
<script type="text/javascript">
function editSignal(obj) {
// alert(obj.id);
var obj_id = obj.id;
var id = obj_id.split("_");
console.log(id);
let _token = $('meta[name="csrf-token"]').attr('content');
$.ajax({
url: 'send_distress_signal',
type: 'POST',
dataType: 'json',
data: {edit_signal_id: id[1],
// _token: _token
}},
})
.done(function(result) {
console.log(result);
$('#description').val(result['description']);
$('#resType').val(result['resource_type']);
$('#res').val(result['resource']);
$('#resource_hidden').val(result['resource']);
$('#location').val(result['location']);
$('#edit_flag_signal').val(result['signal_id']);
populateResource();
})
.fail(function() {
alert("error");
});
}
function deleteSignal(obj) {
// alert(obj.id);
var obj_id = obj.id;
var id = obj_id.split("_");
$.ajax({
url: 'includes/sendDistress_action.php',
type: 'POST',
data: {del_signal_id: id[1]},
})
.done(function(result) {
if(result=="Success"){
location.reload();
}else{
alert("Some error occured");
}
})
.fail(function() {
alert("error");
});
}
$('#distress_btn').on('click', function(event) {
event.preventDefault();
/* Act on the event */
$('#description').val('');
$('#resType').val('');
$('#res').val('');
$('#resource_hidden').val('');
$('#location').val('');
$('#edit_flag_signal').val('0');
});
谢谢。
2个回答
这些只是示例的测试代码。重点关注
<script>
部分。
如果您想使用 addEventListener,则必须在事件目标的脚本部分中使用它,这在
文档
中已明确说明。
<html>
<head>
<style>
table {
width: 100%;
border: 1px solid black;
}
td {
width: auto;
height: auto;
border: 1px solid black;
}
</style>
</head>
<script type="text/javascript">
var td1ClickCount = 0;
function customClickFunction() {
clickCount += 1;
console.log("clickCount : " + clickCount);
}
function editSignal(element) {
console.log("editSignal From id : " + element.id);
}
function deleteSignal(element) {
console.log("deleteSignal From id : " + element.id);
}
</script>
<body>
<table>
<tr>
<td id="td1" class="text-center">
<a href="#" title="" id="signal_1" onclick="editSignal(this);">
<i class="fa fa-edit">signal_1</i>
</a>
</td>
<td id="td2" class="text-center">
<a href="#" title="" id="signal_2" onclick="deleteSignal(this);">
<i class="fa fa-trash">signal_2</i>
</a>
</td>
</tr>
</table>
</body>
<script type="text/javascript">
//EventTarget.addEventListener(type, listener, ...);
document.getElementById("td1").addEventListener('click', function(event){
td1ClickCount += 1;
console.log(event.target + " click count: " + td1ClickCount);
});
</script>
</html>
Jejun
2021-04-08
请避免在 HTML 元素中添加“addEventListener”,而是在同一个 HTML 或外部 js 文件中的标签中使用。我注意到 HTML 和 javascript 代码中存在一些问题,因此我建议您在 HTML 和 Javascript 代码中进行以下更改。我相信它会正常工作。
- 不要使用 id="signal_...",而要使用 row-id="signal_...",这样编辑和删除元素就不会具有相同的 ID。 相同的 Id 不遵循 HTML 标准规则。
- 从 HTML 元素中删除“addEventListener”,并在 javascript 部分中使用替代方法。
- 添加类属性并使用此类属性注册事件侦听器,这也遵循 HTML 标准规则。
<td class="text-center"><a href="#" class="editSignal" title="" row-id="signal_<?=$rs['signal_id']?>" data-toggle="modal" data-target="#send_distress_modal"><i class="fa fa-edit"></i></a></td>
<td class="text-center"><a href="#" title="" class="deleteSignal" row-id="signal_<?=$rs['signal_id']?>" ><i class="fa fa-trash"></i></a></td>
然后在脚本部分使用以下 javascript 函数。
$(document).on('click','.editSignal',function(){
var obj_id = $(this).attr('row-id');
//alert(obj_id);
var id = obj_id.split("_");
console.log(id);
//return;
let _token = $('meta[name="csrf-token"]').attr('content');
$.ajax({
url: 'send_distress_signal',
type: 'POST',
dataType: 'json',
data: {edit_signal_id: id[1]},
// _token: _token
}).done(function(result) {
console.log(result);
$('#description').val(result['description']);
$('#resType').val(result['resource_type']);
$('#res').val(result['resource']);
$('#resource_hidden').val(result['resource']);
$('#location').val(result['location']);
$('#edit_flag_signal').val(result['signal_id']);
populateResource();
}).fail(function() {
alert("error");
});
});
$(document).on('click','.deleteSignal',function(){
var obj_id = $(this).attr('row-id');
var id = obj_id.split("_");
console.log(id);
//return;
$.ajax({
url: 'includes/sendDistress_action.php',
type: 'POST',
data: {del_signal_id: id[1]},
})
.done(function(result) {
if(result=="Success"){
location.reload();
}else{
alert("Some error occured");
}
})
.fail(function() {
alert("error");
});
});
希望它现在能正常工作。如果仍然不起作用,请将 HTML 和 Javascript 代码发送给我以供审核,我会相应地为您提供解决方案。
FossMentor
2021-04-08