2014-02-26 26 views
2

我创建使用JavaScript形式像为什么我需要追加的形式身体

//Create a form 
var form = document.createElement('FORM'); 
form.name = 'myForm'; 
form.method = 'POST'; 
form.action = 'SomePath'; 
//Create a hidden filed 
var hidden = document.createElement('INPUT'); 
hidden.type = 'HIDDEN'; 
hidden.name = 'MyHiddenField'; 
hidden.value = 'MyHiddenFieldValue'; 
form.appendChild(hidden); 
//Submit form 
form.submit(); 

当脚本执行。所有的语句执行没有任何错误。但表格实际上没有提交。

但是,当我追加它的文件。像

document.getElementsByTagName('body')[0].appendChild(form); 

//Submit form 
form.submit(); 

一切工作正常。我的问题是为什么我需要将表单追加到主体?我错过了什么。

编辑:它没有追加表格body

+1

我想,因为那会被添加到DOM,否则你只能创建新的元素,但不能将它们附加到DOM。你也可以使用document.body.appendChild(form); –

+0

有人[这里](http://www.bennadel.com/blog/1204-you-cannot-submit-non-rendered-forms.htm)在2008年有同样的问题... – user3526

回答

5

不知道肯定,我会推测,DOM和Javascript的创建者看到form是一个固有的依赖于文档的实体,并没有考虑到能够提交未附加到DOM。

无论如何,如果你只是不想看到它,那么你附上表格前,做

form.style.visibility = 'hidden'; 
+0

感谢您的回答,但它的工作完美。你对此有何看法? – Satpal

+0

我想我的看法是,它真的取决于浏览器如何实现(很有可能)非规范/未在规范中预期的事情:处理未附加到文档的表单上的提交。 Chrome的实现可以与此协作,其他人则不会。 – Faust

4

提交什么方法做,完全取决于被包含在DOM:

标准使用HTML表单需要加载发送数据的页面,这意味着整个页面都会刷新。

它实际上需要在页面加载中发送DOM。

在Ajax出现的时候,我们使用隐藏的iframe发送表单,而实际页面没有被刷新。

但是,如果你想使用表单元素,创建一个Http调用而不刷新页面,你需要通过JavaScript来完成。

这是最好的参考在那里,这将有助于你决定如何你想使用什么HTML表单标签做的一个:

Sending forms through JavaScript

相关问题