之前使用Java的API命名做了解析location.search的例子
现在404页面需要分析document.referrer,不能直接拿到search字符串,所以还得想办法把URL解析成像Location一样的对象
可以想象,这种方法浏览器和服务器必须会有,JavaScript实现应该也有了,不过还是写一个玩玩,以显示个人风格:
function parseLocation(url){ if((typeof url)!="string"||url==""){return null;} var urlExp=/^(http:|https:|file:)(?:\/\/)([^\/]*)([^?#]*)([^#]*)(.*)$/ig, hostExp=/^([^:]*)((:\d+)?)$/ig; var protocol="", host="", hostname="", port="", pathname="", search="", hash=""; url.replace(urlExp,function(){ var args=arguments; protocol=args[1]; host=args[2]; pathname=args[3]; search=args[4]; hash=args[5]; }); host.replace(hostExp,function(){ var args=arguments; hostname=args[1]; port=args[2].replace(":",""); }); return protocol?{ protocol:protocol, host:host, hostname:hostname, port:port, pathname:pathname, search:search, hash:hash }:null; } //have a test (function(){ var url="https://www.google.com.hk/search?q=404&rlz=1C1CHRY_enCN481CN481&sugexp=chrome,mod=16&sourceid=chrome&ie=UTF-8#hash"; var loc=parseLocation(url); console.log(loc); })();
非常简洁,Bug肯定会有,毕竟我没去了解标准URL的规范
[2013-01-27]更新解析方式,使用浏览器的解析方式解析
/** * parse a location url to a location like object * @param {Object} window */ (function(window){ var a=window.document.createElement("a"); window.parseLocation=function(url){ if(!url){return null;} a.href=url; return { href:a.href, origin:a.origin||a.protocol+"//"+a.host, protocol:a.protocol, host:a.host, hostname:a.hostname, port:a.port, pathname:a.pathname, search:a.search, hash:a.hash }; }; })(window);