location 是最有用的 BOM 对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一 些导航功能。事实上,location 对象是很特别的一个对象,因为它既是 window 对象的属性,也是 document 对象的属性;换句话说,window.location 和 document.location 引用的是同一个对象。 location 对象的用处不只表现在它保存着当前文档的信息,还表现在它将 URL 解析为独立的片段,让 开发人员可以通过不同的属性访问这些片段。下表列出了 location 对象的所有属性(注:省略了每个属 性前面的 location 前缀)。

8.2.1 查询字符串参数

虽然通过上面的属性可以访问到 location 对象的大多数信息,但其中访问 URL 包含的查询字符 串的属性并不方便。尽管 location.search 返回从问号到 URL 末尾的所有内容,但却没有办法逐个访问其中的每个查询字符串参数。为此,可以像下面这样创建一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象:

function getQueryStringArgs(){

//取得查询字符串并去掉开头的问号

var qs = (location.search.length > 0 ? location.search.substring(1) : ""),

//保存数据的对象

args = {},

//取得每一项

items = qs.length ? qs.split("&") : [],

name = null,

item = null,

value = null,

//在 for 循环中使用

i = 0,

len = items.length;

//逐个将每一项添加到 args 对象中

for (i=0; i < len; i++){

item = items[i].split("=");

name = decodeURIComponent(item[0]);

value = decodeURIComponent(item[1]);

if (name.length) {

args[name] = value;

}

}

return args;

}

这个函数的第一步是先去掉查询字符串开头的问号。当然,前提是 location.search 中必须要

包含一或多个字符。然后,所有参数将被保存在 args 对象中,该对象以字面量形式创建。接下来, 根据和号(&)来分割查询字符串,并返回 name=value 格式的字符串数组。下面的 for 循环会迭代 这个数组,然后再根据等于号分割每一项,从而返回第一项为参数名,第二项为参数值的数组。再使 用 decodeURIComponent()分别解码 name 和 value(因为查询字符串应该是被编码过的)。最后, 将 name 作为 args 对象的属性,将 value 作为相应属性的值。下面给出了使用这个函数的示例。

//假设查询字符串是?q=javascript&num=10

var args = getQueryStringArgs();

alert(args["q"]); //"javascript"

alert(args["num"]); //"10"

可见,每个查询字符串参数都成了返回对象的属性。这样就极大地方便了对每个参数的访问。

8.2.2 位置操作

使用 location 对象可以通过很多方式来改变浏览器的位置。首先,也是最常用的方式,就是使用 assign()方法并为其传递一个 URL,如下所示。

location.assign("http://www.wrox.com");

这样,就可以立即打开新 URL 并在浏览器的历史记录中生成一条记录。如果是将 location.href 或 window.location 设置为一个 URL 值,也会以该值调用 assign()方法。例如,下列两行代码与 显式调用 assign()方法的效果完全一样。

window.location = "http://www.wrox.com";

location.href = "http://www.wrox.com";

在这些改变浏览器位置的方法中,最常用的是设置 location.href 属性。

另外,修改location对象的其他属性也可以改变当前加载的页面。下面的例子展示了通过将hash、 search、hostname、pathname 和 port 属性设置为新值来改变 URL。

//假设初始 URL 为 http://www.wrox.com/WileyCDA/

//将 URL 修改为"http://www.wrox.com/WileyCDA/#section1"

location.hash = "#section1";

//将 URL 修改为"http://www.wrox.com/WileyCDA/?q=javascript"

location.search = "?q=javascript";

//将 URL 修改为"http://www.yahoo.com/WileyCDA/" location.hostname = "http://www.yahoo.com";

//将 URL 修改为"http://www.yahoo.com/mydir/"

location.pathname = "mydir";

//将 URL 修改为"http://www.yahoo.com:8080/WileyCDA/"

location.port = 8080;

每次修改 location 的属性(hash 除外),页面都会以新 URL 重新加载。

当通过上述任何一种方式修改 URL 之后,浏览器的历史记录中就会生成一条新记录,因此用户通 过单击“后退”按钮都会导航到前一个页面。要禁用这种行为,可以使用 replace()方法。这个方法 只接受一个参数,即要导航到的 URL;结果虽然会导致浏览器位置改变,但不会在历史记录中生成新记 录。在调用 replace()方法之后,用户不能回到前一个页面,来看下面的例子:

如果将这个页面加载到浏览器中,浏览器就会在 1 秒钟后重新定向到 http://www.wrox.com。然后,“后退” 按钮将处于禁用状态,如果不重新输入完整的 URL,则无法返回示例页面。 与位置有关的最后一个方法是 reload(),作用是重新加载当前显示的页面。如果调用 reload() 时不传递任何参数,页面就会以最有效的方式重新加载。也就是说,如果页面自上次请求以来并没有改 变过,页面就会从浏览器缓存中重新加载。如果要强制从服务器重新加载,则需要像下面这样为该方法 传递参数 true。

