如何在网页中POST任意内容并跳转

396 阅读6分钟
原文链接: segmentfault.com

首页问答专栏 讲堂 更多

SegmentFault

搜索 热门标签 全部 javascriptphppython javamysqlios androidnode.js html5 linuxc++css3 git golang ruby vimdockermongodb

在 SegmentFault,学习技能、解决问题

每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

免费注册 立即登录

如何在网页中POST任意内容并跳转

comzyh 2014年04月17日提问 · 2014年04月18日更新
  • 关注 18 关注
  • 收藏 15 收藏,74.3k 浏览
问题对人有帮助,内容完整,我也想知道答案 0 问题没有实际价值,缺少关键内容,没有改进余地

之前是用jQuery的post()方法实现向服务器POST数据.
现在新需求需要呈现服务器返回的HTML页面.这个呈现是类似于普通form提交后跳转的过程.

解释:

使用表单进行POST的方法

<form method="post" action="/B">
<input type="hidden"  name="foo" value="bar">
<button type='submit'>
</form>

点击Submit 就可以向"/B"POST数据并跳转到B页面

Ajax方法

$.post("/B",{"foo":"bar"})

这种方法能够POST自定义数据但是不能够跳转到B页面

现在的需求:

用JavaScript 控制POST的数据内容并跳转到B页面,类似ExtJS的standardSubmit功能

需求决定我们不能在页面上使用form来提交数据.因为提交的数据是页面上几个Div的全部HTML内容(实际上是富文本编辑器).使用jQuery的.html()方法取得这些HTML内容.

现在想到的思路是使用jQuery 在内存中建立一个form对象,然后调用这个对象的submit方法

