open source
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
class Location {
|
||||
/* queries:Object;
|
||||
reload(force:boolean):void;
|
||||
hash: string;
|
||||
hostname: string;
|
||||
href: string;
|
||||
origin: string;
|
||||
pathname: string;
|
||||
port: string;
|
||||
assign(url: string): void;
|
||||
reload(forcedReload?: boolean): void;
|
||||
replace(url: string): void;
|
||||
toString(): string;*/
|
||||
|
||||
// getHref():string;
|
||||
// setHref(url:string):void;
|
||||
// fullpath:string;
|
||||
// protocol:string;
|
||||
// host:string;
|
||||
// search:string;
|
||||
// appUrl:string;
|
||||
|
||||
private _nativeObj = conch;
|
||||
private bk_setHref: Function;
|
||||
private _host:string;
|
||||
private _hostname:string;
|
||||
private _fullpath:string;
|
||||
private _pathname:string;
|
||||
private _protocol:string;
|
||||
private _port:string;
|
||||
private _search:string;
|
||||
private _href:string;
|
||||
private _origin:string;
|
||||
|
||||
static __urlCache__:Object={};
|
||||
|
||||
hash: string;
|
||||
get hostname():string
|
||||
{
|
||||
return this._hostname;
|
||||
}
|
||||
get host():string{
|
||||
return this._host;
|
||||
}
|
||||
get fullpath():string
|
||||
{
|
||||
return this._fullpath;
|
||||
}
|
||||
|
||||
get pathname():string
|
||||
{
|
||||
return this._pathname;
|
||||
}
|
||||
|
||||
get protocol():string
|
||||
{
|
||||
return this._protocol;
|
||||
}
|
||||
|
||||
get search():string
|
||||
{
|
||||
return this._search;
|
||||
}
|
||||
|
||||
get port():string
|
||||
{
|
||||
return this._port;
|
||||
}
|
||||
|
||||
get origin():string
|
||||
{
|
||||
return this._origin;
|
||||
}
|
||||
|
||||
get href(): string {
|
||||
return this._href;
|
||||
}
|
||||
set href(url: string) {
|
||||
url = this.normalizeUrl(url);
|
||||
// conch.showLoadingView(true);
|
||||
var oldhref = this._href;
|
||||
if (url != oldhref) {
|
||||
this.setHref(url);
|
||||
if (this._href != oldhref)
|
||||
reloadJS(true);
|
||||
}
|
||||
}
|
||||
//未实现
|
||||
// origin: string;
|
||||
// port: string;
|
||||
constructor() {
|
||||
//重载setHref
|
||||
this.bk_setHref = this._nativeObj.setHref.bind(this._nativeObj);
|
||||
// conch.setLocationObj(this._nativeObj);
|
||||
|
||||
}
|
||||
|
||||
setBaseHref(basehref:string):void
|
||||
{
|
||||
//this._nativeObj.setBaseHref(basehref);
|
||||
}
|
||||
|
||||
getBaseHref():string
|
||||
{
|
||||
//return this._nativeObj.getBaseHref();
|
||||
return "";
|
||||
}
|
||||
|
||||
assign(url: string): void {
|
||||
|
||||
}
|
||||
reload(forcedReload?: boolean): void {
|
||||
reloadJS(forcedReload);
|
||||
}
|
||||
replace(url: string): void {
|
||||
|
||||
}
|
||||
toString(): string {
|
||||
return this._href;
|
||||
}
|
||||
|
||||
/**
|
||||
* 想在脚本里进行url的解析。所以封装了个setHref函数
|
||||
*/
|
||||
setHref = (url:string) => {
|
||||
if (!url || url.length < 8) {
|
||||
alert("您的地址不符合要求");
|
||||
return;
|
||||
}
|
||||
var s=new RegExp("(http|file|https)://([^/:]*)(:(\\d+)|)([^?]+)(.*|)","g");
|
||||
var result;
|
||||
if((result=s.exec(url))!=null){
|
||||
this._href=result[0];
|
||||
this._hostname=result[2];
|
||||
this._host=result[2]+result[3];
|
||||
this._pathname=result[5];
|
||||
this._port=result[4];
|
||||
this._search=result[6];
|
||||
this._protocol=result[1]+":";
|
||||
this._origin=this._protocol+"//"+this._host;
|
||||
var i=this._pathname?this._pathname.lastIndexOf("/"):-1;
|
||||
if(i!=-1){
|
||||
var temp=this._pathname.substring(0,i);
|
||||
this._fullpath=this._origin+temp;
|
||||
}
|
||||
else{
|
||||
this._fullpath=this._origin+ this._pathname;
|
||||
}
|
||||
}
|
||||
else{
|
||||
alert("您的地址不符合要求");
|
||||
}
|
||||
//this._nativeObj.queries = this.parseQuery(url);
|
||||
this.bk_setHref(url);
|
||||
//对应的localStorage
|
||||
//注意必须在 bk_setHref, 因为需要解析结果。
|
||||
window.localStorage.create(this._fullpath + '/');
|
||||
|
||||
};
|
||||
|
||||
normalizeUrl(url): string {
|
||||
url = url.replace(/\\/g, '/');
|
||||
if (url[0] === '/')
|
||||
url = 'file://' + url;
|
||||
else if (url[1] === ':')
|
||||
url = 'file:///' + url;
|
||||
return url.trim();
|
||||
}
|
||||
|
||||
parseQuery(url): Object {
|
||||
var ret = {};
|
||||
var p1 = url.indexOf('?');
|
||||
if (p1 < 0)
|
||||
return null;
|
||||
var q = url.substr(p1 + 1);
|
||||
q && q.split('&').forEach((v, i, a) => {
|
||||
var kv = v.split('=');
|
||||
if (kv.length === 2) {
|
||||
ret[kv[0].trim()] = kv[1].trim();
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
resolve(fileName:string):string{
|
||||
//从缓存里取出此文件名
|
||||
var urlcache = Location.__urlCache__[fileName];
|
||||
//如果已经缓存过,直接返回结果
|
||||
if (urlcache != null) return urlcache;
|
||||
|
||||
if (fileName == null) {
|
||||
return "";
|
||||
}
|
||||
if(fileName.indexOf("//")==0)
|
||||
{
|
||||
return this.protocol+fileName;
|
||||
}
|
||||
if(fileName.indexOf("file:///")==0||fileName.indexOf("http://")==0||fileName.indexOf("https://")==0)return fileName;
|
||||
if ((fileName.charAt(1) == ':' && fileName.charAt(2) == '/'))
|
||||
fileName = "file://" + fileName;
|
||||
|
||||
//绝对路径的话,不能从index.html所在路径开始,否则与浏览器不一致
|
||||
if (fileName.charAt(0) == "/") {
|
||||
return this._origin + fileName;
|
||||
}
|
||||
|
||||
var basePath = this._fullpath;
|
||||
var urlfull = basePath + "/" + fileName;
|
||||
|
||||
urlcache = Location.__urlCache__[urlfull];
|
||||
|
||||
if (urlcache != null) return urlcache;
|
||||
|
||||
if (fileName.indexOf("://") < 0)
|
||||
fileName = basePath + "/" + fileName;
|
||||
|
||||
var urls = fileName.split("/");
|
||||
urls[1] = "";
|
||||
var str,i = 2,size = urls.length;
|
||||
while (i < size) {
|
||||
str = urls[i];
|
||||
if (str == null) break;
|
||||
if (str == '' || str == '.') {
|
||||
urls.splice(i, 1);
|
||||
continue;
|
||||
}
|
||||
if (str == "..") {
|
||||
if(i<=3&&this._protocol!="file:")
|
||||
{
|
||||
urls.splice(i,1);
|
||||
}
|
||||
else{
|
||||
urls.splice(i - 1, 2);
|
||||
i -= 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
fileName = urls.join("/");
|
||||
Location.__urlCache__[fileName] = fileName;
|
||||
Location.__urlCache__[urlfull] = fileName;
|
||||
return fileName;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user