成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

《JavaScript高級(jí)程序設(shè)計(jì)》(第3版)讀書筆記 第8章 BOM

AWang / 1236人閱讀

摘要:僅限數(shù)值表示新窗口的高度。此時(shí)只要檢查這個(gè)返回值就可以確定彈窗是否被屏蔽。返回一個(gè)布爾值,代表用戶選擇還是返回一個(gè)字符串或者,輸入了值并確定,返回字符串,其他方法關(guān)閉返回打印查找對(duì)話框。

ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(瀏覽器對(duì)象模型)則無(wú)疑才是真正的核心。

W3C為了把瀏覽器中JavaScript最基本的部分標(biāo)準(zhǔn)化,已經(jīng)將BOM的主要方面納入了HTML5規(guī)范中

window對(duì)象

BOM 的核心對(duì)是window,它表示瀏覽器的一個(gè)實(shí)例。在瀏覽器中window對(duì)象既是通過(guò)JavaScript訪問(wèn)瀏覽器窗口的一個(gè)接口,又是ECMAScript規(guī)定的Global對(duì)象,因此有權(quán)訪問(wèn)parseInt()等方法

全局作用域

所有在全局作用域中聲明的變量、函數(shù)都會(huì)變成window對(duì)象的屬性和方法。

定義全局變量與直接在window對(duì)象上定義屬性還是有一點(diǎn)差別:全局變量不能通過(guò)delete操作符刪除,而直接定義在window對(duì)象上的屬性可以

var age = 29;
window.color = "red";

// 在IE < 9 時(shí)拋出錯(cuò)誤,在其他瀏覽器里返回 false
delete window.age;

// 在IE < 9 時(shí)拋出錯(cuò)誤,在其他瀏覽器里返回 true
delete window.color;

console.log(window.age);       // 29
console.log(window.color);     // undefined

全局環(huán)境下使用var語(yǔ)句添加的window屬性有一個(gè)名為[[Configruable]]的特性,這個(gè)特性的值被設(shè)置為false,因此不可通過(guò)delete刪除。IE8及更早版本在遇到使用delete刪除window屬性的語(yǔ)句時(shí),不管該屬性最初如何創(chuàng)建的,都會(huì)拋出錯(cuò)誤,以示警告。

嘗試訪問(wèn)未聲明的屬性會(huì)拋出錯(cuò)誤,但是通過(guò)查詢window對(duì)象,可以知道某個(gè)可能未聲明的變量是否存在

// 這里會(huì)拋出錯(cuò)誤 oldValue 未定義
var newValue = oldValue;

// 這里不會(huì)拋出錯(cuò)誤,因?yàn)檫@是一次屬性查詢
// newValue的值是 undefined
var newValue = window.oldValue;
窗口關(guān)系及框架

如果頁(yè)面中包含框架,則每個(gè)框架都擁有自己的window對(duì)象,并且保存在frames集合中。

frames集合中,可以通過(guò)數(shù)值索引(從0開始,從左至右,從上到下)或者框架名稱來(lái)訪問(wèn)相應(yīng)的window對(duì)象。每個(gè)window對(duì)象都有一個(gè)name屬性,其中包含框架的名稱。


  
     Frameset Example
  
  
    
    
      
      
    
  

可以通過(guò)window.frames[0]或者window.frames["topFrame"]來(lái)引用上方的框架,不過(guò)最好使用top而非window。例如 top.frames[0]

top對(duì)象始終指向最高(最外層)的框架,也就是瀏覽器窗口。

top相對(duì)的另一個(gè)window對(duì)象是parent。parent(父)對(duì)象始終指向當(dāng)前框架的直接上層框架。在某些情況下parent有可能等于top,但在沒(méi)有框架的情況下,parent一定等于top。此時(shí)他們都是window

窗口位置

用來(lái)確定和修改window對(duì)象位置的屬性和方法有很多。

IE, Safari, Opera, Chrome 都提供了screenLeftscreenTop屬性,分別用于表示相對(duì)屏幕左邊和上邊的位置。

Firefox 則在 screenXscreenY 屬性中提供相同的窗口位置信息, Safari, Chrome也同時(shí)支持這兩個(gè)屬性。

Opera雖然支持 screenXscreenY 屬性,但與 screenLeftscreenTop 并不對(duì)應(yīng),因此建議大家不要在 Opera中使用。

使用下列代碼可以跨瀏覽器取得窗口左邊和上邊的位置

