前言

我们在开发项目中经常会遇到一种问题,就是在前端页面跳转时传递某些参数,通常我们是通过路由传递的,但是如果数据量很多的情况下,会造成路由非常的长,如果在大的话甚至会超出地址栏URL的最大限度,这就狗带了.最近手头上一个项目的前端刚好遇到这个问题,该项目前端用的是vue2.x.不是什么大问题,但是之前没有认真想过解决办法,于是将解决思路记录下来了.

地址栏URL最大限度

首先我查了不同浏览器地址栏URL的最大限度.

虽然HTTP协议的RFC规范并没有详细规定URL的最大字符长度限制,但实际上,在浏览器或者服务器中总会存在限制的。这里所说的字符是指ASCII字符。HTTP RFC2616协议没有规定URL的最大长度,规定服务器如果不能处理太长的URL,就得返回414状态码(Request-URI Too Long)。

微软 Internet Explorer:
微软帮助网站上说IE7之前(包括IE7)的浏览器,对URL的最大长度限制是2,083个字符。
Firefox:
对于Firefox1.5.x,地址栏能显示的URL最大长度是65,536个字符,但实际上有效的URL最大长度不少于100,000个字符。
对于Firefox 3.0.5,mozilla官方论坛上有人测试其URL长度限制为65,000个字符。
也有人说Firefox可以支持URL高达2Gbyte的长度(参考),在data URL中可以运用到这样大数据量的URL。dataURL是一种URL本身包含了实际数据的URL,比如一个图片、一个HTML网页或者全部的数据、代码等等。仅有Firefox支持dataURL。
Safari:
Safari最少支持80,000个字符长度的URL。
Opera:
Opera官方网站上说,Opera并没有强制限制URL的长度。
网友测试Opera 9支持最少190,000个字都长度的URL,并且Opera9的地址栏可以显示、编辑、复制和粘贴完整的URL串。

综上,又在网上找了一个附表:

IE

URL最大限制是2083个字节,Path长度最大是2048字节(Get请求)。

Firefox

65536

Safari

80000以上

Opera

190000字节以上

Chrome

8182字节

Apache Server

8192字节

IIS

16384字节

Perl HTTP::Daemon

至少8000字节

我的思路

思路一

我的第一个想法就是通过缓存进行解决----cookie/localStorage/sessionStorage.通过在服务器或客户端进行数据缓存以供页面进行读取.但是在后续的思考中我想到首先cookie缓存量很小,同时session/cookie对与网站所有页面是透明的,我只是想实现指定页面间进行参数传递,其他页面应该不知情,考虑到保密性,我放弃了这个想法.

思路二

我的第二个思路还是通过缓存来实现,但是是通过application cache(共享本地缓存),具体的介绍就不在这里说了.但是我考虑到application cache具有缓存时间,而我想要的是在页面跳转后缓存的参数数据被销毁,也就是类似闪存的机制.同时application cache缓存页面需要的资源,那么其他页面所需要的资源也同时被缓存下来,这样做得不偿失.

思路三

通过js的全局变量.这个没什么介绍的,将参数保存在全局变量中,那么在页面声明周期内所有页面都可以使用.但是还是那个问题,在使用全局变量的时候,其他页面也能够获得.所以pass.

思路四

我找到利用原生很不错的方法,那就是通过模态窗口来实现页面间的参数传递.以下是对showModalDialog(模态窗口)的简单介绍:

基本介绍:

          showModalDialog()         (IE 4+ 支持)showModelessDialog()      (IE 5+ 支持)window.showModalDialog()                  方法用来创建一个显示HTML内容的模态对话框。window.showModelessDialog()             方法用来创建一个显示HTML内容的非模态对话框。

使用方法:

          vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])

参数说明:

         sURL          --  必选参数,类型:字符串。用来指定对话框要显示的文档的URL。vArguments    -- 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过 window.dialogArguments来取得传递进来的参数。sFeatures     -- 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。

sFeatures的参数选择:

