JS Window

JavaScript Window - 瀏覽器對象模型



瀏覽器對象模型 (BOM) 使 JavaScript 有能力與瀏覽器“對話”。


瀏覽器對象模型 (BOM)

瀏覽器對象模型(Browser Object Model)尚無正式標準。
由于現代瀏覽器已經(幾乎)實現了 JavaScript 交互性方面的相同方法和屬性,因此常被認為是 BOM 的方法和屬性。


Window 對象

所有瀏覽器都支持 window 對象。它表示瀏覽器窗口。
所有 JavaScript 全局對象、函數以及變量均自動成為 window 對象的成員。
全局變量是 window 對象的屬性。
全局函數是 window 對象的方法。
甚至 HTML DOM 的 document 也是 window 對象的屬性之一:
window.document.getElementById("header");
與此相同:
document.getElementById("header");


Window 尺寸

有三種方法能夠確定瀏覽器窗口的尺寸(瀏覽器的視口,不包括工具欄和滾動條)。
對于Internet Explorer、Chrome、Firefox、Opera 以及 Safari:

  • window.innerHeight - 瀏覽器窗口的內部高度
  • window.innerWidth - 瀏覽器窗口的內部寬度

對于 Internet Explorer 8、7、6、5:

  • document.documentElement.clientHeight
  • document.documentElement.clientWidth

或者

  • document.body.clientHeight
  • document.body.clientWidth

實用的 JavaScript 方案(涵蓋所有瀏覽器):

實例

var w=window.innerWidth
      || document.documentElement.clientWidth
      || document.body.clientWidth;

var h=window.innerHeight
      || document.documentElement.clientHeight
      || document.body.clientHeight;

親自試一試
<small>該例顯示瀏覽器窗口的高度和寬度:(不包括工具欄/滾動條)


其他 Window 方法

一些其他方法:

  • window.open() - 打開新窗口
  • window.close() - 關閉當前窗口
  • window.moveTo() - 移動當前窗口
  • window.resizeTo() - 調整當前窗口的尺寸</small>

分割線


</br>

JavaScript Window Screen



window.screen 對象包含有關用戶屏幕的信息。


Window Screen

window.screen 對象在編寫時可以不使用 window 這個前綴。
一些屬性:

  • screen.availWidth - 可用的屏幕寬度
  • screen.availHeight - 可用的屏幕高度

Window Screen 可用寬度

screen.availWidth 屬性返回訪問者屏幕的寬度,以像素計,減去界面特性,比如窗口任務欄。

實例
返回您的屏幕的可用寬度:

<script>
  document.write("可用寬度:" +screen.availWidth);
</script>

以上代碼輸出為:

可用寬度:1920

親自試一試


Window Screen 可用高度

screen.availHeight 屬性返回訪問者屏幕的高度,以像素計,減去界面特性,比如窗口任務欄。

實例
返回您的屏幕的可用高度:

<script>
  document.write("可用高度:" +screen.availHeight);
</script>

以上代碼輸出為:

可用高度:1040

親自試一試


分割線


</br>

JavaScript Window History



window.history 對象包含瀏覽器的歷史。


Window History

window.history 對象在編寫時可不使用 window 這個前綴。
為了保護用戶隱私,對 JavaScript 訪問該對象的方法做出了限制。
一些方法:

  • history.back() - 與在瀏覽器點擊后退按鈕相同
  • history.forward() - 與在瀏覽器中點擊按鈕向前相同

Window History Back

history.back() 方法加載歷史列表中的前一個 URL。
這與在瀏覽器中點擊后退按鈕是相同的:

實例
在頁面上創建后退按鈕:

<html>
  <head>
    <script>
      function goBack() {
        window.history.back()
      }
    </script>
  </head>
  <body>
    <input type="button" value="Back" onclick="goBack()">
  </body>
</html>

以上代碼輸出為:

轉到上一頁

Window History Forward

history forward() 方法加載歷史列表中的下一個 URL。
這與在瀏覽器中點擊前進按鈕是相同的:

實例
在頁面上創建一個向前的按鈕:

<html>
  <head>
    <script>
      function goForward() {
        window.history.forward()
      }
    </script>
  </head>
  <body>
    <input type="button" value="Forward" onclick="goForward()">
  </body>
</html>

以上代碼輸出為:

轉到下一頁

分割線


</br>

JavaScript Window Navigator



window.navigator 對象包含有關訪問者瀏覽器的信息。


Window Navigator

window.navigator 對象在編寫時可不使用 window 這個前綴。

實例

  <div id="example"></div>

  <script>
    txt = "<p>Browser CodeName: " + navigator.appCodeName + "</p>";
    txt+= "<p>Browser Name: " + navigator.appName + "</p>";
    txt+= "<p>Browser Version: " + navigator.appVersion + "</p>";
    txt+= "<p>Cookies Enabled: " + navigator.cookieEnabled + "</p>";
    txt+= "<p>Platform: " + navigator.platform + "</p>";
    txt+= "<p>User-agent header: " + navigator.userAgent + "</p>";txt+= "<p>User-agent language: " + navigator.systemLanguage + "</p>";
    document.getElementById("example").innerHTML=txt;
  </script>