// 確定 screenLeft 和 screenTop 屬性是否存在
// 存在,是在 IE, Safari, Opera, Chrome
// 否則,是在 Firefox中
var leftPos = (typeof window.screenLeft == "number") ?
                window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ?
                window.screenTop : window.screenY;

在IE Opera 中,返回的是頁(yè)面到屏幕邊緣的距離(不包括瀏覽器的工具欄等),而 Chrome Firefox Safari 返回的是瀏覽器到屏幕邊緣的距離(包括瀏覽器的工具欄等)。

更讓人抓狂的是, Firefox Safari Chrome 始終返回頁(yè)面中每個(gè)框架的 top.screenX top.screenY 值。即使在頁(yè)面由于被設(shè)置了外邊距發(fā)生偏移的情況下,相對(duì)于window對(duì)象使用top.screenX top.screenY每次也都會(huì)返回相同的值。而IE Opera則會(huì)給出框架相對(duì)于屏幕辯解的精確坐標(biāo)值。

最終結(jié)果是無(wú)法在跨瀏覽器的條件下取得窗口左邊和上邊的精確坐標(biāo)值。

使用moveTo()moveBy()方法,倒是有可能將窗口的精確地移動(dòng)到一個(gè)新位置。這兩個(gè)方法都接受兩個(gè)參數(shù)

// 將窗口移動(dòng)到屏幕左上角
window.moveTo(0, 0);

// 將窗口向下移動(dòng)100像素
window.moveBy(0, 100);

// 將窗口移動(dòng)到(200, 300)
window.moveTo(200, 300);

// 將窗口向左移動(dòng)50像素
window.moveBy(-50, 0);

需要注意的是,這兩個(gè)方法可能會(huì)被瀏覽器禁用;而且在Opera和IE7+中默認(rèn)就是禁用的。

這兩個(gè)方法都不適用于框架,只能對(duì)最外層的window對(duì)象使用。

窗口大小

跨瀏覽器確定一個(gè)窗口的大小不是一件簡(jiǎn)單的事情。

IE9+ Firefox Safari Opera Chrome 均為此提供了4個(gè)屬性:innerwidth innerHeight outerWidth outerHeight。

IE9 Safari Firefox 中 outerWidth outerHeight 返回瀏覽器窗口本身的尺寸(無(wú)論是從最外層的window對(duì)象還是從某個(gè)框架訪問(wèn))。

Opera中這兩個(gè)屬性的值表示頁(yè)面視圖容器的大小。

innerwidth innerHeight則表示容器中頁(yè)面視圖區(qū)的大?。p去邊框?qū)挾龋?/p>

Chrome 中 四個(gè)值返回的相同,即視口(viewport)大小而非瀏覽器窗口大小。

下面的代碼可以跨瀏覽器取得視口大小,但最終無(wú)法確定瀏覽器窗口本身大小

var pageWidth = window.innerWidth;
var pageHeight = window.innerHeight;

// document.compatMode 這個(gè)屬性將在第10章討論
if (typeof pageWidth != "number") {
  if (document.compatMode == "CSS1Compat") {
    pageWidth = document.documentElement.clientWidth;
    pageHeight = document.documentElement.clientHeight;
  } else {
    pageWidth = document.body.clientWidth;
    pageHeight = document.body.clientHeight;
  }
}

使用 resizeTo()resizeBy() 方法可以調(diào)整瀏覽器窗口的大小。需要注意,這兩個(gè)方法也可能被瀏覽器禁用。在Opera和IE7+中默認(rèn)禁止

這兩個(gè)方法不適用于框架,只能對(duì)最外層的window對(duì)象使用

// 調(diào)整到 100 x 100
window.resizeTo(100, 100);

// 調(diào)整到 200 x 150
window.resizeBy(100, 50);

// 調(diào)整到 300 x 300
window.resizeTo(300, 300);
導(dǎo)航和打開窗口

window.open() 方法既可以導(dǎo)航到一個(gè)特定的URL,也可以打開一個(gè)新的瀏覽器窗口。接受四個(gè)參數(shù):

要加載的URL

窗口目標(biāo) (窗口或者框架的名字以及特殊窗口名稱: _self, _parent, _top, _blank)

特性字符串(新窗口的特性設(shè)置,逗號(hào)分隔)

表示新頁(yè)面是否取代瀏覽器歷史記錄中當(dāng)前加載頁(yè)面的布爾值

// 等同于 
window.open("http://www.wrox.com", "topFrame");
彈出窗口

