Jquery dirtyforms 在 DIV 单击和 window.location.href 时无法正常工作
Jquery dirtyforms not working properly on DIV click and window.location.href
我使用 jquery.dirtyforms 和 bootstrap 模式来通知用户此页面中未保存某些内容。这与锚点 links 完美配合,但我在页面上有一个 div
,它实际上作为其他页面的 link。此 div
具有包含另一页的 URL 的 data-action
属性,单击时我将 data-action
值设置为 window.location.href
以进行导航。当我单击 div
时,它会在浏览器的默认弹出窗口中显示确认消息,而不是 Bootstrap 模式。我已经为名为 tabDiv
的 div 提供了唯一的 class。我试图在 jquery.dirtyforms.js 中添加对 div 的支持并编写了这个不起作用:
<div class="sf-active div_Header tabDiv" id="div_Header" data-action="@Url.Action("ViewContract", "Contract", new { Id = Request.QueryString["Id"] })">
<span>First</span>
<i class="i_Header"></i>
ClickMe
<div class="ContraHeader glyphicon"></div>
</div>
$(".div_Header").click(function(evt) {
evt.stopImmediatePropagation();
var url = $(this).attr('data-action');
if (url !== undefined)
window.location.href = url;
});
我在 Jquery.DirtyForms.Js 中尝试更改的内容无效
var events = {
bind: function (window, document, data) {
$(window).bind('beforeunload', data, events.onBeforeUnload);
$(document)
.on('click', 'a:not([target="_blank"])', data, events.onAnchorClick)
.on('submit', 'form', data, events.onSubmit)
.on('click', 'div.tabDiv', data, events.onDivCLick);
}, onDivCLick: function(ev){
bindFn(ev);
},
我希望它也能在 div
click 上工作。目前它正在工作,但浏览器默认弹出消息。我也想在此点击上显示相同的 Bootstrap 模式。
将 window.location.href
与 Dirty Forms 一起使用有点棘手。幸运的是,您可以 customize the event binding 在这种情况下进行控制。
请记住,导航需要在两种不同的情况下发生:
- 当表单不脏时。
- 当用户单击对话框上的 "proceed" 时。
因此,最好在这两种情况下使用通用函数。如果只有 1 个事件处理程序以确保没有事件顺序问题,它也能达到最佳效果。
对于第一种情况,您只需将检查脏状态的代码插入到您的事件中。您可以在 bind.dirtyforms
事件中创建您的事件以访问 events
对象实例,然后在适当的时间在您的事件中简单地调用 events.onAnchorClick(ev)
。
Dirty Forms 如果表单脏了将取消事件。所以,你需要检查是否ev.isDefaultPrevented()
returnsfalse
。如果是,则可以安全启动导航。
对于第二种情况,您可以利用 Dirty Forms 挂在事件对象上直到对话框关闭这一事实。如果您将 URL 存储在 ev.data
属性 中,您可以稍后在此过程中访问它。具体来说,当(且仅当)用户单击 "proceed" 时,Dirty Forms 会调用 onRefireClick
事件处理程序。因此,您可以使用之前存储在事件中的 URL 在此处启动自定义导航。
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
input.dirty, input.dirty + label, select.dirty, textarea.dirty {
background-color: red;
}
</style>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap/3.0.0/css/bootstrap.min.css" />
<script type="text/javascript" src="//cdn.jsdelivr.net/g/jquery@1.11.3,bootstrap@3.0.0,jquery.dirtyforms@2.0.0(jquery.dirtyforms.min.js+jquery.dirtyforms.dialogs.bootstrap.min.js)"></script>
</head>
<body>
<form action="/" id="dialog-form-thing" method="post">
<input id="text1" type="text"/>
<div class="sf-active div_Header tabDiv" id="div_Header" data-action="http://www.google.com/">
<span>First</span>
<i class="i_Header"></i>
ClickMe
<div class="ContraHeader glyphicon"></div>
</div>
</form>
<script>
$(function() {
function navigate(url) {
if (url !== undefined)
window.location.href = url;
}
/* Event binding code - call before first .dirtyForms */
$(document).bind('bind.dirtyforms', function (ev, events) {
var originalBind = events.bind;
events.bind = function (window, document, data) {
// Attach the original Dirty Forms events
originalBind(ev);
// Attach a custom event
$(document).on('click', 'div.tabDiv', data, function (ev) {
// Store the URL in the event object for later use
var navUrl = $(this).attr('data-action');
ev.data = { url: navUrl };
// Execute the Dirty Forms logic to open the
// dialog if the page has dirty form(s).
events.onAnchorClick(ev);
// If the page has no dirty forms, this
// will return false, causing navigation.
if (!ev.isDefaultPrevented())
{
navigate(navUrl);
}
});
};
var originalOnRefireClick = events.onRefireClick;
events.onRefireClick = function (ev) {
if (ev.data && ev.data.url)
{
// If we previously stored the URL, navigate to it.
navigate(ev.data.url);
}
else
{
originalOnRefireClick(ev);
}
};
});
$('form').dirtyForms();
});
</script>
</body>
我使用 jquery.dirtyforms 和 bootstrap 模式来通知用户此页面中未保存某些内容。这与锚点 links 完美配合,但我在页面上有一个 div
,它实际上作为其他页面的 link。此 div
具有包含另一页的 URL 的 data-action
属性,单击时我将 data-action
值设置为 window.location.href
以进行导航。当我单击 div
时,它会在浏览器的默认弹出窗口中显示确认消息,而不是 Bootstrap 模式。我已经为名为 tabDiv
的 div 提供了唯一的 class。我试图在 jquery.dirtyforms.js 中添加对 div 的支持并编写了这个不起作用:
<div class="sf-active div_Header tabDiv" id="div_Header" data-action="@Url.Action("ViewContract", "Contract", new { Id = Request.QueryString["Id"] })">
<span>First</span>
<i class="i_Header"></i>
ClickMe
<div class="ContraHeader glyphicon"></div>
</div>
$(".div_Header").click(function(evt) {
evt.stopImmediatePropagation();
var url = $(this).attr('data-action');
if (url !== undefined)
window.location.href = url;
});
我在 Jquery.DirtyForms.Js 中尝试更改的内容无效
var events = {
bind: function (window, document, data) {
$(window).bind('beforeunload', data, events.onBeforeUnload);
$(document)
.on('click', 'a:not([target="_blank"])', data, events.onAnchorClick)
.on('submit', 'form', data, events.onSubmit)
.on('click', 'div.tabDiv', data, events.onDivCLick);
}, onDivCLick: function(ev){
bindFn(ev);
},
我希望它也能在 div
click 上工作。目前它正在工作,但浏览器默认弹出消息。我也想在此点击上显示相同的 Bootstrap 模式。
将 window.location.href
与 Dirty Forms 一起使用有点棘手。幸运的是,您可以 customize the event binding 在这种情况下进行控制。
请记住,导航需要在两种不同的情况下发生:
- 当表单不脏时。
- 当用户单击对话框上的 "proceed" 时。
因此,最好在这两种情况下使用通用函数。如果只有 1 个事件处理程序以确保没有事件顺序问题,它也能达到最佳效果。
对于第一种情况,您只需将检查脏状态的代码插入到您的事件中。您可以在 bind.dirtyforms
事件中创建您的事件以访问 events
对象实例,然后在适当的时间在您的事件中简单地调用 events.onAnchorClick(ev)
。
Dirty Forms 如果表单脏了将取消事件。所以,你需要检查是否ev.isDefaultPrevented()
returnsfalse
。如果是,则可以安全启动导航。
对于第二种情况,您可以利用 Dirty Forms 挂在事件对象上直到对话框关闭这一事实。如果您将 URL 存储在 ev.data
属性 中,您可以稍后在此过程中访问它。具体来说,当(且仅当)用户单击 "proceed" 时,Dirty Forms 会调用 onRefireClick
事件处理程序。因此,您可以使用之前存储在事件中的 URL 在此处启动自定义导航。
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
input.dirty, input.dirty + label, select.dirty, textarea.dirty {
background-color: red;
}
</style>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap/3.0.0/css/bootstrap.min.css" />
<script type="text/javascript" src="//cdn.jsdelivr.net/g/jquery@1.11.3,bootstrap@3.0.0,jquery.dirtyforms@2.0.0(jquery.dirtyforms.min.js+jquery.dirtyforms.dialogs.bootstrap.min.js)"></script>
</head>
<body>
<form action="/" id="dialog-form-thing" method="post">
<input id="text1" type="text"/>
<div class="sf-active div_Header tabDiv" id="div_Header" data-action="http://www.google.com/">
<span>First</span>
<i class="i_Header"></i>
ClickMe
<div class="ContraHeader glyphicon"></div>
</div>
</form>
<script>
$(function() {
function navigate(url) {
if (url !== undefined)
window.location.href = url;
}
/* Event binding code - call before first .dirtyForms */
$(document).bind('bind.dirtyforms', function (ev, events) {
var originalBind = events.bind;
events.bind = function (window, document, data) {
// Attach the original Dirty Forms events
originalBind(ev);
// Attach a custom event
$(document).on('click', 'div.tabDiv', data, function (ev) {
// Store the URL in the event object for later use
var navUrl = $(this).attr('data-action');
ev.data = { url: navUrl };
// Execute the Dirty Forms logic to open the
// dialog if the page has dirty form(s).
events.onAnchorClick(ev);
// If the page has no dirty forms, this
// will return false, causing navigation.
if (!ev.isDefaultPrevented())
{
navigate(navUrl);
}
});
};
var originalOnRefireClick = events.onRefireClick;
events.onRefireClick = function (ev) {
if (ev.data && ev.data.url)
{
// If we previously stored the URL, navigate to it.
navigate(ev.data.url);
}
else
{
originalOnRefireClick(ev);
}
};
});
$('form').dirtyForms();
});
</script>
</body>