form = $("

<form method='post' action='foo'></form>

")
str = $("#bar").html()
input = $("<input type='text'>").val(str).attr('name','bar')
form.append(input)

//....继续添加字段

form.submit()

上面这种方法虽然能用,但是感觉很丑,有没有更好的方法?

提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 默认排序 时间排序

9个回答

答案对人有帮助,有参考价值 3 答案没帮助,是错误的答案,答非所问
$.extend({
    StandardPost:function(url,args){
        var form = $("<form method='post'></form>"),
            input;
        form.attr({"action":url});
        $.each(args,function(key,value){
            input = $("<input type='hidden'>");
            input.attr({"name":key});
            input.val(value);
            form.append(input);
        });
        form.submit();
    }
});

这段代码有兼容性问题,在IE低版本和火狐下不通过,需要在submit前将form.appendTo(document.body),否则无法提交且不会报错,submit后应该从body中remove此结点。另建议给form加上display:none防止影响展现,最终代码如下:

$.extend({
    StandardPost:function(url,args){
        var body = $(document.body),
            form = $("<form method='post'></form>"),
            input;
        form.attr({"action":url});
        $.each(args,function(key,value){
            input = $("<input type='hidden'>");
            input.attr({"name":key});
            input.val(value);
            form.append(input);
        });

        form.appendTo(document.body);
        form.submit();
        document.body.removeChild(form[0]);
    }
});
kpaxqin1.9k 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 2 答案没帮助,是错误的答案,答非所问

扩展:

$.extend({
    StandardPost:function(url,args){
        var form = $("<form method='post'></form>"),
            input;
        form.attr({"action":url});
        $.each(args,function(key,value){
            input = $("<input type='hidden'>");
            input.attr({"name":key});
            input.val(value);
            form.append(input);
        });
        form.submit();
    }
});

调用:

$.StandardPost('url/path/req',{arg0:'arg0',arg1:'arg1'});
爷爷泡的茶29 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

.....你们确定看过jQuery.post的手册了么

$.post(url, {bar: $('#bar').html(), any: $('#any').html()}, function(response) {});

第二个参数就是发送的数据啊,可以直接用对象发送的好么....

公子34.6k 声望 1

post 方法不能够跳转到目标页面啊。

comzyh · 2014年04月18日

1 回复 comzyh

简直不能更丑… 你可以考虑在页面上加一个form,所有input[type="hidden"],然后赋值提交……

公子 · 2014年04月18日

展开评论 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

问题描述的比较模糊(改了一遍之后仍然模糊)。模糊中给给解决方案,看一下行不行。

在 A 页面,向 B 页面发起 POST 请求,收到服务器返回的 data,带着 data 跳转到 B 页面,在 B 页面呈现 data?

  1. 拿到 A 页面要提交的数据,用 base64 编码。
  2. 向 B 页面发起 POST 请求,把 base64 编码后的数据传过去。
  3. 服务端返回数据为 data,data 必须是 base64 编码后的。
  4. 带着 data 跳转到 B 页面,URL 传参。
  5. B 页面的 javascript 通过 URL 取值,base64 解码,呈现。

既然是做真正的跳转,那肯定要把数据带过去,要不然是没法呈现服务器返回的数据的。至于怎么发请求,具体用哪个格式( blob 还是 base64),你再自己选择试试。

希望有用。

shajiquan1.9k 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

不太明白。。

var parm = $("#BiddingRoomForm").serialize();
$.post(url, parm, function (response) {
//code
});
臭_小子552 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

找了两天解决方法,自问自答.

方案一

基本就是题目描述中的方式,定义一个函数,这样就是丑了点,但是完全符合需求.

function StandardPost (url,args) 
    {
        var form = $("<form method='post'></form>");
        form.attr({"action":url});
        for (arg in args)
        {
            var input = $("<input type='hidden'>");
            input.attr({"name":arg});
            input.val(args[arg]);
            form.append(input);
        }
        form.submit();
    }

方案二

方案二会获取服务器返回并呈现.但是在有很多缺陷,比如在Chrome会被认为是弹出窗口而拦截,而且不能控制目标的window.location

function post_and_open(url,args)
    {
        $.post(url,args,function(response){
            var obj = window.open("about:blank","_blank");  
            obj.document.write(response); 
        })
    }
comzyh69 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问
yourform.on("submit",function(e){
    //change or validate the form here
    return true // to submit
    //return false // to prevent submit
}
oyanglulu726 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

不太明白,callback里面用Js跳过去不可以么?

rosen720 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

想说楼上的做法有点儿绕弯子了,直接通过超链接带参数的方式跳转好了,这两天我也是在做这么一个功能,类似于从博客园跳转的CSDN上面去,同时还要登陆上去,那么就需要把登陆所需的参数传递到后台的登陆视图里去,之前我也是想怎么用,Ajax或者jsonp神马的都好复杂,最后直接通过url带参跳转的方式过去的,因为form表单提交其实就是Ajax的原理。而凡是通过post之类传参数,后台直接request的就能获取,那么用url带参数也是一样的方式。

KallimaInach2 声望 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知

撰写答案

同步到新浪微博 [舍弃] 提交回答

讲堂推荐 更多

相似问题

过年学区块链 ×Close

分享

分享到微博?

取消 分享 ×Close

关闭问题(请谨慎操作)

删除问题(请谨慎操作)

删除回答(请谨慎操作)

忽略回答

关闭理由: 删除理由: 忽略理由:

推广(招聘、广告、SEO 等)方面的内容 与已有问题重复(请编辑该提问指向已有相同问题) 答非所问,不符合答题要求 宜作评论而非答案 带有人身攻击、辱骂、仇恨等违反条款的内容 无法获得确切结果的问题 非开发直接相关的问题 非技术提问的讨论型问题 其他原因(请补充说明)

补充说明:

取消 提交 × Close

我要该,理由是:

    返回重选 取消 提交

    在 SegmentFault,学习技能、解决问题

    每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

    免费注册 立即登录
    产品
    热门问答
    热门专栏
    热门讲堂
    最新活动
    技术圈
    找工作
    移动客户端
    资源
    每周精选
    用户排行榜
    徽章
    帮助中心
    声望与权限
    社区服务中心
    开发手册
    商务
    人才服务
    企业培训
    活动策划
    广告投放
    区块链解决方案
    合作联系
    关于
    关于我们
    加入我们
    联系我们
    关注
    产品技术日志
    社区运营日志
    市场运营日志
    团队日志
    社区访谈
    条款
    服务条款
    内容许可

    扫一扫下载 App

    Copyright © 2011-2018 SegmentFault. 当前呈现版本 17.06.16
    浙ICP备 15005796号-2   浙公网安备 33010602002000号 杭州堆栈科技有限公司版权所有

    CDN 存储服务由 又拍云 赞助提供

    移动版 桌面版

    回顶部

    记笔记

    标题 纯文本 Markdown Javascript CSS HTML PHP Python Ruby Go C/C++ Java Shell/Bash 空格缩进 Tabs 缩进 2 4 自动换行 不换行
    xxxxxxxxxx
    已保存 [舍弃] 保存私密笔记 保存公开笔记