2 回答

TA貢獻1906條經驗 獲得超3個贊
當我點擊清除時,它也將作為重置而不是清除行。
您的重置偵聽器聲明為
$('#reset [type="button"]').on('click', function(e) {
...
})
該#reset元素似乎同時包含清除按鈕和重置按鈕,因此單擊其中任何一個都將恢復初始值。
清除按鈕也有自己的兩個處理程序。在代碼中聲明了一個,它又聲明了一個函數(不在處理程序本身中調用)和一個試圖調用所述函數的內聯處理程序。那不應該起作用,因為它在全局范圍內是不可見的。
代替
$(button).on('click',(e)=>{
function doSomethingWith(i) {
...
}
doSomethingWith(e.target.id);
})
如果應該
function doSomethingWith(i) {
...
}
$(document).ready(function(){
$(button).on('click',(e)=>{
doSomethingWith(e.target.id);
});
});
那么它將對處理程序可見,而且在全局范圍內也是可見的,因此您可以使用內聯“onclick”調用它
<button onclick="doSomethingWith({{ forloop.counter }})" >
但是,如果您還在 JS 中聲明了一個內聯處理程序,那么您不應該有一個內聯處理程序。由于您正在處理代碼中的重置按鈕,因此對于清除按鈕也堅持這種方法。
現在,您用來清除行的方法需要您知道行的相對索引,以及每行的輸入,您可以為它們計算各自的 ID。然而,在重置原始值時,您不需要知道任何事情:
$('.reset_button').on('click', function(e) {
// reset current row............
$(this).closest('tr').find(':input:not([type="button"])').each(function(idx, ele) {
// restore the initial value
ele.value = ele.dataset.initvalue;
})
});
該按鈕只需要知道它與<tr>需要恢復其值的其他輸入位于同一元素內。它不關心索引、ID,甚至不關心輸入是什么,只要它們不是按鈕即可。
你應該做同樣的事情來清除這些值:
$('.clear_button').on('click', function(e) {
// reset current row............
$(this).closest('tr').find(':input:not([type="button"])').each(function(idx, ele) {
ele.value = "";
});
});
當談到存儲原始值時,我也習慣求助于 jQuery.data。無論如何,對于這個用例,你可以完全堅持
input.dataset.initialValue = input.value
代替
$(input).data('initialValue',input.value)
只要您牢記這些方法是不可互換的。您不能使用 dataset 設置 initialValue 然后使用 jQuery.data 或其他方式獲取它。
function randomTime() {
return [
Number(100 * Math.random() % 12).toFixed(0).padStart(2, '0'),
Number(100 * Math.random() % 60).toFixed(0).padStart(2, '0')
].join(':');
}
function addFormRow(player_name = 'N/A') {
let tr = $('<tr class="form_row">'),
name = $('<input type="text" name="name" class="name">'),
start = $('<input type="time" name="start" class="start">'),
end = $('<input type="time" name="end" class="end">'),
advanced = $('<input type="number" name="advanced" class="advanced">'),
clear = $('<button class="clear_button">Clear</button>'),
reset = $('<button class="reset_button">Reset</button>');
name.val(player_name);
start.val(randomTime());
advanced.val(parseInt(Math.random() * 100, 10))
end.val(randomTime());
for (let input of [name, start, end, advanced, clear, reset]) {
$('<td>').append(input).appendTo(tr);
}
tr.appendTo('#forms tbody');
}
addFormRow('player one');
addFormRow('player two');
addFormRow('player three');
$(document).ready(function() {
$('#forms tbody tr').each((index,tr)=>{
$(tr).find('input').each((idx,input)=>{
$(input).data('initialValue',$(input).val());
});
})
$(".clear_button").on('click', (e) => {
let $this = $(e.target),
tr = $this.closest('tr');
tr.find('input').each((index, input) => {
input.value = '';
});
});
$(".reset_button").on('click', (e) => {
let $this = $(e.target),
tr = $this.closest('tr');
tr.find('input').each((index, input) => {
$(input).val($(input).data('initialValue'));
});
});
});
.advanced {
width: 4em;
}
.name {
width: 9em;
}
.start,
.end {
width: 5.5em;
}
.form_row input {
height: 1.1em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="forms">
<thead>
<tr>
<th>name</th>
<th>start</th>
<th>end</th>
<th>advance</th>
<th colspan="2">actions</th>
</tr>
</thead>
<tbody>
</tbody>
</table>

TA貢獻1936條經驗 獲得超7個贊
你的$(".clear_button").click()處理程序沒有做任何事情。它定義了一個本地函數,但從不調用它。
與其嘗試從 調用函數onclick(),不如data向保存索引的按鈕添加一個屬性。然后單擊處理程序可以獲取此屬性并使用它來查找需要清除的所有相關元素。
$(".clear_button").click(function() {
var i = $(this).data("rel-id");
document.getElementById("id_form-" + (i - 1) + "-Name").value = " ";
document.getElementById("id_form-" + (i - 1) + "-Start").value = "";
document.getElementById("id_form-" + (i - 1) + "-End").value = "";
document.getElementById("id_form-" + (i - 1) + "-Advanced").value = " ";
});
<input type="button" class="clear_button" data-rel-id="{{ forloop.counter }}" value=" x ">
展開片段
添加回答
舉報