如果給window.open()傳遞的第二個(gè)參數(shù)并不是一個(gè)已經(jīng)存在的窗口或者框架,那么該方法就會(huì)根據(jù)在第三個(gè)參數(shù)位置上傳入的字符串創(chuàng)建一個(gè)新窗口或者新標(biāo)簽。

如果沒(méi)有傳入第三個(gè)參數(shù),那么就會(huì)打開一個(gè)帶有全部默認(rèn)設(shè)置(工具欄、地址欄和狀態(tài)欄等)的新瀏覽器窗口(或者新標(biāo)簽)。

在不打開新窗口的情況下,會(huì)忽略第三個(gè)參數(shù)。

第三個(gè)參數(shù)是一個(gè)逗號(hào)分隔的設(shè)置字符串,表示新窗口有哪些特性。

設(shè)置 說(shuō)明
fullscreen yes/no 表示瀏覽器窗口是否最大化。僅限IE
height 數(shù)值 表示新窗口的高度。不能小于100
width 數(shù)值 表示新窗口的寬度。不能小于100
left 數(shù)值 左坐標(biāo),不能是負(fù)值
top 數(shù)值 上坐標(biāo)。不能是負(fù)值
location yes/no 表示是否在瀏覽器窗口中顯示地址欄。不同瀏覽器的默認(rèn)值不同。如果設(shè)置為no,地址欄可能會(huì)隱藏,也可能會(huì)禁用,取決于瀏覽器
menubar yes/no 是否顯示菜單欄。默認(rèn)no
resizeable yes/no 是可以拖動(dòng)窗口大小。默認(rèn)值no
scrollbars yes/no 是否允許滾動(dòng)。默認(rèn)no
status yes/no 是否顯示狀態(tài)欄。默認(rèn)no
toolbar yes/no 是否顯示工具欄。默認(rèn)no

window.open()方法會(huì)返回一個(gè)指向新窗口的引用,大致與其他window對(duì)象一致,但我們可以進(jìn)行更多操作控制。

例如有些瀏覽器針對(duì)通過(guò)window.open()創(chuàng)建的還口不允許我們針對(duì)朱瀏覽器窗口調(diào)整大小或移動(dòng)位置,但卻允許我們針對(duì)通過(guò)window.open()創(chuàng)建的窗口調(diào)整大小或移動(dòng)位置。

var wroxWin = window.open("http://www.wrox.com", "wroxWindow",
            "height=400,width=400,top=10,left=10,resizable=yes");

// 新創(chuàng)建的window對(duì)象有一個(gè)opener屬性
// 保存打開它的原始窗口對(duì)象
// 而原始窗口不跟蹤打開的新窗口,沒(méi)有指向新窗口對(duì)象的屬性
console.log(wroxWin.opener == window); // true

// 調(diào)整大小
wroxWin.resizeTo(500, 500);

// 移動(dòng)位置
wroxWin.moveTo(100, 100);

// 關(guān)閉新打開的窗口
// 這個(gè)方法僅限于通過(guò) window.open() 打開的彈出窗口
// 對(duì)于主窗口如果沒(méi)有得到用于的允許是不能關(guān)閉它的。
wroxWin.close();

// 彈窗關(guān)閉后,窗口的引用仍然還在
// 但除了檢測(cè)其closed屬性沒(méi)有其他用處
console.log(wroxWin.closed);    // true

有些瀏覽器(如IE8 和 Chrome)會(huì)在獨(dú)立的進(jìn)程運(yùn)行每一個(gè)標(biāo)簽頁(yè)。當(dāng)一個(gè)標(biāo)簽打開另一個(gè)標(biāo)簽頁(yè)時(shí),如果兩個(gè)window對(duì)象之間需要彼此通信,那么新標(biāo)簽就不能運(yùn)行在獨(dú)立的進(jìn)程中。

在Chrome中新建的標(biāo)簽頁(yè)opener屬性設(shè)置為null,即表示在多帶帶的進(jìn)程中運(yùn)行新標(biāo)簽

var wroxWin = window.open("http://www.wrox.com", "wroxWindow",
            "height=400,width=400,top=10,left=10,resizable=yes");

wroxWin.opener = null;
安全限制

目前大部分瀏覽器都不能通過(guò)第四個(gè)參數(shù)修改是否顯示狀態(tài)欄,不允許彈窗到屏幕意外,不允許關(guān)閉地址等等,加強(qiáng)彈窗的安全性,以免用戶和系統(tǒng)對(duì)話框混淆。