location.reload(); //重新加载(有可能从缓存中加载)

location.reload(true); //重新加载(从服务器重新加载)

位于 reload()调用之后的代码可能会也可能不会执行,这要取决于网络延迟或系统资源等因素。 为此,最好将 reload()放在代码的最后一行。

这个 hasPlugin()函数接受一个参数:要检测的插件名。第一步是将传入的名称转换为小写形式, 以便于比较。然后,迭代 plugins 数组,通过 indexOf()检测每个 name 属性,以确定传入的名称是 否出现在字符串的某个地方。比较的字符串都使用小写形式可以避免因大小写不一致导致的错误。而传 入的参数应该尽可能具体,以避免混淆。应该说,像 Flash 和 QuickTime 这样的字符串就比较具体了, 不容易导致混淆。在 Firefox、Safari、Opera 和 Chrome 中可以使用这种方法来检测插件。

检测 IE 中的插件比较麻烦,因为 IE 不支持 Netscape 式的插件。在 IE 中检测插件的唯一方式就是 使用专有的 ActiveXObject 类型,并尝试创建一个特定插件的实例。IE 是以 COM 对象的方式实现插 件的,而 COM 对象使用唯一标识符来标识。因此,要想检查特定的插件,就必须知道其 COM 标识符。 例如,Flash 的标识符是 ShockwaveFlash.ShockwaveFlash。知道唯一标识符之后,就可以编写类似 下面的函数来检测 IE 中是否安装相应插件了。

//检测 IE 中的插件

function hasIEPlugin(name){

try {

new ActiveXObject(name);

return true;

} catch (ex){

return false;

}

}

//检测 Flash

alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"));

//检测 QuickTime

alert(hasIEPlugin("QuickTime.QuickTime"));

在这个例子中,函数 hasIEPlugin()只接收一个 COM 标识符作为参数。在函数内部,首先会尝 试创建一个 COM 对象的实例。之所以要在 try-catch 语句中进行实例化,是因为创建未知 COM 对象 会导致抛出错误。这样,如果实例化成功,则函数返回 true;否则,如果抛出了错误,则执行 catch 块,结果就会返回 false。例子最后检测 IE 中是否安装了 Flash 和 QuickTime 插件。 鉴于检测这两种插件的方法差别太大,因此典型的做法是针对每个插件分别创建检测函数,而不是 使用前面介绍的通用检测方法。来看下面的例子。

//检测所有浏览器中的 Flash

function hasFlash(){

var result = hasPlugin("Flash");

if (!result){

result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");

}

return result;

}

//检测所有浏览器中的 QuickTime

function hasQuickTime(){

var result = hasPlugin("QuickTime");

if (!result){

result = hasIEPlugin("QuickTime.QuickTime");

}

return result;

}

//检测 Flash

alert(hasFlash());

//检测 QuickTime

alert(hasQuickTime());

上面代码中定义了两个函数:hasFlash()和 hasQuickTime()。每个函数都是先尝试使用不针对 IE 的插件检测方法。如果返回了 false(在 IE 中会这样),那么再使用针对 IE 的插件检测方法。如果 IE 的插件检测方法再返回 false,则整个方法也将返回 false。只要任何一次检测返回 true,整个方 法都会返回 true。

8.3.2 注册处理程序

Firefox 2为 navigator 对象新增了 registerContentHandler()和 registerProtocolHandler()方 法(这两个方法是在 HTML5 中定义的,相关内容将在第 22 章讨论)。这两个方法可以让一个站点指明 它可以处理特定类型的信息。随着 RSS 阅读器和在线电子邮件程序的兴起,注册处理程序就为像使用桌面应用程序一样默认使用这些在线应用程序提供了一种方式。

其中,registerContentHandler()方法接收三个参数:要处理的 MIME 类型、可以处理该 MIME 类型的页面的 URL 以及应用程序的名称。举个例子,要将一个站点注册为处理 RSS 源的处理程序,可以使用如下代码。

navigator.registerContentHandler("application/rss+xml","http://www.somereader.com?feed=%s", "Some Reader");

第一个参数是 RSS 源的 MIME 类型。第二个参数是应该接收 RSS 源 URL 的 URL,其中的%s 表示 RSS 源 URL,由浏览器自动插入。当下一次请求 RSS 源时,浏览器就会打开指定的 URL,而相应的 Web 应用程序将以适当方式来处理该请求。

类似的调用方式也适用于 registerProtocolHandler()方法,它也接收三个参数:要处理的协 议(例如,mailto 或 ftp)、处理该协议的页面的 URL 和应用程序的名称。例如,要想将一个应用程 序注册为默认的邮件客户端,可以使用如下代码。

