页面间大量数据参数传递(代码片段)

lishanlei lishanlei     2023-01-07     152

关键词:

前言

我们在开发项目中经常会遇到一种问题,就是在前端页面跳转时传递某些参数,通常我们是通过路由传递的,但是如果数据量很多的情况下,会造成路由非常的长,如果在大的话甚至会超出地址栏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.

 

 

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











react7.组件间的通讯(代码片段)

...3.兄弟组件传递参数4.跨组件通讯组件之间经常需要共享数据,传递数据,互相调用方法等操作。这时就需要使用组件间通讯的技术。包括父子组件通讯,兄弟组件通讯。1.父组件向子组件传递参数这个很简单,分... 查看详情

前端的页面间进行值的传递(代码片段)

Cookie和locaStorage可以进行前端页面间值的传递Cookie浏览器端的缓存文件,缓存的大小受到浏览器的限制。locaStorage为也存储更大的容量数据。区别:Cookie可以和后端进行传值,localStorage不可以使用:(自定义封... 查看详情

topjui|easyuihtmldialog页面间get方式数据传递

较容易的方式通过URL内带参数进行数据传递  varurl="apddList.html?c0="+row.uuid+"&c1="+row.c0;//URL赋值  var$editDialog=$(‘<form></form>‘);  $editDialog.iDialog({id:‘ieManagerDg‘,title:‘【000】‘,width:dlgWidth 查看详情

原生与flutter页面跳转并传递数据(代码片段)

在App开发中,从一个页面跳转至另一个页面并附带一些参数供下一个页面使用是最为常见的了,那么,在原生与Flutter混合开发的情况下,页面互相跳转并附带参数传递怎么实现呢?Flutter跳转原生页面并传递数... 查看详情

vue路由传递参数详细说明(代码片段)

...数据报表、数据统计、实时数据的系统,这里面其实整个页面就是一个模板,最上面是filter、第二级是统计图、最下面是table数据。所以在数据分析子系统中,只要配置一个路由就可以匹配所有页面,在系统中,我把这个为公用... 查看详情

在网页之间传递大量数据

...ges【发布时间】:2017-12-0811:33:51【问题描述】:我有一个页面,用户在其中输入了(可能)数千个字符串的列表,然后进入使用该列表的页面。我尝试仅使用查询参数将字符串传递到后一页,但根据another***post的说法,这将超过... 查看详情

postmessage页面间消息传递(代码片段)

...out(()=>targetwindow.postMessage(JSON.stringify(message),\'/\'),1000);2.页面消息接收created()window.addEventListener(\'message\',this.onMessageChange),//监听变化onMessageChange(e)letdata=e.dataif(data)letinfo=tryinfo=JSON.parse(data)catch(error)info=dataif(info&&info.name==\'ifr... 查看详情

原生与flutter页面跳转并传递数据(代码片段)

在App开发中,从一个页面跳转至另一个页面并附带一些参数供下一个页面使用是最为常见的了,那么,在原生与Flutter混合开发的情况下,页面互相跳转并附带参数传递怎么实现呢?Flutter跳转原生页面并传递数... 查看详情

js实现把一个页面层数据传递到另一个页面(代码片段)

...存在错误,欢迎提出批评。本博客整理了两种方式从一个页面层向另一个页面层传递参数。一.通过cookie方式1.传递cookie页面的html,此处命名为a.html请输入用户名和密码:<inputid="userName"type="text"/><inputid="passwords"type="pas 查看详情

使用mpvue开发小程序教程(代码片段)

...考过怎么解决以下的问题:怎么存放可全局访问的变量?页面跳转的时候,怎么传递参数到下一个页面比较好?页面返回上一页的时候,怎么传递当前页的数据到上一页?多个页面间需要同步数据,怎么做比较好?网上一搜,解... 查看详情

react和vue组件间数据传递demo(代码片段)

一、React(一)父组件向子组件传数据简单的向下传递参数/*Parent*/classAppextendsComponentrender()return(&lt;divclassName="App"&gt;&lt;Childmsg="来自父元素的问候"/&gt;&lt;/div&gt;);/*Child*/classChildextendsComponentrender()return&... 查看详情

进程间数据传递:queue,pipe进程间数据共享:manager(代码片段)

1.使用multiprocessing模块的Queue实现数据传递‘‘‘进程间通讯:Queue,用法跟线程里的Queue一样,put,get线程queue没有做序列化,进程queue做序列化了父进程的queue怎么传给子进程的?父进程的queue克隆了一份到子进程按理说两个queue没... 查看详情

页面之间传递数据(代码片段)

...ata发送Ajax。整理一下搜寻到方法;方法一:通过location给页面传递数据;附上代码。<!DOCTYPEhtml><html><head><metacharset="utf-8"/><title>页面A</title></head><body><divstyle="width:100px;height:100px;background:#f00;"on... 查看详情

小程序页面之间数据传递的四种方法(代码片段)

近期再使用小程序开发的时候遇到小程序页面和页面之间的数据传递问题。总结一下大致有以下几种方式实现页面数据传递。最常见的就是路由传参,使用场景主要是页面汇总的少量数据的传递。以下都以Taro+vue示例,... 查看详情

vuex动态注册嵌套module提供模块内部组件间的数据共享(代码片段)

vuex提供了全局性的共享数据。如果数据限于模块内共享,可以采用嵌套module,通过命名空间进行访问。vue开发的主角是组件。组件在代码解耦、复用、提高可读性方面立下功劳,但组件间共享数据、传递参数却很麻... 查看详情

微信小程序页面跳转传递参数(实体,对象)(代码片段)

...转到详情界面,那么我就需要把item的实体数据从列表页面传递到详情页面。实现方法那么我们来看看微信小程序给我们提供的API:这里大家可以清楚看到api中说到的如何传递参数,其实它这里指的参数仅仅是一些普... 查看详情

微信小程序云开发(12)—“本地向云函数传递参数”(代码片段)

...通过入口函数的event参数接收本地传来的数据1.创建本地页面,在页面js文件中的onLoad函数中编写传参代码Page( onLoad() wx.cloud.callFunction( name:'add', //向云函数传递的参数 data: a:3, b:4 ) .then(res=> co 查看详情

jsp页面传值

JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数。下面介绍一下实现的方法。(1)直接在URL请求后添加如:<ahref="thexuan.jsp?action=transparams&detail=directe">直接传递参数</a>特别的在使用respo... 查看详情