1.    dialogHeight:    对话框高度,不小于100px
2.    dialogWidth:    对话框宽度。
3.    dialogLeft:     离屏幕左的距离。
4.    dialogTop:     离屏幕上的距离。
5.    center:          { yes | no | 1 | 0 } :              是否居中,默认yes,但仍可以指定高度和宽度。
6.    help:             {yes | no | 1 | 0 }:                是否显示帮助按钮,默认yes。
7.    resizable:       {yes | no | 1 | 0 } [IE5+]:     是否可被改变大小。默认no。
8.    status:          {yes | no | 1 | 0 } [IE5+]:      是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.    scroll:            { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。...

使用showModalDialog进行参数传递:

通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,如下:

test.html:var obj=new Object();
obj.name="qiubinchao";
obj.tel="12345678";
window.showModalDialog('./testb.html',obj,"dialogWidth:500px;dialogHeight:550px");
window.location.href="./testb.html";
testb.html:var obj = window.dialogArguments
console.log(window.dialogArguments);

一个问题:在chrome37后,showModalDialog被chrome禁了,这就很尴尬了,但是有解决的办法:

test.html:<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><script>show();function AddNew() {if(!window.showModalDialog) {window.showModalDialog=function(url,name,option){if(window.hasOpenWindow){window.newWindow.focus();}var re = new RegExp(";", "g");  var option  = option.replace(re, '","'); //把option转为json字符串var re2 = new RegExp(":", "g");option = '{"'+option.replace(re2, '":"')+'"}';option = JSON.parse(option);var openOption = 'width='+parseInt(option.dialogWidth)+',height='+parseInt(option.dialogHeight)+',left='+(window.screen.width-parseInt(option.dialogWidth))/2+',top='+(window.screen.height-30-parseInt(option.dialogHeight))/2;window.hasOpenWindow = true;window.newWindow = window.open(url,name,openOption);}}}function show() {var obj=new Object();obj.name="qiubinchao";obj.tel="12345678"; AddNew();window.showModalDialog('./testb.html',obj,"dialogWidth:500px;dialogHeight:550px"); window.location.href="./testb.html"; }</script>
</body>
</html>

一些其他问题:

  • 怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?

在被打开的网页里加上:

<base target="_self">

就可以了。这句话一般是放在<head>之间的。

  • 怎样才刷新showModalDialog和showModelessDialog里的内容?

在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:

<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload...</a>

将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合<base target="_self">使用,不然你按下F5会弹出新窗口的。

  • 如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。
<input type="button" value="关闭" onclick="window.close()">

也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。

  • Math.random与showModalDialog。

当你设置的弹出网页固定时(如上面的"modal.htm"页面),ie很可能到临时文件区,下载上次产生的该页面(openPage.html),而没有重新加载,对于动态加载的页面来说,这样往往产生误会,如没有及时更新数据,也就更不利于开发者测试。所以,你可以采用如下方式:

var strPage = “/medal.htm?random="+Math.random();

这样每次产生的strPage是不一样的.

但是最后我还是放弃了,因为首先我用的是vue框架,写原生太不优雅;其次如上所示,使用模态窗口的局限性太大.

思路五

俗话说:解铃还须系铃人

在一筹莫展之际,我想到了vue-router中的params.上代码:

传参:
this.$router.push({name:'/send/sendHome', params: {setStr: this.multipleSelection}});接收参数:
let setArray = this.$route.params.setStr;

vue-router中无论是params/query(路由对象属性)都支持参数传递,但是我的毛病又犯了,这两个有什么区别呢?

query传递参数:

传参:
this.$router.push({path:'/xxx'query:{id:id}})接收参数:
this.$route.query.id

注意:无论是params还是query进行参数传递,传参是this.$router,接收参数是this.$route,一定要细心.

区别:

1.当使用query进行参数传递时,参数会跟在路径后面.我们可以在地址栏看到后面跟的参数,而params不会在地址栏显示.直白的说query相当于get请求,而params相当于post请求.

2.params传参,push里面只能是 name:'xxxx',不能是path:'/xxx',因为params只能用name来引入路由,如果这里写成了path,接收参数页面会是undefined.

果然...自己挖的坑还要自己填...

页面间大量数据参数传递相关推荐

  1. StoryBoard学习(5):使用segue页面间传递数据

    StoryBoard学习(5):使用segue页面间传递数据 函数: C代码   - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:( ...

  2. 浅谈ASP中Web页面间的数据传递

    [简 介] 基于Web的动态网页设计必会涉及到页面间的数据传递,文章探讨了ASP设计中常用的Web页面间的数据传递方式,分析各种数据传递方式的使用方法.使用场合及优缺点,其都是设计阶段选择数据传递方式 ...

  3. 使用Cross-Page Postback(跨页面提交)在页面间传递数据

    页面间传递数据的几种方法 在页面间传递数据时,我们有以下几种选择: 1.Query String 一个很常见的方法,Query String是URL中问号之后的那一部分.其优点在于它是轻量级的,不会给 ...

  4. 如何在微信小程序的页面间传递数据?

    知晓程序注: 我们在之前发布过小程序页面传值方法的 ,说明了在小程序开发中,两种常见的页面之间传值方法. 本期,「知晓程序」为你带来的是「倒数记日」小程序开发者带来的,小程序开发中,有关页面间数据传递 ...

  5. Windows Phone 几种页面间传递数据的方式

    首先,我们要引用:using Microsoft.Phone.Shell; 第一种: // 导航到新页面 NavigationService.Navigate(new Uri("/Detai ...

  6. react-native页面间传递数据的几种方式

    1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景: - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面. ...

  7. 微信小程序父子页面间得数据传递(对象或者数组)

    1.页面跳转时向子页面传入数据 父页面js goexit() { //跳转方法var data = JSON.stringify(this.data.data.follow) // this.data ...

  8. 小程序:自定义组件的实现方法及自定义组件与页面间的数据传递

    首先我们在pages文件夹下创建components目录用于存放自定义组件.如图所示,以我创建的dialog组件为例,自定义组件的格式与页面一样,分为4个文件.   图1                ...

  9. 微信小程序页面间的数据传递和数据共享

    方法一:利用url 如下代码所示,首先在.wxml文件中找到更多按钮并绑定相应方法,接着通过data-name指定所传参数的名字,如图所传参数名为:category. <view class=& ...

最新文章

  1. 077_html5拖放
  2. 计算机网络系统集成策略实现摘要,计算机网络集成策略实现探析
  3. 请问如何把.net framework框架集成在安装程序里头?
  4. Redis数据结构详解之Set(三)
  5. linux命令行设置编码,编码样式-Linux命令行开关和参数是否有标准?
  6. 【渝粤教育】电大中专计算机常用工具软件 (2)作业 题库
  7. python image模块需要安装吗_python Image模块安装
  8. Spring Boot中扩展XML请求和响应的支持
  9. 【hiho】127 后缀自动机一·基本概念 【后缀自动机】
  10. 土壤类型、土壤质地、土壤养分空间分布
  11. 计算机无法读光盘,win10系统无法读取光盘如何解决 win10系统读取光盘失败的解决方法...
  12. 汇编/源操作数/目的操作数
  13. SpringMVC复习——B站
  14. Oracle报错:不是单组分组函数
  15. C#字符串操作,转自韩迎龙博客
  16. === 和 == 的区别
  17. 数据结构1800试题(第四章)
  18. 表单验证 trigger
  19. python:pyecharts地图功能,并解决显示不全或只显示南海诸岛问题解决
  20. nacos简易实现负载均衡

热门文章

  1. WebLogic中间件安装与介绍(详细版约2万字)
  2. 润和软件为OpenHarmony落地智慧城市构建高效可靠软件基座
  3. matlab——corrcoef函数的使用
  4. 基于遗传算法的电动汽车有序充放电优化问题
  5. 实习篇四-----答辩(月末)
  6. 计算机控制技术注册二建,中央空调系统运行培训
  7. 阿里云PHP-SMS短信服务——验证码发送教程
  8. 基于JSP的煤炭销售系统,源码下载
  9. 解放拖动屏幕的双手——用xrandr配置多屏显示
  10. 一文读懂如何用python调用matlab函数(windows环境)