如果用户使用 onbefoerunload 导航,如何在 jexcel 单元格发生变化时发出警报
how to alert when changes in jexcel cells if user navigates using onbefoerunload
我想对 jexcel 单元格中所做的更改显示警报。
我有一个保存数据的保存按钮。现在,如果用户更改任何单元格,我想在导航到其他页面时使用 onbeforeunload
显示警报。
var unsaved = false;
$(":input").change(function(){ //triggers change in all input fields including text type
unsaved = true;
});
function unloadPage(){
if(unsaved) {
return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?";
}
}
window.onbeforeunload = unloadPage;
此代码仅适用于输入类型。如何使其适用于 jexcel 细胞。我使用 jexcel v4
您可以将 onchange
事件侦听器附加到您的 jexcel table,这里有一个 jsfiddle 来演示如何侦听单元格上的更改事件,这里还有代码作为代码段(该代码段将不起作用,因为 SO 是沙箱,它不允许某些代码 运行,如果您对其进行测试,该代码段将在您的本地计算机上运行):
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
<script src="//bossanova.uk/jexcel/v4/jexcel.js"></script>
<script src="//bossanova.uk/jsuites/v2/jsuites.js"></script>
<link rel="stylesheet" href="//bossanova.uk/jexcel/v4/jexcel.css" type="text/css" />
<link rel="stylesheet" href="//bossanova.uk/jsuites/v2/jsuites.css" type="text/css" />
<div id="spreadsheet"></div>
<div>
<button onclick="$('#log').html('')">Clear</button><br>
<p>Log:</p>
<div id="log" style="background-color:#c7eaff; border-radius:2px; color:#000; padding:20px"></div>
</div>
<script>
var changed = function(instance, cell, x, y, value) {
var cellName = jexcel.getColumnNameFromId([x,y]);
$('#log').append('<p>New change on cell ' + cellName + ' to: ' + value + '</p>');
}
var data = [
['Mazda', 2001, 2000, '2006-01-01'],
['Pegeout', 2010, 5000, '2005-01-01'],
['Honda Fit', 2009, 3000, '2004-01-01'],
['Honda CRV', 2010, 6000, '2003-01-01'],
];
jexcel(document.getElementById('spreadsheet'), {
data:data,
rowResize:true,
columnDrag:true,
columns: [
{ type: 'text', width:'200' },
{ type: 'text', width:'100' },
{ type: 'text', width:'100' },
{ type: 'calendar', width:'100' },
],
onchange: changed
});
</script>
</html>
因此您可以简单地在 onchange
事件侦听器中更改未保存的 variable/flag,此示例也取自 official website,其中有一个附加的事件侦听器列表jexcel table
Jsuites 是 jexcel 的依赖项,并且已经有一个插件可以实现它。
<form id='myForm'>
<input type='hidden' name='data'>
<div id='spreadsheet'></div>
<input type='button' value='Save data' onclick='saveData(); myTracker.resetTracker()'>
</form>
<script>
var myTracker = jSuites.tracker(document.getElementById('myForm'));
jexcel(document.getElementById('spreadsheet'), {
onafterchanges: function(el) {
document.forms[0].name.value = el.jexcel.getData();
}
}
</script>
所以,基本上您实现 saveData 来保存您的数据并重置跟踪器以再次开始跟踪更改。
此处的另一个更改是仅在设置初始 table 内容后才启动 formTracker。因此,如果用户打开 table 不执行任何更改,并且离开不会提醒,因为数据没有更改。
我想对 jexcel 单元格中所做的更改显示警报。
我有一个保存数据的保存按钮。现在,如果用户更改任何单元格,我想在导航到其他页面时使用 onbeforeunload
显示警报。
var unsaved = false;
$(":input").change(function(){ //triggers change in all input fields including text type
unsaved = true;
});
function unloadPage(){
if(unsaved) {
return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?";
}
}
window.onbeforeunload = unloadPage;
此代码仅适用于输入类型。如何使其适用于 jexcel 细胞。我使用 jexcel v4
您可以将 onchange
事件侦听器附加到您的 jexcel table,这里有一个 jsfiddle 来演示如何侦听单元格上的更改事件,这里还有代码作为代码段(该代码段将不起作用,因为 SO 是沙箱,它不允许某些代码 运行,如果您对其进行测试,该代码段将在您的本地计算机上运行):
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
<script src="//bossanova.uk/jexcel/v4/jexcel.js"></script>
<script src="//bossanova.uk/jsuites/v2/jsuites.js"></script>
<link rel="stylesheet" href="//bossanova.uk/jexcel/v4/jexcel.css" type="text/css" />
<link rel="stylesheet" href="//bossanova.uk/jsuites/v2/jsuites.css" type="text/css" />
<div id="spreadsheet"></div>
<div>
<button onclick="$('#log').html('')">Clear</button><br>
<p>Log:</p>
<div id="log" style="background-color:#c7eaff; border-radius:2px; color:#000; padding:20px"></div>
</div>
<script>
var changed = function(instance, cell, x, y, value) {
var cellName = jexcel.getColumnNameFromId([x,y]);
$('#log').append('<p>New change on cell ' + cellName + ' to: ' + value + '</p>');
}
var data = [
['Mazda', 2001, 2000, '2006-01-01'],
['Pegeout', 2010, 5000, '2005-01-01'],
['Honda Fit', 2009, 3000, '2004-01-01'],
['Honda CRV', 2010, 6000, '2003-01-01'],
];
jexcel(document.getElementById('spreadsheet'), {
data:data,
rowResize:true,
columnDrag:true,
columns: [
{ type: 'text', width:'200' },
{ type: 'text', width:'100' },
{ type: 'text', width:'100' },
{ type: 'calendar', width:'100' },
],
onchange: changed
});
</script>
</html>
因此您可以简单地在 onchange
事件侦听器中更改未保存的 variable/flag,此示例也取自 official website,其中有一个附加的事件侦听器列表jexcel table
Jsuites 是 jexcel 的依赖项,并且已经有一个插件可以实现它。
<form id='myForm'>
<input type='hidden' name='data'>
<div id='spreadsheet'></div>
<input type='button' value='Save data' onclick='saveData(); myTracker.resetTracker()'>
</form>
<script>
var myTracker = jSuites.tracker(document.getElementById('myForm'));
jexcel(document.getElementById('spreadsheet'), {
onafterchanges: function(el) {
document.forms[0].name.value = el.jexcel.getData();
}
}
</script>
所以,基本上您实现 saveData 来保存您的数据并重置跟踪器以再次开始跟踪更改。
此处的另一个更改是仅在设置初始 table 内容后才启动 formTracker。因此,如果用户打开 table 不执行任何更改,并且离开不会提醒,因为数据没有更改。