Chrome采取了不同的處理方式,它不會(huì)像其他瀏覽器那樣簡(jiǎn)單的屏蔽這些彈窗,而是只是顯示它們的標(biāo)題欄,并放在窗口右下角。

彈出窗口屏蔽程序

大部分瀏覽器或者瀏覽器插件都會(huì)屏蔽彈窗,此時(shí)window.open()很可能返回null。此時(shí)只要檢查這個(gè)返回值就可以確定彈窗是否被屏蔽。

var wroxWin = window.open("http://www.wrox.com", "_blank");
if (wroxWin == null) {
  console.log("The popup was blocked!");
}

瀏覽器拓展程序(插件)或其他程序阻止彈窗,那么 window.open()通常會(huì)拋出錯(cuò)誤。因此不但要檢測(cè)返回值,還要將對(duì) window.open()的調(diào)用封裝在一個(gè) try-catch 塊中

var bloacked = false;

try {
  var wroxWin = window.open("http://www.wrox.com", "_blank");
  if (wroxWin == null) {
    bloacked = true;
  }
} catch (ex) {
  bloacked = true;
}

if (blocked) {
  console.log("The popup was blocked!");
}
間歇調(diào)用和超時(shí)調(diào)用

JavaScript是單線程語(yǔ)言,但它允許通過(guò)設(shè)置超時(shí)值和間歇值來(lái)調(diào)度代碼在特定的時(shí)刻執(zhí)行。

// 第一個(gè)參數(shù)傳遞字符串,不推薦!
setTimeout("alert("Hello World!");", 1000);

// 推薦的方式
setTimeout(() => {
  alert("Hello World!");
}, 1000);

JavaScript是一個(gè)單線程解釋器,因此一定時(shí)間內(nèi)只能執(zhí)行一段代碼。為了控制要執(zhí)行的代碼,就有一個(gè)JavaScript任務(wù)隊(duì)列。這些任務(wù)會(huì)按照將他們添加到隊(duì)列中的順序執(zhí)行。

第二個(gè)參數(shù)是告訴JavaScript再過(guò)多久把當(dāng)前任務(wù)添加到隊(duì)列中。之后如果隊(duì)列是空的,那么添加的代碼會(huì)立即執(zhí)行,如果不是空的,那么就要等前面的代碼執(zhí)行完了以后再執(zhí)行。

該方法會(huì)返回一個(gè)數(shù)值ID,這是計(jì)劃執(zhí)行代碼的唯一標(biāo)識(shí)符,可以通過(guò)它來(lái)取消超時(shí)調(diào)用。

var timeoutId = setTimeout(() => {
  alert("Hello World!");
}, 1000);

// 取消執(zhí)行
clearTimeout(timeoutId);

超時(shí)調(diào)用的代碼都是在全局作用域中執(zhí)行的,因此函數(shù)中 this 的值在非嚴(yán)格模式下 指向 window ,在嚴(yán)格模式下是 undefined。

setInterval()用法與上述類似

系統(tǒng)對(duì)話框

alert(), confirm(), prompt() 方法可以調(diào)用系統(tǒng)對(duì)話框向用戶顯示消息。系統(tǒng)對(duì)話框與瀏覽器中顯示的網(wǎng)頁(yè)沒(méi)有關(guān)系,不包含HTML,外觀由操作系統(tǒng)和瀏覽器設(shè)置決定。打開對(duì)話框都是同步和模態(tài)的。也就是說(shuō),這些對(duì)話顯示的時(shí)候,代碼會(huì)停止執(zhí)行,而關(guān)掉這些對(duì)話框又會(huì)恢復(fù)執(zhí)行。

confim() 返回一個(gè)布爾值,代表用戶選擇"ok"還是"cancel"

prompt() 返回一個(gè)字符串或者null,輸入了值并確定,返回字符串,其他方法關(guān)閉返回null

打印、查找 對(duì)話框 print() find()。沒(méi)什么卵用

location對(duì)象

location是最有用的BOM對(duì)象之一,它提供了與當(dāng)前窗口中加載的文檔有關(guān)的信息,還提供一些導(dǎo)航功能。

location 對(duì)象既是window對(duì)象的屬性,也是document對(duì)象的屬性;換言之,window.location document.location引用的是同一個(gè)對(duì)象。

