我正在研究一些jQuery,以检查表中的单元格是否已被编辑。如果有,则修订通过ajax发送回数据库。我正在使用超时延迟为用户提供2500毫秒的击键次数以进行全面校正并在完成时捕获。如果他们点击html表中的其他td
,我也会使用模糊绕过超时延迟。一旦ajax完成,我添加一个"已保存的" class td
并在if
语句中包含ajax,这样只有在"保存"时才会出现ajax。上课没有。这只允许ajax发生一次。
我的问题:即使上面添加了一些注意事项,当td
没有模糊并且保持超时时,ajax会发生两次。我可以验证这一点,因为消息框出现两次,我的表中的值加倍(因为它们应该是因为表数据有意添加到该点中的任何旧数据)
我的问题:为什么会发生这种情况,我该如何解决?
旁注: toastr代码也停止了工作,我不确定原因。
$('td').on('input blur', function(e) {
var timeoutDelay=2500;
if( e.type == "blur"){
timeoutDelay=1;
}
// If NOT already saved...
if( !$(this).hasClass("saved") ){
var _this = $(this); // preserve reference to the input field here
clearTimeout(saveTimeout);
saveTimeout = setTimeout(function() {
console.log(_this)
$.ajax({
method: "POST",
url: "updatedatabase.php",
data: {
content: _this.text(),
date: _this.siblings().first().text(),
prod: $('tr:first-child th:nth-child(' + (_this.index() + 1) + ')').text(),
old: old
}
})
.done(function( msg ) {
alert( msg );
// Add the "saved" class to prevent other saving
_this.addClass("saved");
});
toastr.options = {
"positionClass": "toast-top-center",
"onclick": null,
"timeOut": "2500",
}
toastr.info(old,'Database Updated!<br><br>Your Previous Amount Was:');
_this.prop('contenteditable', false);
}, timeoutDelay);
}
});
$(document).ready(function () {
var old;
$('td').click(function(){
old=$(this).text();
$(this).prop('contenteditable', true);
});
var saveTimeout;
// Remove the "saved" class on keydown
$('td').on('keydown', function(e) {
$(this).removeClass("saved");
});
$('td').on('input blur', function(e) {
var timeoutDelay=2500;
if( e.type == "blur"){
timeoutDelay=1;
}
// If NOT already saved...
if( !$(this).hasClass("saved") ){
var _this = $(this); // preserve reference to the input field here
// Add the "saved" class to prevent other saving
_this.addClass("saved");
clearTimeout(saveTimeout);
saveTimeout = setTimeout(function() {
console.log(_this)
$.ajax({
method: "POST",
url: "updatedatabase.php",
data: {
content: _this.text(),
date: _this.siblings().first().text(),
prod: $('tr:first-child th:nth-child(' + (_this.index() + 1) + ')').text(),
old: old
}
})
.done(function( msg ) {
alert( msg );
});
toastr.options = {
"positionClass": "toast-top-center",
"onclick": null,
"timeOut": "2500",
}
toastr.info(old,'Database Updated!<br><br>Your Previous Amount Was:');
_this.prop('contenteditable', false);
}, timeoutDelay);
}
});
$("td").hover(function(){
$(this).addClass('highlight').siblings().first().addClass('highlight');
$('tr:eq(1) th:eq('+$(this).index()+')').addClass('highlight');
},function(){
$(this).removeClass("highlight").siblings().first().removeClass('highlight');
$('tr:eq(1) th:eq('+$(this).index()+')').removeClass('highlight');
});
});
&#13;
table,th, td {
border: 1px solid black;
border-collapse: collapse;
}
.highlight {
background-color:#E0E0E0;
color: blue;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/1.3.1/css/toastr.css" rel="stylesheet"/>
<script src="http://cdnjs.cloudflare.com/ajax/libs/toastr.js/1.3.1/js/toastr.js"></script>
<table>
<tr>
<th>Item #</th>
<th>1234567</th>
<th>7654321</th>
<th>5678945</th>
</tr>
<tr>
<th>Product</th>
<th><u>22 ounce Dark</u></th>
<th><u>12count 4oz Dark</u></th>
<th><u>24count 6oz TJ</u></th>
</tr>
<tr>
<th>2016-01-03</th>
<td>13587</td>
<td>2203</td>
<td>4111</td>
</tr>
<tr>
<th>2016-01-04</th>
<td>14111</td>
<td>3247</td>
<td>4332</td>
</tr>
<tr>
<th>2016-01-05</th>
<td>13212</td>
<td>3101</td>
<td>3911</td>
</tr>
<tr>
<th>2016-01-06</th>
<td>16335</td>
<td>3299</td>
<td>4001</td>
</tr>
<tr>
<th>2016-01-07</th>
<td>15421</td>
<td>3100</td>
<td>4078</td>
</tr>
</table>
&#13;