JavaScript进行BOM操作

作者:Kinglong    发表时间:2023-07-15 09:13   

关键词:  

JavaScript通过用于操作BOM和DOM对象,来实现对浏览器、窗口及页面的控制。

1.Bom简介

Bom即浏览器对象模型(BrowserObjectModel)。

观察BOM的体系结构,所有的对象都源自window对象,它表示整个浏览器窗口。

documentwindow的子对象window可理解为浏览器窗口,document可理解为文档,就是网页。

没有框架的情况下,一个window里只有一个document;在有框架的情况下,iframe里面也可以装个document,如在iframe里面的document.location和window.location不同的。

2.Bom操作简介

浏览器的对象模型特性,允许访问和操控浏览器窗口。通过使用BOM,可移动窗口、更改状态栏文本、执行其它不与页面内容发生直接联系的操作。

BOM是JavaScript应用中唯一没有相关标准的部分,这是BOM真正独特且经常出现问题的所在。 BOM主要处理浏览器窗口与框架,事实上,浏览器特有的JavaScript扩展都被认作是BOM的一部分,这些扩展包括:

1.弹出新浏览器窗口的能力;

2.移动、关闭和更改浏览器窗口大小的能力;

3.可提供WEB浏览器详细信息的navigator对象;

4.可提供浏览器载入页面详细信息的location对象;

5.可提供用户屏幕分辨率详细信息的screen对象;

6.支持Cookies;

7.IE对BOM进行扩展的ActiveX对象类,可以通过JavaScript来实现ActiveX对象。

3.window对象操作

window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的。

window可以看做浏览器,通过js可以操作Bom对象。

通常说的BOM操作,特指的对window对象,指不与页面内容(即DOM部分)发生直接联系的部分。

格式:

[window.]属性
[window.]方法(参数)
opener.属性
opener.方法(参数)
self.属性
self.方法(参数)
parent.属性
parent.方法(参数)
top.属性
top.方法(参数)
窗口名称.属性
窗口名称.方法(参数)

窗口对象属性:

document

当前文件的信息

location

当前URL的信息

name

窗口名称

status

状态栏的临时信息

defaultStatus

状态栏默认信息

history

该窗口最近查阅过的网页

closed

判断窗口是否关闭,返回布尔值

opner

open方法打开的窗口的源窗口

outerHeight

窗口边界的垂直尺寸,px

outerWidth

窗口边界的水平尺寸,px

pageXOffset

网页x-position的位置

pageYOffset

网页y-position的位置

innerHeight

窗口内容区的垂直尺寸,px

innerWidth

窗口内容区的水平尺寸,px

screenX

窗口左边界的X坐标

screenY

窗口上边界的Y坐标

self

当前窗口

top

最上方的窗口

parent

当前窗口或框架的框架组

frames

对应到窗口中的框架

length

框架的个数

locationbar

浏览器地址栏

menubar

浏览器菜单栏

scrollbars

浏览器滚动条

statusbar

浏览器状态栏

toolbar

浏览器工具栏

offscreenBuffering

是否更新窗口外的区域

窗口对象的方法:

alert(信息字串)

弹出警告信息

confirm(信息字串)

显示确认信息对话框

prompt(提示字串[,默认值])

显示提示信息,并提供可输入的字段

atob(译码字串)

对base-64编码字串进行译码

btoa(字串)

将进行base-64编码

back()

回到历史记录的上一网页

forward()

加载历史记录中的下一网页

open(URL,窗口名称[,窗口规格])

 

focus()

焦点移到该窗口

blur()

窗口转成背景

stop()

停止加载网页

close()

关闭窗口

enableExternalCapture()

允许有框架的窗口获取事件

disableExternalCapture()

关闭enableExternalCapture()

captureEvents(事件类型)

捕捉窗口的特定事件

routeEvent(事件)

传送已捕捉的事件

handleEvent(事件)

使特定事件的处理生效

releaseEvents(事件类型)

释放已获取的事件

moveBy(水平点数,垂直点数)

相对定位

moveTo(x坐标,y坐标)

绝对定位

setResizable(true|false)

是否允许调整窗口大小

resizeBy(水平点数,垂直点数)

相对调整窗口大小

resizeTo(宽度,高度)

绝对调整窗口大小

scroll(x坐标,y坐标)

绝对滚动窗口

scrollBy(水平点数,垂直点数)

相对滚动窗口

scrollTo(x坐标,y坐标)

绝对滚动窗口

setInterval(表达式,毫秒)

 

setTimeout(表达式,毫秒)

 

clearInterval(定时器对象)

 

clearTimeout(定时器对象)

 

home()

进入浏览器设置的主页

find([字串[,caseSensitivr,backward]])

查找窗口中特定的字串

print()

 

setHotKeys(true|false)

激活或关闭组合键

setZOptions()

设置窗口重叠时的堆栈顺序

创建窗口对象的参数:

     window.open(url,windowName,windowFeature)

     例如:window.open(url,"新窗体","menubar=yes")

     windowFeature可能的值:

alwaysLowered

是否将窗口显示的堆栈后推一层

alwaysRaised

是否将窗口显示的堆栈上推一层

dependent

是否将该窗口与当前窗口产生依存关系

fullscreen

是否满屏显示

directories

是否显示连接工具栏

location

是否显示网址工具栏

menubar

是否显示菜单工具栏

scrollbars

是否显示滚动条

status

是否显示状态栏

titlebar

是否显示标题栏

toolbar

是否显示标准工具栏

resizable

是否可以改变窗口的大小

screenX

窗口左边界距离

screenY

窗口上边界距离

top

窗口上边界

width

窗口宽度

height

窗口高度

left

窗口左边界

outerHeight

窗口外边界的高度

personalbar

是否显示个人工具栏

窗口对象的事件处理程序:

onLoad、onUnload

onResize

onBlur、onFocus

onDragDrop

onError

onMove

3.1窗体控制

1窗体移动和缩放

moveBy(x,y)——从当前位置水平移动窗体x个像素,垂直移动窗体y个像素,x为负数,将向左移动窗体,y为负数,将向上移动窗体 
moveTo(x,y)——移动窗体左上角到相对于屏幕左上角的(x,y)点,当使用负数做为参数时会吧窗体移出屏幕的可视区域 
resizeBy(w,h)——相对窗体当前的大小,宽度调整w个像素,高度调整h个像素。如果参数为负值,将缩小窗体,反之扩大窗体 
resizeTo(w,h)——把窗体宽度调整为w个像素,高度调整为h个像素 

2) 窗体滚动轴控制 

scrollBy(x,y)—— 如果有滚动条,将横向滚动条移动到相对于当前横向滚动条的x个像素的位置(就是向左移动x像素),将纵向滚动条移动到相对于当前纵向滚动条高度为y个像素的位置(就是向下移动y像素) 

scrollTo(x,y)——在窗体中如果有滚动条,将横向滚动条移动到相对于窗体宽度为x个像素的位置,将纵向滚动条移动到相对于窗体高度为y个像素的位置 

3) 窗体焦点控制

focus()——使窗体或控件获取焦点 
blur()——与focus函数相反,使窗体或控件失去焦点

4) 窗体创建和关闭

open()——打开(弹出)一个新的窗体 
close()——关闭窗体 
opener属性——新建窗体中对父窗体的引用,中文"开启者"的意思 

window.open方法语法 

window.open(url, name, features, replace); 
•url -- 要载入窗体的URL 
•name -- 新建窗体的名称(目标,将在a 标签的target属性中用到,当与已有窗体名称相同时将覆盖窗体内容).open函数默认的打开窗体的方式为target的_blank弹出方式,因此页面都将以弹出的方式打开 
•features -- 代表窗体特性的字符串,字符串中每个特性使用逗号分隔 
•replace -- 一个布尔值,说明新载入的页面是否替换当前载入的页面,通常不用指定 

window.open("HTMLPage2.htm", "", "toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0");

可以用 window.open 的方法屏蔽 IE 的所有菜单

第一种方法:

  window.open("你的.htm", "","toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0")

第二种方法是打开一个全屏的页面:

  window.open("你的.html", "", "fullscreen=yes")

5) 窗体的刷新

<input type=button value=刷新 onclick="history.go(0)">

<input type=button value=刷新 onclick="location.reload()">

<input type=button value=刷新 onclick="location=location">

<input type=button value=刷新 onclick="location.assign(location)">

<input type=button value=刷新 onclick="document.execCommand('Refresh')">

<input type=button value=刷新 onclick="window.navigate(location)">

<input type=button value=刷新 onclick="location.replace(location)">

<input type=button value=刷新 onclick="window.open('自身的文件','_self')">

<input type=button value=刷新 onClick=document.all.WebBrowser.ExecWB(22,1)>

3.2窗体间相互调用

1window.open产生的调用

在子窗口中引用父窗口:window.opener

在子窗口中引用父窗口的函数:window.opener.funcofparent();

注:funcofparent父窗口里的js函数。

2框架中产生的调用

在子窗口中引用父窗口:window.parent

在父窗口中引用子窗口(前提是子窗口已Load done):document.getElementById("子窗口所在的框架ID").contentWindow

3) window.showModalDialog产生的调用

父窗口:window.showModalDialog("子窗口.aspx",window,"dialogWidth=500px;dialogHeight=300px");

子窗口可得到父窗口的引用:var pWin=window.dialogArguments;

注意:FF3开始支持showModalDialog

3.3 window的功能函数

  alert();
  confirm();
  setInterval() 
  setTimeout()  
  clearTimeout()

1) confirm

window.onunload = function() {

      alert("页面已经关闭");

}

window.onbeforeunload = function() {

      alert("页面即将关闭");

}

window.onload = function(){

       document.getElementById("btn1").onclick = function(){

        var isRight = window.confirm("你确定要跳转吗");

         if(isRight){

                 window.location.href="./2 innerHTML无刷新评论.htm";

         }

    }

}

