代码改变世界

AJAX 中需要 获取当前URL。发现 '&'符合之后的都不再读取。用JS实现

2011-06-01 16:18  沐海  阅读(9812)  评论(3编辑  收藏  举报
我遇到的问题:

   jQuery.ajax({
                url: utilUrl,
                type: 'POST',
                data: "operationType=" + 2 + "&Title=" + Title + "&Address=" + window.location.href,//HTTP的不能做参数传递
                dataType: 'json',
                timeout: 10000,
                error: function(data) { alert(data.result); },
                success: function(data) {
                    alert(data.result);
                    window.location.reload();
                }

            });

在这时。window.location.href  是非常完整的URL。包括&号之后的数据。
可是JQUERY AJAX过去。Address = Request["Address"].ToString();
后台就没有&之后的值了。?号之后的还有。
http://localhost:1965/lK/LK.aspx?id=183&category=5
http://localhost:1965/lK/LK.aspx?id=183
原因:
&不能做为URL(参数的一部分)传递。因为会被浏览器当作分割参数的标志。 下面括号里的写法。
http://localhost:1965/lK/LKDetail.aspx?id=(http://localhost:1965/lK/LK.aspx?id=183&category=5)&category=5
这种?后某个参数是URL(带有参数)的方式。会被.NET服务器直接认为请求时 无效  字符串异常。


解决思路:
1.替换字符串2.把参数单个传递,然后再后台接收拼接
自己写的
JS上:
  var str = window.location.href; //取得整个地址栏     
    var num = str.indexOf("?");//问号之前的位置
    
    var loaction=str.substr(0,num);//问号之前的URL
    str = str.substr(num + 1);//问号之后的URL
     var URLString=UrlSearch(str);//得到所有URL的参数,不包括URL
     

        var msg = "您是否要收藏" + Title + "!";
        if (confirm(msg, "添加收藏确认", function() {
            jQuery.ajax({
                url: utilUrl,
                type: 'POST',
                data: "operationType=" + 2 + "&Title=" + Title + "&Address=" + loaction+"¶meter="+URLString,
                dataType: 'json',
                timeout: 10000,
                error: function(data) { alert(data.result); },
                success: function(data) {
                    alert(data.result);
                    window.location.reload();
                }

            });
        }








function UrlSearch(str) {
var UrlString="";
    var name, value;  
    var num; 
    var arr = str.split("&"); //各个参数放到数组里     
    for (var i = 0; i < arr.length; i++) {
        num = arr[i].indexOf("=");
        if (num > 0) {
            name = arr[i].substring(0, num);
            value = arr[i].substr(num + 1);
           // this[name] = value;
           var tem= "("+name+":"+value+"),";
           UrlString+=tem;
           //拼接URL  成 "(name0=Id:value0=162),(name1=DetailTyle:value1=1),"的形式
           //更进一步 "(Id:162),(DetailTyle:1),"这种形式
          
        }
    }
    UrlString=UrlString.substr(0,UrlString.length-1);//去掉最后的一个逗号  "(Id:162),(DetailTyle:1)"
    return UrlString;
}
CS后台写法
 String AddressURL = Request["Address"].ToString()+"?";

               String Paramter = Request["parameter"].ToString();
               String[] temp = Paramter.Split(',');//按照逗号来切割
               //temp[0]="(Id:162)"
               for (int i = 0; i < temp.Length;i++ ) {
                  String temp1= temp[i].Substring(1, temp[i].Length - 2);//Id:162  因为从0开始的。所以长度减2
                 String [] temp2 =temp1.Split(':');
                 AddressURL += temp2[0] + "=" + temp2[1];
                 if ((i + 1) < temp.Length) { AddressURL += "&"; }
               }


               infomodel.Address = AddressURL;








以下是得到URL。并得到对应参数的方法。没怎么看懂。
————————————————————————————————————————————————————————————————————

那么就可以用这个方法取到指定参数:
 
function hooyesQueryString(queryStringName)
{
var returnValue="";
var URLString=new String(document.location);
var serachLocation=-1;
var queryStringLength=queryStringName.length;
do
{
serachLocation=URLString.indexOf(queryStringName+"\=");
if (serachLocation!=-1)
{
if ((URLString.charAt(serachLocation-1)=='?') || (URLString.charAt(serachLocation-1)=='&'))
{
URLString=URLString.substr(serachLocation);
break;
}
URLString=URLString.substr(serachLocation+queryStringLength+1);
}

}
while (serachLocation!=-1)
if (serachLocation!=-1)
{
var seperatorLocation=URLString.indexOf("&");
if (seperatorLocation==-1)
{
returnValue=URLString.substr(queryStringLength+1);
}
else
{
returnValue=URLString.substring(queryStringLength+1,seperatorLocation);
}
}
return returnValue;
}
然后:
hooyesQueryString("id")就取到id参数的值
另外写了一个

<script type="text/javascript">
function UrlSearch()
{
   var name,value;
   var str=location.href; //取得整个地址栏
   var num=str.indexOf("?")
   str=str.substr(num+1); //取得所有参数
   var arr=str.split("&"); //各个参数放到数组里
   for(var i=0;i < arr.length;i++){
    num=arr[i].indexOf("=");
    if(num>0){
     name=arr[i].substring(0,num);
     value=arr[i].substr(num+1);
     this[name]=value;
     }
    }
}
var Request=new UrlSearch(); //实例化
alert(Request.id);
</script>

<script language = javascript>
function request(paras){
var url = location.href; 
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&"); 
var paraObj = {} 
for (i=0; j=paraString[i]; i++){ 
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length); 

var returnValue = paraObj[paras.toLowerCase()]; 
if(typeof(returnValue)=="undefined"){ 
return ""; 
}else{ 
return returnValue;
}
}

var url = "http://127.0.0.1/e/action/ShowInfo.php?classid=9&id=2";//定义变量
function parse_url(_url){ //定义函数
 var pattern = /(\w+)=(\w+)/ig;//定义正则表达式
 var parames = {};//定义数组
 url.replace(pattern, function(a, b, c){
  parames[b] = c;
 });
 /*这是最关键的.当replace匹配到classid=9时.那么就用执行function(a,b,c);其中a的值为:classid=9,b的值为classid,c的值为9;(这是反向引用.因为在定义正则表达式的时候有两个子匹配.)
  然后将数组的key为classid的值赋为9;然后完成.
 再继续匹配到id=2;此时执行function(a,b,c);其中a的值为:id=2,b的值为id,c的值为2;然后将数组的key为id的值赋为2.
 */
 return parames;//返回这个数组.
}
var parames = parse_url(url);
alert(parames['classid'] + ", " + parames['id']);//最后打印.根据key值来打印数组对应的值
记录生活、工作、学习点滴!
E-Mail:mahaisong@hotmail.com 欢迎大家讨论。
沐海博客园,我有一颗,卓越的心!