屬性名 例子 說(shuō)明
hash "#contents" 返回 URL 中的hash(#號(hào)后跟零或多個(gè)字符),如果URL中不包含散列,則返回空字符串
host "www.wrox.com:80" 返回服務(wù)器名稱和端口號(hào)(如果有)
hostname "www.wrox.com" 返回服務(wù)器名稱不帶端口號(hào)
href "http:/www.wrox.com" 返回當(dāng)前加載頁(yè)面的完整URL。而location對(duì)象的toString()方法也返回這個(gè)值
pathname "/WileyCDA/" 返回URL中的目錄或者文件名
port "www.wrox.com" 返回端口號(hào)。如果沒(méi)有端口號(hào),返回空字符串
protocol "http:" 返回頁(yè)面使用的協(xié)議。通常是 http: https:
search "?q=javascript 返回URL查詢字符串。這個(gè)字符串以問(wèn)號(hào)開頭
查詢字符串參數(shù)

雖然上表的屬性可以訪問(wèn)到location對(duì)象大多數(shù)信息,但是其中訪問(wèn)URL包含查詢字符串的屬性并不方便。盡管location.search返回從問(wèn)號(hào)到URL末尾的所有內(nèi)容,但卻沒(méi)有辦法逐個(gè)訪問(wèn)其中的每個(gè)查詢字符串參數(shù)。

為此我們可以創(chuàng)建如下函數(shù)

funcction getQueryStringArgs() {

  // 取得查詢字符串并去掉開頭的問(wèn)號(hào)
  var qs = (location.search.length > 0 ? location.search.substring(1) : "");

  // 保存數(shù)據(jù)的對(duì)象
  var args = {};

  // 取得每一項(xiàng)
  var items = qs.length ? qs.split("&") : [];
  var item = null;
  var name = null;
  var value = null;

  // 在for循環(huán)中使用
  var i = 0;
  var len = items.length;

  // 逐個(gè)將每一項(xiàng)添加到args對(duì)象中
  for (var 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對(duì)象可以通過(guò)很多方式來(lái)改變?yōu)g覽器的位置。

首先也是最常用的方式 assign()方法,并為其傳遞一個(gè)URL。立即打開新的URL并在瀏覽器的歷史記錄中生成一條記錄。如果是將location.hrefwindow.location設(shè)置為一個(gè)URL值,也會(huì)以該值調(diào)用assign()方法。

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

另外修改location對(duì)象的其他屬性也可以改變當(dāng)前加載的頁(yè)面。下面的例子展示了通過(guò)將hash, search, hostname, pathname, prot 屬性設(shè)置為新值來(lái)改變URL

// 假設(shè)初始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.wrox.com/wileyCDA/
location.hostname = "www.yahoo.com"

// 將URL修改為 http://www.yahoo.com/mydir/
location.pathname = "mydir"

// 將URL修改為 http://www.yahoo.com:8080/wileyCDA/
location.port = 8080;

每次修改location屬性(hash除外),頁(yè)面都會(huì)以新URL重新加載

通過(guò)上述任何一種方式修改URL之后,瀏覽器的歷史記錄中就會(huì)生成一條新紀(jì)錄,因此用戶通過(guò)單擊“后退”按鈕都會(huì)導(dǎo)航到前一個(gè)頁(yè)面。要禁用這種行為,可以使用replace()方法。這個(gè)方法只接受一個(gè)參數(shù),即要盜號(hào)的URL。雖然結(jié)果會(huì)導(dǎo)致瀏覽器位置改變,但不會(huì)在歷史記錄中生成新記錄。在調(diào)用replace()方法后,用戶不能回到前一個(gè)頁(yè)面

在IE8 Firefox 1 Safari 2+ Opera9+ Chrome 中,修改hash的值會(huì)在瀏覽器的歷史記錄中生成一條記錄。在IE早期版本中,hash屬性不會(huì)再用戶單擊“后退”和“前進(jìn)”按鈕時(shí)被更新,而只會(huì)在用戶單擊包含hash的URL時(shí)才會(huì)被更新

reload() 作用是重新加載當(dāng)前頁(yè)面的顯示。如果不傳參,頁(yè)面就會(huì)以最有效的方式重新加載。如果頁(yè)面上次請(qǐng)求一來(lái)并沒(méi)有改變過(guò),頁(yè)面就會(huì)從瀏覽器緩存中重新加載。如果要強(qiáng)制從服務(wù)器重新加載,則需要像下面這樣為該方法傳遞參數(shù)true

位于reload()調(diào)用之后的代碼可能會(huì)也可能不會(huì)執(zhí)行,這要取決于網(wǎng)絡(luò)延遲或系統(tǒng)資源等因素。為此最好將reload()放在代碼的最后一行

navigator對(duì)象

每個(gè)瀏覽器中的navigator對(duì)象表現(xiàn)是一致的,也有一套自己的屬性

屬性或方法 說(shuō)明 IE Firefox Safari/Chrome Opera
appCodeName 瀏覽器的名稱。通常都是Mozilla,即使在非Mozilla瀏覽器中也是如此 3.0+ 1.0+ 1.0+ 7.0+
appMinorVersion 次版本 4.0+ - - 9.5+
appName 完整的瀏覽器名稱 3.0+ 1.0+ 1.0+ 7.0+
appVersion 瀏覽器的版本。一般不與實(shí)際的瀏覽器版本對(duì)應(yīng) 3.0+ 1.0+ 1.0+ 7.0+
buildID 瀏覽器變異版本 - 2.0+ - -
cookieEnabled 表示cookie是否啟用 4.0+ 1.0+ 1.0+ 7.0+
cpuClass 客戶端計(jì)算機(jī)中使用的cpu類型 4.0+ - - -
javaEnabled() 表示當(dāng)前瀏覽器中是否啟用了java 4.0+ 1.0+ 1.0+ 7.0+
language 瀏覽器的主語(yǔ)言 - 1.0+ 1.0+ 7.0+
mineTypes 表示當(dāng)前瀏覽中注冊(cè)的MIME類型數(shù)組 4.0+ 1.0+ 1.0+ 7.0+
onLine 表示瀏覽器是否連接到了因特網(wǎng) 4.0+ 1.0+ - 9.5+
oscpu 客戶端計(jì)算機(jī)的操作系統(tǒng)或使用的CPU - 1.5+ - -
platform 瀏覽器所在的系統(tǒng)平臺(tái) 4.0+ 1.0+ 1.0+ 7.0+
plugins 瀏覽器中安裝的插件信息的數(shù)組 4.0+ 1.0+ 1.0+ 7.0+
preference 設(shè)置用戶的首選項(xiàng) - 1.5+ - -
product 產(chǎn)品名稱 如Gecko - 1.0+ 1.0+ -
productSub 關(guān)于產(chǎn)品的次要信息 - 1.0+ 1.0+ -
registerContentHandler() 針對(duì)特定的MIME類型將一個(gè)站點(diǎn)注冊(cè)為處理程序 - 2.0+ - -
registerProtocolHandler() 針對(duì)特定的協(xié)議將一個(gè)站點(diǎn)注冊(cè)為處理程序 - 2.0+ - -
securityPolicy 已經(jīng)廢棄。安全策略的名稱。為了與Netscape Navigator4向后兼容而保留下來(lái) - 1.0+ - -
systemLanguage 操作系統(tǒng)的語(yǔ)言 4.0+ - - -
taintEnabled() 已廢棄。表示是否允許變量被修改。為了與Netscape Navigator3向后兼容而保留下來(lái) 4.0+ 1.0+ - 7.0
userAgent 瀏覽器的用戶代碼字符串 3.0+ 1.0+ 1.0+ 7.0+
userLanguage 操作系統(tǒng)的默認(rèn)語(yǔ)言 4.0+ - - 7.0+
userProfile 借以訪問(wèn)用戶個(gè)人信息的對(duì)象 4.0+ - - -
vendor 瀏覽器的品牌 - 1.0+ 1.0+ -
vendorSub 有關(guān)供應(yīng)商的次要信息 - 1.0+ 1.0+ -
檢查插件

檢測(cè)瀏覽器中是否安裝了特定的插件是一種最常見的檢測(cè)歷程。對(duì)于非IE瀏覽器,可以使用plugins數(shù)組來(lái)達(dá)到這個(gè)目的。該數(shù)組中的每一項(xiàng)都包含下列屬性。

name: 插件名字

description: 插件的描述

filename: 插件的文件名

length: 插件所處理的MIME類型數(shù)量

一般來(lái)說(shuō)name屬性中會(huì)包含檢測(cè)插件必需的所有信息,但有時(shí)候也不完全如此。在檢測(cè)插件時(shí),需要像下面這樣循環(huán)代碼每個(gè)插件并將插件的name與給定的名字進(jìn)行比較

// 檢測(cè)插件(在IE中無(wú)效)
function hasPlugin(name) {
  name = name.toLowerCase();
  for (var i=0; i < navigator.plugins.length; i++) {
    if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
      return true;
    }
  }
  return false;
}

//  檢測(cè)flash
console.log(hasPlugin("Flash"));

//  檢測(cè)QuickTime
console.log(hasPlugin("QuickTime"));

檢測(cè)IE中的插件比較麻煩,因?yàn)镮E不支持Netscape式的插件,唯一的方式是使用專用的ActiveXObject類型,并嘗試創(chuàng)建一個(gè)特定插件的實(shí)例。IE是以COM對(duì)象的方式實(shí)現(xiàn)插件的,而COM對(duì)象使用唯一標(biāo)識(shí)符來(lái)標(biāo)識(shí)。因此要想檢測(cè)特定的插件,就必須知道其COM標(biāo)識(shí)符,例如Flash的標(biāo)識(shí)符是ShockwaveFlash.ShockwaveFlash。知道唯一標(biāo)識(shí)符后,就可以編寫下面的函數(shù)來(lái)檢測(cè)

