获取错误 "Form submission canceled because the form is not connected"
Getting Error "Form submission canceled because the form is not connected"
我有一个 JQuery 1.7 的旧网站,直到两天前它都可以正常工作。突然我的一些按钮不再起作用,点击它们后,我在控制台中收到这个警告:
Form submission canceled because the form is not connected
点击背后的代码是这样的:
this.handleExcelExporter = function(href, cols) {
var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
$('input[name="layout"]', form).val(JSON.stringify(cols));
$('input[type="submit"]', form).click();
}
Chrome56好像不支持这种代码了。不是吗?如果是,我的问题是:
- 怎么突然就这样了?没有任何弃用警告?
- 此代码的解决方法是什么?
- 有没有办法在不更改任何代码的情况下强制 chrome(或其他浏览器)像以前一样工作?
P.S.
它在最新的 firefox 版本中也不起作用(没有任何消息)。它也不适用于 IE 11.0 和 Edge! (都没有任何消息)
您必须确保表格在文档中。您可以将表格附加到正文中。
快速回答:将表格附加到正文。
document.body.appendChild(form);
或者,如果您像上面那样使用 jQuery:$(document.body).append(form);
详情:
根据 HTML 标准,如果表单没有关联到浏览上下文(文档),表单提交将被中止。
HTML SPEC 见 4.10.21.3.2
在 Chrome 56 中,应用了此规范。
Chrome code diff 参见@@ -347,9 +347,16 @@
P.S 关于您的问题 #1。在我看来,与 ajax 不同的是,表单提交会导致即时页面移动。
所以,显示 'deprecated warning message' 几乎是不可能的。
我也认为这个严重的变化没有包含在功能变化列表中是不可接受的。 Chrome 56 个特征 - www.chromestatus.com/features#milestone%3D56
根据 KyungHun Jeon 的回答,但 appendChild 需要一个 dom 节点,因此将 jquery 对象的索引添加到 return 节点:
document.body.appendChild(form[0])
我看到您正在使用 jQuery 进行表单初始化。
当我尝试@KyungHun Jeon 的回答时,它对我也不起作用 jQuery。
因此,我尝试使用 jQuery 方式将表单附加到正文中:
$(document.body).append(form);
成功了!
我使用 angular 看到了这条消息,所以我只是把 method="post" 和 action="" 去掉了,警告就消失了。
我在我们的一个实施中遇到了同样的问题。
我们使用的是 jquery.forms.js。这是一个表单插件,可在此处获得。 http://malsup.com/jquery/form/
我们使用上面提供的相同答案并粘贴
$(document.body).append(form);
它 worked.Thanks.
或者包括
event.preventDefault();
在你的
handleSubmit(事件){
如果您在尝试按回车键提交表单时在 React JS 中看到此错误,请确保表单中所有未提交表单的按钮都有 type="button"
。
如果您只有一个 button
type="submit"
按 Enter 将按预期提交表单。
参考文献:
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/
https://github.com/facebook/react/issues/2093
您也可以通过在 jquery-x.x.x.js 中应用单个补丁来解决它,只需在“try { rp; } catch (m) {}”行 1833 之后添加此代码:
if (r instanceof HTMLFormElement &&! r.parentNode) {
r.style.display = "none"; document.body.append (r);
r [p] ();
}
当表单不是正文的一部分并添加它时,这将进行验证。
如果您在 React 中看到这一点,需要注意的是 <form>
在提交时仍必须在 DOM 中呈现。即,这将失败
{ this.state.submitting ?
<div>Form is being submitted</div> :
<form onSubmit={()=>this.setState({submitting: true}) ...>
<button ...>
</form>
}
因此,当提交表单时,state.submitting
被设置并且呈现 "submitting..." 消息而不是表单,然后会发生此错误。
将表单标签移到条件之外确保它在需要时始终存在,即
<form onSubmit={...} ...>
{ this.state.submitting ?
<div>Form is being submitted</div> :
<button ...>
}
</form>
为后代添加,因为这与 chrome 无关,但这是搜索此表单提交错误时出现在 google 上的第一个线程。
在我们的案例中,我们附加了一个函数,用于在提交时用 "loading" 动画替换当前的 div html - 因为它发生在表单提交之前,所以不再有任何动画要提交的表格或数据。
回想起来这是一个非常明显的错误,但万一有人在这里结束,它可能会在将来为他们节省一些时间。
将属性 type="button" 添加到点击者按钮上,您会看到错误,它对我有用。
我在 react.js 中收到了这个错误。如果你在表单中有一个按钮,你想像一个按钮而不提交表单,你必须给它type="button"。否则它会尝试提交表单。我相信 vaskort 通过一些您可以查看的文档回答了这个问题。
我能够通过在 vue 中将属性 type="button" 添加到按钮元素来摆脱消息。
我注意到我遇到了这个错误,因为我的 HTML 代码没有 <body>
标签。
没有 <body>
,当 document.body.appendChild(form);
语句没有要追加的正文对象时。
<button type="button">my button</button>
我们必须在我们的按钮元素中添加上面的属性
我在我的 React 项目中发现了这个问题。
问题是,
- 我已经设置了按钮类型'submit'
- 我已经在按钮上设置了一个 onClick 处理程序
所以,当点击按钮时,onclick 函数被触发并且表单没有提交,并且控制台正在打印 -
Form submission canceled because the form is not connected
简单的修复是:
- 在表单上使用 onSubmit 处理程序
- 从按钮本身移除 onClick 处理程序,保留类型 'Submit'
Mike Ruhlin 的回答示例,我在提交表单时使用 react-router-dom
Redirect
重定向。
将 e.preventDefault() 放入我的提交函数中为我移除了警告
const Form = () => {
const [submitted, setSubmitted] = useState(false);
const submit = e => {
e.preventDefault();
setSubmitted(true);
}
if (submitted) {
return <Redirect push to={links.redirectUrl} />
};
return (
<form onSubmit={e => submit(e)}>
...
</form>
);
};
export default Form;
我有一个 JQuery 1.7 的旧网站,直到两天前它都可以正常工作。突然我的一些按钮不再起作用,点击它们后,我在控制台中收到这个警告:
Form submission canceled because the form is not connected
点击背后的代码是这样的:
this.handleExcelExporter = function(href, cols) {
var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
$('input[name="layout"]', form).val(JSON.stringify(cols));
$('input[type="submit"]', form).click();
}
Chrome56好像不支持这种代码了。不是吗?如果是,我的问题是:
- 怎么突然就这样了?没有任何弃用警告?
- 此代码的解决方法是什么?
- 有没有办法在不更改任何代码的情况下强制 chrome(或其他浏览器)像以前一样工作?
P.S. 它在最新的 firefox 版本中也不起作用(没有任何消息)。它也不适用于 IE 11.0 和 Edge! (都没有任何消息)
您必须确保表格在文档中。您可以将表格附加到正文中。
快速回答:将表格附加到正文。
document.body.appendChild(form);
或者,如果您像上面那样使用 jQuery:$(document.body).append(form);
详情: 根据 HTML 标准,如果表单没有关联到浏览上下文(文档),表单提交将被中止。
HTML SPEC 见 4.10.21.3.2
在 Chrome 56 中,应用了此规范。
Chrome code diff 参见@@ -347,9 +347,16 @@
P.S 关于您的问题 #1。在我看来,与 ajax 不同的是,表单提交会导致即时页面移动。
所以,显示 'deprecated warning message' 几乎是不可能的。
我也认为这个严重的变化没有包含在功能变化列表中是不可接受的。 Chrome 56 个特征 - www.chromestatus.com/features#milestone%3D56
根据 KyungHun Jeon 的回答,但 appendChild 需要一个 dom 节点,因此将 jquery 对象的索引添加到 return 节点:
document.body.appendChild(form[0])
我看到您正在使用 jQuery 进行表单初始化。
当我尝试@KyungHun Jeon 的回答时,它对我也不起作用 jQuery。
因此,我尝试使用 jQuery 方式将表单附加到正文中:
$(document.body).append(form);
成功了!
我使用 angular 看到了这条消息,所以我只是把 method="post" 和 action="" 去掉了,警告就消失了。
我在我们的一个实施中遇到了同样的问题。
我们使用的是 jquery.forms.js。这是一个表单插件,可在此处获得。 http://malsup.com/jquery/form/
我们使用上面提供的相同答案并粘贴
$(document.body).append(form);
它 worked.Thanks.
或者包括 event.preventDefault(); 在你的 handleSubmit(事件){
如果您在尝试按回车键提交表单时在 React JS 中看到此错误,请确保表单中所有未提交表单的按钮都有 type="button"
。
如果您只有一个 button
type="submit"
按 Enter 将按预期提交表单。
参考文献:
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/
https://github.com/facebook/react/issues/2093
您也可以通过在 jquery-x.x.x.js 中应用单个补丁来解决它,只需在“try { rp; } catch (m) {}”行 1833 之后添加此代码:
if (r instanceof HTMLFormElement &&! r.parentNode) {
r.style.display = "none"; document.body.append (r);
r [p] ();
}
当表单不是正文的一部分并添加它时,这将进行验证。
如果您在 React 中看到这一点,需要注意的是 <form>
在提交时仍必须在 DOM 中呈现。即,这将失败
{ this.state.submitting ?
<div>Form is being submitted</div> :
<form onSubmit={()=>this.setState({submitting: true}) ...>
<button ...>
</form>
}
因此,当提交表单时,state.submitting
被设置并且呈现 "submitting..." 消息而不是表单,然后会发生此错误。
将表单标签移到条件之外确保它在需要时始终存在,即
<form onSubmit={...} ...>
{ this.state.submitting ?
<div>Form is being submitted</div> :
<button ...>
}
</form>
为后代添加,因为这与 chrome 无关,但这是搜索此表单提交错误时出现在 google 上的第一个线程。
在我们的案例中,我们附加了一个函数,用于在提交时用 "loading" 动画替换当前的 div html - 因为它发生在表单提交之前,所以不再有任何动画要提交的表格或数据。
回想起来这是一个非常明显的错误,但万一有人在这里结束,它可能会在将来为他们节省一些时间。
将属性 type="button" 添加到点击者按钮上,您会看到错误,它对我有用。
我在 react.js 中收到了这个错误。如果你在表单中有一个按钮,你想像一个按钮而不提交表单,你必须给它type="button"。否则它会尝试提交表单。我相信 vaskort 通过一些您可以查看的文档回答了这个问题。
我能够通过在 vue 中将属性 type="button" 添加到按钮元素来摆脱消息。
我注意到我遇到了这个错误,因为我的 HTML 代码没有 <body>
标签。
没有 <body>
,当 document.body.appendChild(form);
语句没有要追加的正文对象时。
<button type="button">my button</button>
我们必须在我们的按钮元素中添加上面的属性
我在我的 React 项目中发现了这个问题。
问题是,
- 我已经设置了按钮类型'submit'
- 我已经在按钮上设置了一个 onClick 处理程序
所以,当点击按钮时,onclick 函数被触发并且表单没有提交,并且控制台正在打印 -
Form submission canceled because the form is not connected
简单的修复是:
- 在表单上使用 onSubmit 处理程序
- 从按钮本身移除 onClick 处理程序,保留类型 'Submit'
Mike Ruhlin 的回答示例,我在提交表单时使用 react-router-dom
Redirect
重定向。
将 e.preventDefault() 放入我的提交函数中为我移除了警告
const Form = () => {
const [submitted, setSubmitted] = useState(false);
const submit = e => {
e.preventDefault();
setSubmitted(true);
}
if (submitted) {
return <Redirect push to={links.redirectUrl} />
};
return (
<form onSubmit={e => submit(e)}>
...
</form>
);
};
export default Form;