window.open以post方式将内容提交到新窗口


Posted in Javascript onDecember 26, 2012

第一种方式
最近在做web项目,碰到需要跨页面传递参数的功能,就是那种需要把当前页面的内容带到新开的子窗体中,以前的做法是传一个id过去,然后在新窗口中去读数据库的内容。虽然不怎么麻烦,但是如果内容么有在数据库里保存,仅仅是处以拟稿状态时,就不能实现了,用户还常常认为是个bug。考虑采用get的方式传递,把需要的内容都序列化然后,通过url去传,显得很臃肿,而且get的传递内容长度有限制。于是就想到用post的方式传递,问题在于open方法不能设置请求方式,一般网页的post都是通过form来实现的。如果仅仅模拟form的提交方式,那么open方法里那种可设置窗体属性的参数又不能用。最后想办法整了这么一个两者结合的方式,将form的target设置成和open的name参数一样的值,通过浏览器自动识别实现了将内容post到新窗口中。

比较有意思的是直接通过调用form的submit方法不能触发onsubmit事件,查看了帮助文档,必须手动的触发,否则只能看到页面刷新而没有打开新窗口。代码中只传递了一个参数内容,实际可传递多个。
具体代码如下:

<script> 
function openPostWindow(url, data, name) 
{ 
var tempForm = document.createElement("form"); 
tempForm.id="tempForm1"; 
tempForm.method="post"; 
tempForm.action=url; 
tempForm.target=name; 
var hideInput = document.createElement("input"); 
hideInput.type="hidden"; 
hideInput.name= "content" 
hideInput.value= data; 
tempForm.appendChild(hideInput); 
tempForm.attachEvent("onsubmit",function(){ openWindow(name); }); 
document.body.appendChild(tempForm); 
tempForm.fireEvent("onsubmit"); 
tempForm.submit(); 
document.body.removeChild(tempForm); 
} 
function openWindow(name) 
{ 
window.open('about:blank',name,'height=400, width=400, top=0, left=0, toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=yes, status=yes'); 
} 
</script>

第二种方式
function openWindowWithPost(url,name,keys,values) 
{ 
var newWindow = window.open(url, name); 
if (!newWindow) 
return false; 
var html = ""; 
html += "<html><head></head><body><form id='formid' method='post' action='" + url + "'>"; 
if (keys && values) 
{ 
html += "<input type='hidden' name='" + keys + "' value='" + values + "'/>"; 
} 
html += "</form><script type='text/javascript'>document.getElementById('formid').submit();"; 
html += "<\/script></body></html>".toString().replace(/^.+?\*|\\(?=\/)|\*.+?$/gi, ""); 
newWindow.document.write(html); 
return newWindow; 
}

推荐使用第一种方式,第二种方式测试过程中发现,与日历弹出框冲突,如果子页面上有日历弹出框,则点日历框会不停刷新页面,不会弹出日历框。当然,也可能是我用的日历框的问题。
Javascript 相关文章推荐
javascript表单验证 - Parsley.js使用和配置
Jan 25 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
Jun 20 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
node.js读取文件到字符串的方法
Jun 29 Javascript
Javascript缓存API
Jun 14 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
jQuery Easyui 下拉树组件combotree
Dec 16 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
Mar 13 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
jQuery条件分页 代替离线查询(附代码)
Aug 17 jQuery
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 #Javascript
jQuery-serialize()输出序列化form表单值的方法
Dec 26 #Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
Dec 25 #Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
Dec 25 #Javascript
Javascript图像处理思路及实现代码
Dec 25 #Javascript
javascript的offset、client、scroll使用方法详解
Dec 25 #Javascript
JS解析json数据并将json字符串转化为数组的实现方法
Dec 25 #Javascript
You might like
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP中的替代语法简介
2014/08/22 PHP
PHP错误机制知识汇总
2016/03/24 PHP
浅谈PHP封装CURL
2019/03/06 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
Vue渲染过程浅析
2019/03/14 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python构建网页爬虫原理分析
2017/12/19 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python文件拆分与重组实例
2018/12/10 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python类super()及私有属性原理解析
2020/06/15 Python
英国综合网上购物商城:The Hut
2018/07/03 全球购物
大四自我鉴定范文
2013/10/06 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
公司董事长职责
2013/12/12 职场文书
拓展培训心得体会
2014/01/04 职场文书
市场部管理制度
2014/02/02 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
纪检监察建议书
2014/05/19 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
教师个人年度总结
2015/02/11 职场文书
python如何做代码性能分析
2021/04/26 Python
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python