【发布时间】:2019-02-12 19:39:48
【问题描述】:
我有一个脚本用于防止导航离开页面,因此更改不会意外丢失。不幸的是,如果通过提交表单激活脚本,这也会“破坏”页面。因此,在我按下提交按钮并决定留在页面上后,我无法再提交表单。
当导航是由提交按钮之外的其他项完成时,此不会禁用提交按钮。
有什么方法可以防止这种情况发生并允许我“意外”多次激活此脚本,同时仍然能够在弹出窗口后使用我的提交按钮?
<script>
window.onbeforeunload = function() {
var inputs = document.getElementsByTagName('input');
var unfinished = 'false';
for (var i = 0; i < inputs.length; ++i) {
if (inputs[i].value != '') {
unfinished = 'true';
}
}
if (unfinished == 'true') {
return 'Are you sure you want to leave?';
}
}
</script>
在退出阻止程序被激活之前(通过提交按钮):
<input type="submit" name="commit" value="Edit product" class="btn btn-warning btn-block" data-disable-with="Edit product">
退出拦截器激活后(通过提交按钮):
<input type="submit" name="commit" value="Edit product" class="btn btn-warning btn-block" data-disable-with="Edit product" disabled="">
如您所见,由于某种原因,它在我的网站上时添加了disabled=""。
表格:
<%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.input :title, class: "form-control center" %>
<%= f.input :pack_type, class: "form-control center" %>
<%= f.input :category_id, prompt: "Select Category", collection: [ "sample-pack", "vocal-pack", "preset-pack", "track-pixel", "track-indie", "track-orchestral"], input_html: { class: "form-control center" } %>
<%= f.input :price, class: "form-control center" %>
<%= f.input :audio_embed, class: "form-control center" %>
<%= f.input :video_embed, class: "form-control center" %>
<%= f.input :art_link, prompt: "ENTER N/A IF STRACK", class: "form-control center" %>
<%= f.input :download_url, class: "form-control center" %>
<%= f.submit "Edit product", class: "btn btn-warning btn-block" %>
<% end %>
<%= link_to "Cancel", packs_path, class: "btn btn-danger top-drop" %>
【问题讨论】:
-
尝试将
onsubmit添加到将window.onbeforeunload设置为null的表单中。编辑:等等,即使表单有效,脚本是否将unfinished设置为true?如果是这样,只需修复它(例如,通过为您的type="submit"输入分配一个值)。 -
要么执行@ChrisG 的建议,要么检查
onbeforeunload中的标志(布尔)变量并将其设置在onsubmit函数中。哦,从您的onsubmit函数返回 true ,否则它实际上不会提交。 -
请添加您的 HTML 并创建一个minimal reproducible example,以便我们重现/修复此问题。
-
再看这个,不应该是
if (inputs[i].value == '')吗?我猜一个空的输入应该将表单设置为未完成,而不是非空的?编辑:禁用按钮的代码在哪里? -
如果两个字段都填满,这是一个不会阻止表单提交的版本:jsfiddle.net/khrismuc/xu687Lfk 我不知道按钮是如何被禁用的,您需要找出执行此操作的代码。您发布的代码中没有任何内容。
标签: javascript ruby-on-rails twitter-bootstrap simple-form