// 檢測(cè)IE中的插件
function hasIEPlugin(name) {
  try {
    new ActiveXObject(name);
    return true
  } catch (ex) {
    return false;
  }
}

//  檢測(cè)flash
console.log(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"));

//  檢測(cè)QuickTime
console.log(hasIEPlugin("QuickTime.QuickTime"));

鑒于兩種方式差別較大,典型的做法是針對(duì)每個(gè)插件分別創(chuàng)建檢測(cè)函數(shù)

// 檢測(cè)所有瀏覽器中的Flash
function hasFlash() {
  var result = hasPlugin("Flash");
  if (!result) {
    result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
  }
  return result;
}

plugins集合有一個(gè)名叫refresh()的方法,用于刷新plugins以反映最新安裝的插件。這個(gè)方法接收一個(gè)參數(shù):表示是否應(yīng)該重新加載頁(yè)面的一個(gè)布爾值。如果將這個(gè)值設(shè)為true,則會(huì)重新加載包含插件的所有頁(yè)面;否則只更新plugins集合,不重新加載頁(yè)面。

注冊(cè)處理程序

registerContentHandler()registerProtocolHandler() 方法可以讓一個(gè)站點(diǎn)知名它可以處理特定類型的信息。隨著RSS閱讀器和在線電子郵件程序的信息,注冊(cè)處理程序就為像使用桌面應(yīng)用程序一樣默認(rèn)使用這些在線應(yīng)用程序提供了一種方式。

registerContentHandler()接收三個(gè)參數(shù):

要處理的MIME類型

可以處理的MIME類型的頁(yè)面的URL

應(yīng)用程序的名稱

// 要將一個(gè)站點(diǎn)注冊(cè)為處理RSS源的處理程序
navigator.registerContentHandler("application/rss+xml",
  "http://www.somereader.com?feed=%s", "Some Reader");

registerProtocolHandler() 也是三個(gè)參數(shù)

要處理的協(xié)議 (mailto 或 ftp)

處理該協(xié)議的頁(yè)面的URL

應(yīng)用程序的名稱

// 要將一個(gè)應(yīng)用程序注冊(cè)為默認(rèn)的郵件客戶端
navigator.registerProtocolHandler("mailto",
  "http://www.somemailclient.com?cmd=%s", "Some Mail Client");
screen對(duì)象

screen對(duì)象基本只用來(lái)表明客戶端的能力,其中包括瀏覽器窗口外部的顯示器信息,如像素寬度和高度等。

用處不大

history對(duì)象

history對(duì)象保存著用戶上網(wǎng)的歷史記錄,從窗口被打開的那一刻算起。因?yàn)?b>history是window對(duì)象的屬性,因此每個(gè)瀏覽器窗口,每個(gè)標(biāo)簽頁(yè),乃至每個(gè)框架都有自己的history對(duì)象與特定的window對(duì)象關(guān)聯(lián)。

