zoukankan      html  css  js  c++  java
  • URL的JavaScript解决之道

    URL在大多数时候都是后端程序员关心的事情,但有的时候前端程序员也需要与之打交道,可能很多人都做过的一件事就是通过对 href 属性的写操作达到跳转页面的目的,不过这并不是今天要讨论的全部话题。对于 URL,我们需要了解更多,因为我们的开发中可能会需要提取URL的部分信息来做不同的事情,事实上这也是与后端交互的一种独特的方式,当然这肯定是安全 的,当请求被返回,关于 url 的信息就被记录在了 Window 对象的 Location 属性中,取值的结果并不随着用户手动修改地址栏中的字符而发生任何改变,这一点是很重要的。了解了这些内容,那么我们从下面这张图开始吧:

    location对象的各属性在url中对应的位置

    不要被那些色块迷惑了,图片中间那一行较长的字符串是一个完整的 URL,它包含了一个 URL 中可能包含的任何部分:协议、域名、端口号、路径、参数、描点。在 JavaScript 中,获取到这一行字符串的方法是访问 window.location.href,href属性包含了一个页面完整的 URL。如果想得到 URL 中某一部分的值,我们可以通过复杂、繁琐的正则表达式来解析这个完整的 URL,不过更方便的办法是通过 location 的其他属性来获取。比如 location 的 protocol 属性中记录了带冒号的协议名,pathname 属性存储着路径名,这些属性是 href 的分离,给开发者带来了很多方便。下面的表格中罗列了 location 下所有的属性,以及他们各自记录的值。如果不能理解表格中的内容,那么上面那张图中的色块和文字,形象地描述了各属性在 URL 中对应的位置。

    属性
    href 完整的 URL
    protocol 协议
    hostname 主机名
    host 主机名加端口号
    port 的端口号
    pathname 当前 URL 的路径部分
    search URL 的查询部分
    hash #开始的锚

    值得注意的是,上面的属性都是可写的,这表示我们可以通过 JavaScript 改变他们的值。这些属性大都一目了然非常简单,唯有 search 部分是比较麻烦的,search部分是以 GET 方式传给后台的参数,以 ? 开始,& 作为分隔符,= 赋值的序列化的字符串,如此一来通过 location.search 得到的值往往并不是想要得到的最终结果,通过 search 的结构来分析,我们可能更想要得到的结果是一个包含明确对应关系的关联数组。于是我们需要对 location.search 中得到的字符串进行进一步的处理。

    function getArgs() {
        var args = {};
        var query = location.search.substring(1);     // Get query string
        var pairs = query.split("&");                 // Break at ampersand
        for(var i = 0; i < pairs.length; i++) {
            var pos = pairs[i].indexOf('=');          // Look for "name=value"
            if (pos == -1) continue;                  // If not found, skip
            var argname = pairs[i].substring(0,pos);  // Extract the name
            var value = pairs[i].substring(pos+1);    // Extract the value
            value = decodeURIComponent(value);        // Decode it, if needed
            args[argname] = value;                    // Store as a property
        }
        return args;                                  // Return the object
    }
    

    上面的代码来自于《JavaScript 权威指南》一书中。getArgs 方法不接收参数,它主动提取 URL 中的 search 部分加以解析,并返回一个 JSON。例如我们最开始那张图片中的 URL ,使用 getArgs 方法将会得到下面的结果:

    var search = {
        "q" : "123",
        "a" : "321"
    }
    

    这样,关于 URL 的所有信息都能得到一个非常明确的结果,很简单。不过更推荐 Doomain 的方法,他的方法使用正则表达式解析URL,达到的目的一致,但运行效率更高,代码也更加简洁。关于这一方法的代码在本文评论的13楼,点击这里快速到达。

  • 相关阅读:
    列表
    Lambda表达式
    委托
    泛型(二)
    泛型(一)
    继承
    object类
    linux 命令补全包
    记一次 mysql 安装完成后启动报错 且 日志为空
    nginx 下配置https 访问提示下载文件 解决方法
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2226321.html
Copyright © 2011-2022 走看看