親自試一試
警告:來自 navigator 對象的信息具有誤導性,不應該被用于檢測瀏覽器版本,這是因為:

  • navigator 數據可被瀏覽器使用者更改
  • 瀏覽器無法報告晚于瀏覽器發布的新操作系統

瀏覽器檢測
由于 navigator 可誤導瀏覽器檢測,使用對象檢測可用來嗅探不同的瀏覽器。
由于不同的瀏覽器支持不同的對象,您可以使用對象來檢測瀏覽器。例如,由于只有 Opera 支持屬性 "window.opera",您可以據此識別出 Opera。
例子:if (window.opera) {...some action...}


分割線


</br>

JavaScript 消息框(JS PopupAlert)



可以在 JavaScript 中創建三種消息框:警告框、確認框、提示框。


實例
警告框:alert("我是警告框!!")
帶有折行的警告框:alert("再次向您問好!在這里,我們向您演示" + '\n' + "如何向警告框添加折行。")
確認框:confirm("Press a button!");
提示框:prompt("請輸入您的名字","Bill Gates")


警告框
警告框經常用于確保用戶可以得到某些信息。
當警告框出現后,用戶需要點擊確定按鈕才能繼續進行操作。
語法:
alert("文本")


確認框
確認框用于使用戶可以驗證或者接受某些信息。
當確認框出現后,用戶需要點擊確定或者取消按鈕才能繼續進行操作。
如果用戶點擊確認,那么返回值為 true。如果用戶點擊取消,那么返回值為 false。
語法:
confirm("文本")


提示框
提示框經常用于提示用戶在進入頁面前輸入某個值。
當提示框出現后,用戶需要輸入某個值,然后點擊確認或取消按鈕才能繼續操縱。
如果用戶點擊確認,那么返回值為輸入的值。如果用戶點擊取消,那么返回值為 null。
語法:
prompt("文本","默認值")


分割線


</br>

JavaScript 計時(JS Timing)



通過使用 JavaScript,我們有能力做到在一個設定的時間間隔之后來執行代碼,而不是在函數被調用后立即執行。我們稱之為計時事件。


實例
<small>簡單的計時
單擊本例中的按鈕后,會在 5 秒后彈出一個警告框。
另一個簡單的計時
本例中的程序會執行 2 秒、4 秒和 6 秒的計時。
在一個無窮循環中的計時事件
在本例中,單擊開始計時按鈕后,程序開始從 0 以秒計時。
帶有停止按鈕的無窮循環中的計時事件
在本例中,點擊計數按鈕后根據用戶輸入的數值開始倒計時,點擊停止按鈕停止計時。
使用計時事件制作的鐘表
一個 JavaScript 小時鐘
</small>


JavaScript 計時事件
通過使用 JavaScript,我們有能力作到在一個設定的時間間隔之后來執行代碼,而不是在函數被調用后立即執行。我們稱之為計時事件。
在 JavaScritp 中使用計時事件是很容易的,兩個關鍵方法是:
setTimeout()
未來的某時執行代碼
clearTimeout()
取消setTimeout()


setTimeout()
語法

var t=setTimeout("javascript語句",毫秒)
setTimeout() 方法會返回某個值。在上面的語句中,值被儲存在名為 t 的變量中。假如你希望取消這個 setTimeout(),你可以使用這個變量名來指定它。
setTimeout() 的第一個參數是含有 JavaScript 語句的字符串。這個語句可能諸如 "alert('5 seconds!')",或者對函數的調用,諸如 alertMsg()"。
第二個參數指示從當前起多少毫秒后執行第一個參數。
提示:1000 毫秒等于一秒。

實例
當下面這個例子中的按鈕被點擊時,一個提示框會在5秒中后彈出。

<html>
  <head>
    <script type="text/javascript">
      function timedMsg() {
        var t=setTimeout("alert('5 seconds!')",5000)

      }
    </script>
  </head>
  <body>
    <form>
      <input type="button" value="Display timed alertbox!" onClick="timedMsg()">
    </form>
  </body>
</html>

實例 - 無窮循環
要創建一個運行于無窮循環中的計時器,我們需要編寫一個函數來調用其自身。在下面的例子中,當按鈕被點擊后,輸入域便從 0 開始計數。

<html>
  <head>
    <script type="text/javascript">
      var c=0var tfunction timedCount() { 
        document.getElementById('txt').value=c 
        c=c+1
        t=setTimeout("timedCount()",1000)
      }
    </script>
  </head>  
  <body>
    <form>
      <input type="button" value="Start count!" onClick="timedCount()">
      <input type="text" id="txt">
    </form>
  </body>
</html>

clearTimeout()
語法

clearTimeout(setTimeout_variable)