出于安全考慮,開發(fā)人員無(wú)法得知用戶瀏覽器過(guò)的URL。不過(guò)借由用戶訪問(wèn)過(guò)的頁(yè)面列表,同樣可以在不知道實(shí)際URL的情況視線后退和前進(jìn)

使用go()方法可以在用戶的歷史記錄中任意跳轉(zhuǎn),可以向前向后,接受一個(gè)參數(shù)整數(shù)值或者字符串。

// 后退一頁(yè)
history.go(-1);

// 前進(jìn)一頁(yè)
history.go(1);

// 前進(jìn)兩頁(yè)
history.go(2);

// 傳入字符串會(huì)跳轉(zhuǎn)到歷史記錄中包含該字符串的第一個(gè)位置
// 如果沒(méi)有包含的記錄,則什么都不做
history.go("wrox.com");

還可以使用兩個(gè)簡(jiǎn)寫方法代替 back()forward()。這兩個(gè)方法模仿瀏覽器的“后退”“前進(jìn)”按鈕

history還有一個(gè)length屬性,保存著歷史記錄的數(shù)量。包括所有的歷史記錄,即所有向前和向后的記錄。對(duì)于加載到窗口、標(biāo)簽頁(yè)或框架中的第一個(gè)頁(yè)面而言,hitosty.length等于0

