在后台与前台的交互操作中,需要替换location当中的某个参数的值(而其它值不变)时,会用到以下函数:

说明:

win:传入的窗口句柄,如,window或window.parent等
forceAdding:当location当中的指定参数不存在时,是无法进行替换操作的,这时候,如果非要"替换"(即将参数名及其值附加上去),则可指定forceAdding为true(或非"零"性质的其它值),否则将不会执行替换操作.

 <script type='text/javascript'>
//替换指定传入参数的值
//win为某窗体,paramName为参数,paramValue为新值,forceAdding为不存在该参数时是否也指定
function replaceParamVal(win,paramName,paramValue,forceAdding){
var search = win.location.search+'';
if(!search) {//没有任何查询参数,则直接附加
return ( forceAdding ? (win.location+'?'+paramName+'='+paramValue) : (win.location+'') );
}else{
var q = (win.location+'').split('?')[0];
var list = search.replace('?','').split('&');
var hasIn = false;
for(var i=0; i<list.length; i++) {
var listI = list[i];
if(listI.split('=')[0].toLowerCase() == paramName.toLowerCase()) {//指定参数
q = q + (i==0 ? '?' : '&');
hasIn = true; if(listI.indexOf('=') == -1) {//形式:"参数"
q = q + listI + '=' + paramValue;
}
else if (! listI.split('=')[1].length) { //形式:"参数="
q = q + listI + paramValue;
}
else {//形式:"参数=值"
q = q + paramName + '=' + paramValue;
}
}else {//其它参数
q = q + (i==0 ? '?' : '&');
q = q + listI;
}
} if (!hasIn && forceAdding) {//不存在,但必须要添加时
q = q + '&' + paramName + '=' + paramValue;
} return q;
} }
</script>

调用示例:

window.parent.location = replaceParamVal(window.parent,'rnd',encodeURIComponent(Date()+''),true)

个人小记:编写本函数主要原因,是在FF当中,由页面A中包含有一个iframe,利用其src的更换变化(指向页面B) 执行更新操作,操作后利用iframe执行A窗口的reload,这时在FF会导致连续刷新(在IE/Chrome等不会有此现象),仿约代码如:

A.html

<input type='button' value='执行更新' onclick='javascript:save();'/>
<script>
function save() {
document.getElementById('F').src='B.html?'+Date();
}
</script>
<iframe id="F" src="" width="200" height="200" frameborder="0"></iframe>

B.html

<script>
window.parent.alert('更新了!');
window.parent.document.getElementById('F').src = ''; //在以为加上这句可以解决,事实是,不灵!
window.parent.location.reload();
</script>

所以,最后还是想到另外的reload方式,就是替换随机指定的参数,于是有了以上函数,此时的B页面的代码如:(已省略replaceParamVal函数)

B.html

<script>
window.parent.alert('更新了!');
window.parent.location = replaceParamVal(window.parent,'rnd',encodeURIComponent(Date()+''),true)
</script>

弱弱地扩展了下该函数,支持字符串或window类型参数第一个参数win的传入值,方便各种场合:

 <script type='text/javascript'>
//替换指定传入参数的值
//win为某窗体或查询字符串,paramName为参数,paramValue为新值,forceAdding为不存在该参数时是否也指定
function replaceParamVal(win,paramName,paramValue,forceAdding){
var search = (typeof win == 'object') ? (win.location.search+'') : (win={location:win},win.location); //改动for字符串的win
if(!search) {//没有任何查询参数,则直接附加
return ( forceAdding ? (win.location+'?'+paramName+'='+paramValue) : (win.location+'') );
}else{
var q = (win.location+'').split('?')[0];
var list = search.indexOf('?') == -1 ? [] : search.split('?')[1].split('&'); //改动for字符串的win
var hasIn = false;
var hasQ = false;//改动for字符串的win
for(var i=0; i<list.length; i++) {
var listI = list[i];
if(listI.split('=')[0].toLowerCase() == paramName.toLowerCase()) {//指定参数
q = q + (i==0 ? '?' : '&');
hasIn = true; if(listI.indexOf('=') == -1) {//形式:"参数"
q = q + listI + '=' + paramValue;
}
else if (! listI.split('=')[1].length) { //形式:"参数="
q = q + listI + paramValue;
}
else {//形式:"参数=值"
q = q + paramName + '=' + paramValue;
}
}else {//其它参数
q = q + (i==0 ? '?' : '&');
q = q + listI; if(listI.indexOf('=') == -1) {//形式:"参数" //改动for字符串的win
hasQ = true;//改动for字符串的win
}
}
} if (!hasIn && forceAdding) {//不存在,但必须要添加时
q = q + (q.indexOf('&') == -1 ? (hasQ ? '&' : '?') : '&') + paramName + '=' + paramValue; //改动for字符串的win
} return q;
} } //另外,可将该函数扩展到string去
String.prototype.reParam = function(paramName,paramValue,forceAdding) {
return replaceParamVal(this.toString(),paramName,paramValue,forceAdding);
}
</script> <script>
window.document.write('<br/>','a&b=2'.reParam('rnd',encodeURIComponent(Date()+''),true))
window.document.write('<br/>','?a=1&b=2'.reParam('rnd',encodeURIComponent(Date()+''),true))
window.document.write('<br/>','B.asp?a=1&b=2&rnd=xxxxxxx'.reParam('rnd',encodeURIComponent(Date()+''),true))
window.document.write('<br/>','http://localhost:8888/index.asp?a=1&b=2&rnd='.reParam('rnd',encodeURIComponent(Date()+''),true))
window.document.write('<br/>',window.location.toString().reParam('rnd',encodeURIComponent(Date()+''),true))
window.document.write('<br/>','file:///C:/Users/Administrator/Desktop/B.html?Wed%20Jul%2017%202013%2017:56:04%20GMT+0800'.reParam('rnd',encodeURIComponent(Date()+''),true))
</script>