navigator.registerProtocolHandler("mailto", "http://www.somemailclient.com?cmd=%s", "Some Mail Client");

这个例子注册了一个 mailto 协议的处理程序,该程序指向一个基于 Web 的电子邮件客户端。同样, 第二个参数仍然是处理相应请求的 URL,而%s 则表示原始的请求。

ie对象不支持“jggrid“属性或方法_8.2 location 对象相关推荐

  1. js错误:对象不支持此属性或方法

    对象不支持此属性或方法 错误原因: 可能是js的文件名和另外一个文件重复. 也有可能是js里的function和另外一个function名字重复. 也有可能是js里的function和页面的某一元素重 ...

  2. 解决IE10以下对象不支持“bind“属性或方法

    IE10一下的浏览器,如果在JS代码中用了bind函数,那么就会报"SCRIPT438: 对象不支持"bind"属性或方法" 因为浏览器没有提供这个参数的方法, ...

  3. Error in v-on handler: “TypeError: 对象不支持“set”属性或方法“

    Error in v-on handler: "TypeError: 对象不支持"set"属性或方法" FormData.set() 所有IE不兼容 MDN-F ...

  4. 常见错误:JavaScript 提交form 的时候,Error:对象不支持此属性或方法

    form submit() Error:对象不支持此属性或方法 无论用document.forms[0].submit() 还是其他方式,均报此错误 说明form中有名字叫做submit的元素,一般为 ...

  5. 页面老报错: 对象不支持此属性或方法

    网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; CIBA) 时间戳: Mon, ...

  6. IE显示对象不支持此属性或方法 的解决方法

    有时用IE打开某些网站,比如经常有朋友碰到的是在打开QQ空间时,在IE左下角的状态栏会显示"已完毕,但网页上有错误!",双击这个错误会看到提示是"找不到指定模块" ...

  7. javascript 方法 一直提示 对象不支持此属性或方法

    今天在做那个登录功能时,登录运行到login()方法时IE老是提示"对象不支持此属性或方法".... 网上查资料得知:javaScript的方法名中不能与页面上的标签名相同.... ...

  8. 解决document.form.submit()对象不支持此属性或方法

    很奇怪的问题,呵呵..被我碰到了. 很简单,将页面中名称为"submit"的控件改一下名称就可以了 比如: 有一个submit按钮名字叫submit <input type= ...

  9. 对象不支持“attachEvent”属性或方法

    IE11浏览器在访问我们的服务器的时候出现错误:对象不支持"attachEvent"属性或方法.网上说需要进入管理加载项禁用迅雷的某个组件.我试了一下,好像不管用.因为在IE9浏览 ...

  10. 错误: 对象不支持“attachEvent”属性或方法

    错误: 对象不支持"attachEvent"属性或方法 解决办法 把attachEvent 改为addEventListener即可

最新文章

  1. 学习理发去哪里_作为女性,学习运维工程师去哪里好
  2. stream测试内存_.net core百万设备连接服务和硬件需求测试
  3. Java基础:IO流之File类
  4. Interview:人工智能岗位面试—人工智能职位之计算机视觉算法工程师的简介、知识结构、发展方向之详细攻略
  5. R语言与非参数检验之单样本位置检验
  6. 工作48:$emit
  7. 数据结构实验之栈五:下一较大值(一)
  8. 数据可视化demo_火出圈的大屏你真的会做吗?这才是老板最爱的可视化大屏
  9. 开放域对话中粗粒度响应选择的上下文细到粗蒸馏
  10. 怎样在input里加入搜索_影视类公众号文章怎样图文排版可以吸引用户?
  11. Ubuntu破解密码
  12. 推荐oracle exadata,Exadata的一些常见误区
  13. 冬季到吉林来玩雪|史上最全的吉林冬季旅游攻略!
  14. 关于substance painter 导出贴图到maya步骤
  15. LeetCode热题100中使用辅助栈方法的题目的整理(待更)
  16. 《余世维 - 有效沟通》讲义zz
  17. BAS落地(Breach Attack And Simulation)
  18. 蜜雪冰城、茶颜悦色“卷”向咖啡赛道
  19. SuperMap WebGL三维包加载3dtiles数据
  20. 盛大借助Bambook程序达人赛推开放平台

热门文章

  1. opencv图像分析与处理(7)- 频率域滤波的基础公式、步骤与C++实现
  2. 基于手机系统的实时目标检测
  3. 在手机上实现实时的单目3D重建
  4. Java ListIterator 与 Iterator 异同
  5. 数据分析------数据处理(2)及 AutoML 学习
  6. 每天进步一点点——Linux系统中的异常堆栈跟踪简单实现
  7. Python学习---Python的框架基础学习
  8. dubbo 异步回调
  9. Linux 初始化系统 systemd - journald 日志
  10. day3-3.4字符编码与转码