if (history.length == 0) {
  // 這里應(yīng)該是用戶打開窗口后的第一個(gè)頁(yè)面
  ...
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/109535.html

相關(guān)文章

  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 1~2

    摘要:表示應(yīng)該立即下載腳本,但不應(yīng)妨礙頁(yè)面中的其他操作可選。表示通過(guò)屬性指定的代碼的字符集。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行。實(shí)際上,服務(wù)器在傳送文件時(shí)使用的類型通常是,但在中設(shè)置這個(gè)值卻可能導(dǎo)致腳本被忽略。 第1章 JavaScript 簡(jiǎn)介 雖然JavaScript和ECMAScript通常被人們用來(lái)表達(dá)相同的含義,但JavaScript的含義比ECMA-262要多得多...

    Corwien 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 3

    摘要:本質(zhì)上是由一組無(wú)序名值對(duì)組成的。浮點(diǎn)數(shù)值的最高精度是位小數(shù),但在進(jìn)行計(jì)算時(shí)其精度遠(yuǎn)遠(yuǎn)不如證書。例如這是使用基于數(shù)值的浮點(diǎn)計(jì)算的通病,并非獨(dú)此一家數(shù)值范圍。 函數(shù)名不能使用關(guān)鍵字(typeof不行但typeOf可以,區(qū)分大小寫) 標(biāo)識(shí)符就是指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。 第一個(gè)字符必須是一個(gè)字母、下劃線(_)或者一個(gè)美元符號(hào)($) 其他字符可以是字母、下劃線、美元符號(hào)或...

    renweihub 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 4 變量、作用域和內(nèi)存問(wèn)題

    摘要:具體說(shuō)就是執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊。如果局部環(huán)境中存在著同名的標(biāo)識(shí)符,就不會(huì)使用位于父環(huán)境中的標(biāo)識(shí)符訪問(wèn)局部變量要比訪問(wèn)全局變量更快,因?yàn)椴挥孟蛏纤阉髯饔糜蜴湣? 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數(shù)據(jù)類型:Undefined, Null, Boolean, Number, String ...

    lidashuang 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 7 函數(shù)表達(dá)式

    摘要:定義函數(shù)表達(dá)式的方式有兩種函數(shù)聲明。不過(guò),這并不是匿名函數(shù)唯一的用途。可以使用命名函數(shù)表達(dá)式來(lái)達(dá)成相同的結(jié)果閉包匿名函數(shù)和閉包是兩個(gè)概念,容易混淆。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向通過(guò)改變函數(shù)的執(zhí)行環(huán)境的情況除外。 定義函數(shù)表達(dá)式的方式有兩種: 函數(shù)聲明。它的重要特征就是 函數(shù)聲明提升(function declaration hoisting) 即在執(zhí)行代碼之前會(huì)...

    鄒立鵬 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 11 DOM拓展

    摘要:對(duì)的兩個(gè)主要拓展是選擇和。以下插入標(biāo)記的拓展已經(jīng)納入了規(guī)范。在寫模式下,會(huì)根據(jù)指定的字符串創(chuàng)建新的子樹,然后用這個(gè)子樹完全替換調(diào)用元素。在刪除帶有時(shí)間處理程序或引用了其他對(duì)象子樹時(shí),就有可能導(dǎo)致內(nèi)存占用問(wèn)題。 盡管DOM作為API已經(jīng)非常完善了,但為了實(shí)現(xiàn)更多功能,仍然會(huì)有一些標(biāo)準(zhǔn)或?qū)S械耐卣埂?008年之前,瀏覽器中幾乎所有的拓展都是專有的,此后W3C著手將一些已經(jīng)成為事實(shí)標(biāo)準(zhǔn)的專...

    luck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<