activexobject对象不能创建_8.2 location 对象

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

v2-e72f292af5a3f8c792ec506b9a7fc3ec_b.jpg

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()方法之后,用户不能回到前一个页面,来看下面的例子:

v2-461d10650845bb4c87e2a0a16b611abe_b.jpg

如果将这个页面加载到浏览器中,浏览器就会在 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 则表示原始的请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值