jquery-blockui - DirtyForms 不能与 $.blockUI 一起正常工作

标签 jquery-blockui jquery-dirtyforms

我正在使用 DirtyForms$.blockUI插件,后者在单击链接时更改页面(在我的应用程序中,某些页面需要几秒钟才能加载并且视觉反馈很好)。

当我更改字段内容然后单击任何链接时,会触发 DirtyForms:但是当我取消该过程以停留在页面上时,$.blockUI开始游戏,导致页面卡住

$('form[method="post"]').dirtyForms();
$('a').on('click', function(){
	$.blockUI();
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.dirtyforms/2.0.0/jquery.dirtyforms.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js"></script>

<p>Change the field content to activate DirtyForms, then click on the link.<br>
When the popup appears, click on "cancel" to stay on the page.<br>
Watch blockUI getting fired as the link is going to be followed</p>
<form action="#" method="post">
  <input type="text" name="username" required>
  <button type="submit">send</button>
</form>
<a href="https://google.com">click me after changing field content</a>


请问有什么解决办法吗?

编辑:我也试过 stay.dirtyformsafterstay.dirtyforms事件,但它们没有影响。 defer.dirtyforms似乎工作,但事件被触发两次(我放了一个 console.log() 来检查),我不确定这是要走的路......

最佳答案

我已经编辑了我的答案:我添加了一些代码来首先禁用 onbeforeunload对话提醒,taken from here .最后还有一个答案的链接,其中包含另一个您可以尝试的想法。

我的想法:您必须阻止默认链接操作并使用 $.blockUI Modal Dialogs methods打开自定义对话框,然后捕获链接属性 href从链接把它放在一个变量中,并使用 #yes 的变量值对话框的按钮。

看看这个解决方案能否满足您的需求

/* beforeunload bind and unbind taken from https://gist.github.com/woss/3c2296d9e67e9b91292d */

// call this to restore 'onbeforeunload'
var windowReloadBind = function(message) {
  window.onbeforeunload = function(event) {
    if (message.length === 0) {
       message = '';
    };
  
    if (typeof event == 'undefined') {
       event = window.event;
    };
    if (event) {
       event.returnValue = message;
    };
    return message;
  }
};

// call this to prevent 'onbeforeunload' dialog
var windowReloadUnBind = function() {
    window.onbeforeunload = function() {
      return null;
   };
};

var linkToFollow; // href to follow

$('form[method="post"]').dirtyForms();

$('a').on('click', function(e){
        e.preventDefault();
        windowReloadUnBind(); // prevent dialog
	$.blockUI({ message: $('#question'), css: { width: '275px' } });
        linkToFollow = $(this).attr('href');
});

$('#no').click(function() { 
        $.unblockUI();
        return false; 
});

$('#yes').click(function() { 
        $(window.location).attr('href', linkToFollow); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.dirtyforms/2.0.0/jquery.dirtyforms.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js"></script>

<p>Change the field content to activate DirtyForms, then click on the link.<br>
When the popup appears, click on "cancel" to stay on the page.<br>
Watch blockUI getting fired as the link is going to be followed</p>
<form action="#" method="post">
  <input type="text" name="username" required>
  <button type="submit">send</button>
</form>
<a href="https://google.com" class="link">click me after changing field content</a>
<div id="question" style="display:none; cursor: default"> 
    <h6>Would you like to contine?.</h6> 
    <input type="button" id="yes" value="Yes" /> 
    <input type="button" id="no" value="No" /> 
</div>


来自另一个答案的其他想法:其他想法是制作一个简单的 jQuery.ajax({})在返回值之前调用 beforeunload as seen in this answer

关于jquery-blockui - DirtyForms 不能与 $.blockUI 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50627110/

相关文章:

jquery - 如何防止 jQuery BlockUI 触发

jquery - BlockUI - 在 block 处于事件状态时更新消息

javascript - JQuery.Dirty Fields 不适用于第一个 `updateFormState`,但适用于第二个

javascript - 无法让自定义对话框与 DirtyForms 一起使用

javascript - 当我尝试将表单设置为干净时,脏表单给出错误

javascript - window.onbeforeunload 不会立即触发

iphone - 如何在 jQuery-BlockUI 中覆盖覆盖 css

php - jQuery BlockUI 脚本上的重复区域无法工作

javascript - 为什么我的 javascript/jquery 没有按顺序执行?