2) setInterval和clearInterval

setInterval方法每隔一段时间执行计时器的代码。

 

启动和停止定时器

var interId;

window.onload = function (){

      interId = setInterval(getValue,1000);

      document.getElementById("btn1").onclick = function(){

           if(interId!=null){

                clearInterval(interId);

          }

};

document.getElementById("btn2").onclick = function(){

          interId = setInterval(getValue,1000);

     };

}

可用来实现走马灯效果:

3) setTimeoutclearTimeout

onhover事件中的div层的显示消失:

setTimeout方法经过计划时间后后计时器的代码(只执行一次)。

var action;

 function groupMouseOver(group) {

    var id = 'g' + $(group).attr("alt");

    var divdetails = document.getElementById(id);

    var newId = "s" + $(group).attr("alt")

    var divshow = $(divdetails).clone().appendTo($("#tree")).attr("id", newId).css("position", "fixed").css("right", 5 + "px").css("top", (event.clientY - 10) + "px");

     action = setTimeout($(divshow).show(), 1500);//启动定时器

}

function groupMouseOut(group) {

    var id = 's' + $(group).attr("alt");

      if (action) {

              clearTimeout(action);//取消定时器

      }

      setTimeout($("#" + id).remove(), 200);

 }

4) resize保持DIV位于Body底部

$(window).resize(function () {

            onResize();

});

     function onResize() {

            var height = $(document).height();

            $("#record").height(height  - 48);

        }

       record 随着window高度的变化而变化,48是预留给底部和顶部的固定空间。

5) 相对window.external自适应大小

        $(function () {

            resize();

            $(window).resize(function () {

                resize();

            });

        });

        function resize() {

            var width = window.external.Width;

            var height = window.external.Height;

            $('#centerdiv').css({ "height": height - 120 });

            $('#bigdiv').css({ "width": width - 5 });

        }

3.4 window对象的事件

window.onLoad

window.onUnload

window.onResize

window.onBlur

window.onFocus

window.onDragDrop

window.onError

window.onMove

1) onblur和onfocus

window.onblur和window.onfocus事件,在FireFox、Opera、Chrome、Safari下就非常正确,但在IE就根本不正常。

IE下,焦点从body和其它元素例如input、textarea切换时,IE竟然触发window.onblur或者window.onfocus事件。

失去焦点是因为切换到别的应用程序或别的web页面。

处理:

window.onblur = function (e) {

    e = e || window.event;

    if (window.ActiveXObject && /MSIE/.test(navigator.userAgent)) {  //IE

        var x = e.clientX;

        var y = e.clientY;

        var w = document.body.clientWidth;

        var h = document.body.clientHeight;

        if (x >= 0 && x <= w && y >= 0 && y <= h) {

            window.focus();

            return false;

        }

       alert("out");

    }

}

2) onload与$(function(){})

$(function(){})先于onload

1. 自然是执行的时候不同。jq的是在DOM加载完毕开始执行(页面所有代码). 而window.onload是在页面全部内容,什么代码, 文件, 图片, flash等等乱七八糟的加载完毕, 开始执行..

2. $(function(){})可以写多个,但是window.onload只能写一个,各种函数要可以写在window.onload=function(){//这里..}

3. window.onload = demo()跟window.onload=demo的区别:前者的window.onload是demo()这个函数的结果,后者是引用demo这个函数.

4. $(function(){}).它其实不是它.它是jQuery(document).ready(function(){})的简写;window.onload很单纯,很纯粹,没有简写。

window.onload 事件是窗口完全加载完的时候执行
$(function(){ })  是等页面上的标签加载完了就执行

比如说页面有个<img />标签,加载页面时,window.onload 要等图片完全显示出来之后才执行(假设其他代码都在图片显示之前加载完了);

而 $(function(){ })  等<img />标签加载完就执行了,这时候图片可能还没有显示出来。

3.5 window对象的属性

navigator.userAgent

获取客户端硬件类型,如果是ipad 并且非强制传统版做相应处理

if (navigator.userAgent.indexOf('iPad')>=0 && !window.isForce2pc) {

}

window.location.search

location.search是从当前URL的?号开始的字符串

如:http://www.51js.com/viewthread.php?tid=22720 它的search就是?tid=22720

通过下面这个函数就可以取到连接后面带的参数。

function getQueryString(name) {

            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");

            var r = window.location.search.substr(1).match(reg);

            if (r != null)

                return unescape(r[2]);

            return null;

        }

使用 unescape() 来解码字符串。ECMAScript v3 已从标准中删除了 unescape() 函数,并反对使用它,因此应该用 decodeURI() 和 decodeURIComponent() 取而代之.

 

var QueryString = (function ()
{
    var vs = window.location.search.slice(1);
    if (vs == '') return {};
    var result = {};
    var va = vs.split("&");
    for (var i = 0; i < va.length; i++)
    {

        var s = va[i].split("=");   
        var k = s[0];
        var v = s[1];
        result[k] = v;
    }
    return result;
})();