替换 window.location当中的某个参数的值(而其它值不变)JS代码的更多相关文章

  1. Arison [JS]window.location获取url各项参数详解

    https://www.cnblogs.com/Arison/p/5286368.html 对于这样一个URL代码如下 复制代码 http://www.php230.com :80/fisker/po ...

  2. window.location获取url各项参数详解

    window.location方法后还还可以带href,search等参数,下面我们来看看获取url各项参数的办法. URL即:统一资源定位符 (Uniform Resource Locator, U ...

  3. [JS]window.location获取url各项参数详解

    window.location方法后还还可以带href,search等参数,下面我们来看看获取url各项参数的办法. URL即:统一资源定位符 (Uniform Resource Locator, U ...

  4. 关于window.location.href 传中文参数 乱码问题

    传中文查询乱码问题 则需要对要传的参数进行二次编码 例如  window.location.href ="/xx.jsp?name="+name+""; 这样子 ...

  5. window.location.href后携带参数

    JS文件中: window.location.href后可携带参数,但是不安全,虽然在技术上是可以实现的 1.传参:window.location.href = "RecordCare.as ...

  6. javaweb使用 window.location.href 传中文参数 乱码问题

    JS: var cn_name=  document.getElementById("cn_name"); window.location.href="${URL}?na ...

  7. Javascript Window Location

    window.location 对象在编写时可不使用 window 这个前缀. URL : 统一资源定位符 (Uniform Resource Locator) 说明: 完整的URL示例:scheme ...

  8. window.location.href问题,点击,跳转到首页

    onClick="window.location.href='./';" 点击,跳转到首页. location.href=url Js中实现跳转 window.location.h ...

  9. window.location获取URL中各部分

    博客分类: JAVASCRIPT JavaScriptASP.netSchemeASP网络协议  URL即:统一资源定位符 (Uniform Resource Locator, URL) 完整的URL ...

随机推荐

  1. 提交时提示错误This Bundle is invalid.New apps and app updates submitted to the App Store must be built wit

    this bundle is invalid . new apps and app updates submitted to the app store must be built with publ ...

  2. js中 ===与==

    js里面,==比较的是参数的值,不会比较参数的类型,===需要先比较参数的类型是否一致,然后才会去比较值比如,if(3 == "3")这个会返回true,if(3 === &quo ...

  3. javascript高级知识点——函数的长度

    代码信息来自于http://ejohn.org/apps/learn/. 函数的长度属性如何工作? function makeNinja(name){} function makeSamurai(na ...

  4. sql server 存储过程、事务,增删改

    CREATE procedure [dbo].[sp_TableSave] @TypeID tinyint, -- 0 新增,1 修改,2 删除 @ID int, ), ), ), @UID int, ...

  5. C# - ADO.Net 调用存储过程

    ------------------------存储过程调用,创建DataSet:----------------------//数据库连接字符串string connStr = @"Dat ...

  6. 20151204--JDBC

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. poj2121--暴力解法

    #include<iostream> #include<string> using namespace std; ]={"negative","z ...

  8. EC读书笔记系列之6:条款11 在operator=中处理自我赋值

    记住: ★确保当对象自我赋值时operator=有良好行为.有三种方法:比较“来源对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap技术 ★确定任何函数若操作一个以上对象, ...

  9. JSP基础——关于中文乱码问题

    乱码问题十分烦人,今天在写一个登陆的demo时,表单中需要提交的中文姓名,如下代码 <form action="success.jsp" name="success ...

  10. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...