實例
下面的例子和上面的無窮循環的例子相似。唯一的不同是,現在我們添加了一個 "Stop Count!" 按鈕來停止這個計數器:

<html>
  <head>
    <script type="text/javascript">
      var c=0var tfunction timedCount() { 
        document.getElementById('txt').value=c 
        c=c+1
        t=setTimeout("timedCount()",1000)
      }

      function stopCount() {
        clearTimeout(t)
      }
    </script>
  </head>
  <body>
    <form>
      <input type="button" value="Start count!" onClick="timedCount()">
      <input type="text" id="txt">
      <input type="button" value="Stop count!" onClick="stopCount()">
    </form>
  </body>
</html>

分割線

JavaScript Cookies



cookie 用來識別用戶。


實例
創建一個歡迎 cookie
利用用戶在提示框中輸入的數據創建一個 JavaScript Cookie,當該用戶再次訪問該頁面時,根據 cookie 中的信息發出歡迎信息。


什么是cookie?
cookie 是存儲于訪問者的計算機中的變量。每當同一臺計算機通過瀏覽器請求某個頁面時,就會發送這個 cookie。你可以使用 JavaScript 來創建和取回 cookie 的值。


有關cookie的例子:

名字 cookie

  • 當訪問者首次訪問頁面時,他或她也許會填寫他/她們的名字。名字會存儲于 cookie 中。當訪問者再次訪問網站時,他們會收到類似 "Welcome John Doe!" 的歡迎詞。而名字則是從 cookie 中取回的。

密碼 cookie

  • 當訪問者首次訪問頁面時,他或她也許會填寫他/她們的密碼。密碼也可被存儲于 cookie 中。當他們再次訪問網站時,密碼就會從 cookie 中取回。

日期 cookie

  • 當訪問者首次訪問你的網站時,當前的日期可存儲于 cookie 中。當他們再次訪問網站時,他們會收到類似這樣的一條消息:"Your last visit was on Tuesday August 11, 2005!"。日期也是從 cookie 中取回的。

創建和存儲 cookie
在這個例子中我們要創建一個存儲訪問者名字的 cookie。當訪問者首次訪問網站時,他們會被要求填寫姓名。名字會存儲于 cookie 中。當訪問者再次訪問網站時,他們就會收到歡迎詞。
首先,我們會創建一個可在 cookie 變量中存儲訪問者姓名的函數:

function setCookie(c_name,value,expiredays){
  var exdate=new Date()
  exdate.setDate(exdate.getDate()+expiredays)
  document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

上面這個函數中的參數存有 cookie 的名稱、值以及過期天數。
在上面的函數中,我們首先將天數轉換為有效的日期,然后,我們將 cookie 名稱、值及其過期日期存入 document.cookie 對象。
之后,我們要創建另一個函數來檢查是否已設置 cookie:

function getCookie(c_name){
  if (document.cookie.length>0) { 
    c_start=document.cookie.indexOf(c_name + "=") 
    if (c_start!=-1) { 
      c_start=c_start + c_name.length+1 
      c_end=document.cookie.indexOf(";",c_start) 
      if (c_end==-1) c_end=document.cookie.length 
      return unescape(document.cookie.substring(c_start,c_end))             
    } 
  }
return ""
}

上面的函數首先會檢查 document.cookie 對象中是否存有 cookie。假如 document.cookie 對象存有某些 cookie,那么會繼續檢查我們指定的 cookie 是否已儲存。如果找到了我們要的 cookie,就返回值,否則返回空字符串。

最后,我們要創建一個函數,這個函數的作用是:如果 cookie 已設置,則顯示歡迎詞,否則顯示提示框來要求用戶輸入名字。

function checkCookie(){
  username=getCookie('username')
  if (username!=null && username!="") {
    alert('Welcome again '+username+'!')}
  else { 
    username=prompt('Please enter your name:',"") 
    if (username!=null && username!="") { 
      setCookie('username',username,365) 
    } 
  }
}

這是所有的代碼:

<html>
  <head>
    <script type="text/javascript">

      function getCookie(c_name){
        if (document.cookie.length>0) { 
          c_start=document.cookie.indexOf(c_name + "=") 
          if (c_start!=-1) { 
            c_start=c_start + c_name.length+1 
            c_end=document.cookie.indexOf(";",c_start) 
            if (c_end==-1) c_end=document.cookie.length 
            return unescape(document.cookie.substring(c_start,c_end)) 
          } 
        }
      return ""
      }

      function setCookie(c_name,value,expiredays){
        var exdate=new Date()
        exdate.setDate(exdate.getDate()+expiredays)
        document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
      }

      function checkCookie(){
        username=getCookie('username')
        if (username!=null && username!="") {
          alert('Welcome again '+username+'!')}
        else { 
          username=prompt('Please enter your name:',"") 
          if (username!=null && username!="") { 
            setCookie('username',username,365) 
          }
        }
      }

    </script>
  </head>

  <body onLoad="checkCookie()">
  </body>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容