JavaScript客户端操作

BOM(browser object model)是浏览器对象模型的简称,被广泛应用于Web开发中,主要用于对客户端浏览器的管理。BOM的概念比较古老,但是一直没有被标准化,不过各主流浏览器均支持BOM,都遵守最基本的规则和用法,W3C也将BOM的主要内容纳入HTML5规范。

1、window对象

Window是客户端浏览器对象模型的基类,window对象是客户端JavaScript的全局对象。一个window对象实际上就是一个独立的窗口,对于框架页面来说,浏览器窗口中每个框架都包含一个window对象。

1.1、全局作用域

在客户端浏览器中,window对象是访问BOM的接口,如引用document对象的document属性,引用自身的window和self属性等,同时window也为客户端JavaScript提供全局作用域。

【示例】由于window是全局对象,因此所有的全局变量都被解析为该对象的属性:

    var a = "window.a";        //全局变量
    function f(){              //全局函数
        console.log(a);
    }
    console.log(window.a);     //返回字符串“window.a”
    window.f();                //返回字符串“window.a”

注意:使用delete运算符可以删除属性,但是不能够删除变量。

1.2、访问客户端对象

使用window对象可以访问客户端的其他对象,这种关系构成浏览器的对象模型,window对象代表根节点,每个对象说明如下:

  • window:客户端JavaScript顶层对象。每当<body><frameset>标签出现时,window对象就会被自动创建。
  • navigator :包含客户端有关浏览器的信息。
  • screen:包含客户端屏幕的信息。
  • history:包含浏览器窗口访问过的URL信息。
  • location:包含当前网页文档的URL信息。
  • document :包含整个HTML文档,可被用来访问文档内容及其所有页面元素。

1.3、实现人机交互

window对象定义了3种人机交互的方法,主要方便对JavaScript代码进行测试。

  • alert():确定提示框。由浏览器向用户弹出提示性信息,该方法包含一个可选的提示信息参数。如果没有指定参数,则弹出一个空的对话框。
  • confirm():选择提示框。由浏览器向用户弹出提示性信息,弹出的对话框中包含两个按钮,分别表示“确定”和“取消”。如果单击“确定”按钮,则该方法将返回true;单击“取消”按钮,则返回false。confirm()方法包含一个可选的提示信息参数,如果没有指定参数,则弹出一个空的对话框。
  • prompt():输入提示框。可以接收用户输入的信息,并返回输入的信息。prompt()方法包含一个可选的提示信息参数,如果没有指定参数,则弹出一个没有提示信息的输入文本对话框。

【示例】演示综合调用window对象定义的3种人机交互方法,设计一个人机交互的对话框:

    var user = prompt("请输入你的用户名:");
    if( ! ! user){                                                           //把输入的信息转换为布尔值
        var ok = confirm("你输入的用户名为:\n" + user + "\n请确认。");      //输入信息确认
        if(ok){
            alert("欢迎你:\n" + user );
        }
        else{                                                                //重新输入信息
            user = prompt("请重新输入你的用户名:");
            alert("欢迎你:\n" + user );
        }
    }else {                                                                  //提示输入信息
        user = prompt("请输入你的用户名:");
    }

这3种方法仅接收纯文本信息,忽略HTML字符串,只能使用空格、换行符和各种符号格式化提示对话框中的显示文本。提示,不同浏览器对于这3个对话框的显示效果略有不同。

注意:显示系统对话框的时候,JavaScript代码会停止执行,只有当关闭对话框之后,JavaScript代码才会恢复执行。因此,不建议在实战中使用这3种方法,其仅作为开发人员的内测工具。

1.4、打开窗口

使用window对象的open()方法,可以打开一个新窗口,用法如下:

    window.open(URL,name,features,replace)

参数说明如下:

  • URL:可选字符串,声明在新窗口中显示网页文档的URL。如果省略或者为空,则新窗口就不会显示任何文档。
  • name:可选字符串,声明新窗口的名称。这个名称可以用作标记<a><form>的target目标值。如果该参数指定了一个已经存在的窗口,那么open()方法就不再创建一个新窗口,而只是返回对指定窗口的引用,在这种情况下,features参数将被忽略。
  • features:可选字符串,声明新窗口要显示的标准浏览器的特征。如果省略该参数,新窗口将具有所有标准特征。
  • replace:可选的布尔值,规定了装载到窗口的URL是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。

该方法返回值为新创建的window对象,使用它可以引用新创建的窗口。

新创建的window对象拥有一个opener属性,引用打开它的原始窗口对象。opener只在弹出窗口的最外层window对象(top)中定义,而且指向调用window.open()方法的窗口或框架。

【示例1】演示打开的窗口与原窗口之间的关系:

    win=window.open();                                   //打开新的空白窗口
    win.document.write("<h1>这是新打开的窗口</h1>");     //在新窗口中输出提示信息
    win.focus();                                         //让原窗口获取焦点
    win.opener.document.write("<h1>这是原来窗口</h1>");  //在原窗口中输出提示信息
    console.log( win.opener == window);                  //检测window.opener属性值

使用window的close()方法可以关闭一个窗口。例如,关闭一个新创建的win窗口,可以使用下面方法实现:

    win.close;

如果在打开窗口内部关闭自身窗口,则应该使用下面的方法:

    window.close;

使用window.closed属性可以检测当前窗口是否关闭,如果关闭则返回true,否则返回false。

1.5、控制窗口

window对象定义了3组方法分别用来调整窗口位置、大小和滚动条的偏移位置:moveTo()、moveBy()、resizeTo()、resizeBy()、scrollTo()和scrollBy()。

这些方法都包含两个参数,分别表示x轴偏移值和y轴偏移值。包含To字符串的方法都是绝对的,也就是x和y是绝对位置、大小或滚动偏移。包含By字符串的方法都是相对的,也就是它们在窗口的当前位置、大小或滚动偏移上增加所指定的参数x和y的值。

方法moveTo()可以将窗口的左上角移动到指定的坐标,方法moveBy()可以将窗口上移、下移或者左移、右移指定数量的像素。方法resizeTo()和resizeBy()可以按照相对数量和绝对数量调整窗口的大小。

【示例】将当前浏览器窗口的大小重新设置为宽200px、高200px,然后生成一个任意数字随机定位窗口在屏幕中的显示位置:

    window.onload = function(){
        timer = window.setInterval("jump()", 1000);
    }
    function jump(){
        window.resizeTo(200, 200)
        x = Math.ceil(Math.random() * 1024)
        y = Math.ceil(Math.random() * 760)
        window.moveTo(x, y)
    }

提示:window对象定义了focus()和blur()方法,用来控制窗口的显示焦点。调用focus()方法会请求系统将键盘焦点赋予窗口,调用blur()方法则会放弃键盘焦点。

2、navigator对象

navigator对象存储了与浏览器相关的基本信息,如名称、版本和系统等。通过window.navigator可以引用该对象,并利用它的属性读取客户端的基本信息。

2.1、浏览器检测方法

检测浏览器类型的方法有两种:特征检测法和字符串检测法。这两种方法都存在各自的优点与缺点,用户可以根据需要酌情选择。

1.特征检测法

特征检测法就是根据浏览器是否支持特定功能决定相应操作的方式。这是一种非精确判断法,却是最安全的检测方法。准确检测浏览器的类型和型号是一件很困难的事情,而且很容易存在误差。如果不关心浏览器的身份,仅仅在意浏览器的执行能力,那么使用特征检测法就完全可以满足需要。

【示例1】检测当前浏览器是否支持document.getElementsByName特性。如果支持,就使用该方法获取文档中的a元素;否则再检测是否支持document.getElementsByTagName特性。如果支持就使用该方法获取文档中的a元素:

    if(document.getElementsByName){            //如果存在,则使用该方法获取a元素
        var a = document.getElementsByName("a");
    }
    else if(document.getElementsByTagName){    //如果存在,则使用该方法获取a元素
        var a = document.getElementsByTagName("a");
    }

当使用一个对象、方法或属性时,先判断它是否存在。如果存在,则说明浏览器支持该对象、方法或属性,那么就可以放心使用。

2.字符串检测法

客户端浏览器每次发送HTTP请求时,都会附带一个user-agent(用户代理)字符串。对于Web开发人员来说,可以使用用户代理字符串检测浏览器类型。

【示例2】BOM在navigator对象中定义了userAgent属性,利用该属性可以捕获客户端user-agent字符串信息:

    var s = window.navigator.userAgent;
    //简写方法
    var s = navigator.userAgent;
    console.log(s);
    //返回类似信息:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C;
InfoPath.3; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)

user-agent字符串包含Web浏览器的大量信息,如浏览器的名称和版本。

注意:对于不同浏览器来说,该字符串所包含的信息也不尽相同。随着浏览器版本的不断升级,返回的user-agent字符串的格式和信息也会不断变化。

2.2、检测浏览器类型和版本号

检测浏览器类型和版本比较容易,用户只需要根据不同浏览器类型匹配特殊信息即可。

【示例1】检测主流浏览器类型,包括IE、Opera、Safari、Chrome和Firefox:

    var ua = navigator.userAgent.toLowerCase();           // 获取用户端信息
    var info ={
        ie : /msie/.test(ua) && !/opera/.test(ua),        //匹配IE浏览器
        op : /opera/.test(ua),                            //匹配Opera浏览器
        sa : /version.*safari/.test(ua),                  //匹配Safari浏览器
        ch : /chrome/.test(ua),                           //匹配Chrome浏览器
        ff : /gecko/.test(ua) && !/webkit/.test(ua)       //匹配Firefox浏览器
    };

在脚本中调用该对象的属性,如果为true,说明为对应类型浏览器,否则就返回false:

    (info.ie) && console.log("IE浏览器");
    (info.op) && console.log("Opera浏览器");
    (info.sa) && console.log("Safari浏览器");
    (info.ff) && console.log("Firefox浏览器");
    (info.ch) && console.log("Chrome浏览器");

【示例2】通过解析navigator对象的userAgent属性,可以获得浏览器的完整版本号。针对IE浏览器来说,它是在MSIE字符串后面带一个空格,然后跟随版本号及分号。因此,可以设计一个如下的函数获取IE的版本号:

    //获取IE浏览器的版本号
    //返回数值,显示IE的主版本号
    function getIEVer(){
        var ua = navigator.userAgent;                               //获取用户端信息
        var b = ua.indexOf("MSIE ");                                //检测特殊字符串MSIE的位置
        if(b < 0){
            return 0;
        }
        return parseFloat(ua.substring(b + 5, ua.indexOf(";", b))); //截取版本号,并转换为数值
    }

直接调用该函数即可获取当前IE浏览器的版本号:

    console.log(getIEVer());                 //返回类似数值:10

E浏览器的版本众多,一般可以使用大于某个数字的形式进行范围匹配,因为浏览器是向后兼容的,使用是否等于某个版本显然不能适应新版本的需要。

【示例3】利用同样的方法可以检测其他类型浏览器的版本号,下面的函数是检测Firefox浏览器的版本号:

    function getFFVer(){
        var ua = navigator.userAgent;
        var b = ua.indexOf("Firefox/");
        if(b < 0){
            return 0;
        }
        return  parseFloat(ua.substring(b + 8,ua.lastIndexOf("\.")));
    }
    console.log(getFFVer());                        //返回类似数值:64

对于Opera等浏览器,可以使用navigator.userAgent属性获取版本号,只不过其用户端信息与IE有所不同,如Opera/9.02(Windows NT 5.1; U; en),根据这些格式可以获取其版本号。

注意:如果浏览器的某些对象或属性不能向后兼容,这种检测方法也容易产生问题。所以更稳妥的方法是采用特征检测法,而不是使用字符串检测法。

2.3、检测操作系统

navigator.userAgent返回值一般都会包含操作系统的基本信息,不过这些信息比较散乱,没有统一的规则。用户可以检测一些更为通用的信息,如检测是否为Windows系统,或者为Macintosh系统,而不去分辨操作系统的版本号。

例如,如果仅检测通用信息,那么所有Windows版本的操作系统都会包含“Win”字符串,所有Macintosh版本的操作系统都包含“Mac”字符串,所有UNIX版本的操作系统都包含“X11”字符串,而Linux操作系统会同时包含“X11”和“Linux”字符串。

【示例】通过下面的方法可以快速检测客户端信息中是否包含上述字符串:

    ['Win', 'Mac', 'X11', 'Linux'].forEach(function(t) {
        ( t === 'X11') ? t = 'Unix' : t;                  //处理Unix系统的字符串
        navigator['is' +  t] = function () {              //为navigator对象扩展专用系统检测方法
            return navigator.userAgent.indexOf(t) != - 1; //检测是否包含特定字符串
        };
    });
    console.log( navigator.isWin());                      //true
    console.log( navigator.isMac());                      //false
    console.log( navigator.isLinux());                    //false
    console.log( navigator.isUnix());                     //false

3、location对象

location对象存储与当前文档位置(URL)相关的信息,简单地说,就是存储网页地址字符串。使用window对象的location属性可以访问相关的信息。

    http:// www.mysite.cn:80/news/index.asp?id=123&name= location#top

location对象定义8个属性,其中7个属性可以获取当前URL的各部分信息,另一个属性(href)包含完整的URL信息,详细说明如下表所示。为了便于更直观地理解,下表中各个属性将以URL示例信息为参考进行说明:
在这里插入图片描述
使用location对象,结合字符串方法可以抽取URL中查询字符串的参数值。

【示例】定义一个获取URL查询字符串参数值的通用函数,该函数能够抽取每个参数和参数值,并以名/值对的形式存储在对象中返回:

    var queryString = function(){                   //获取URL查询字符串参数值的通用函数
        var q = location.search.substring(1);       //获取查询字符串,如“id=123&name= location”
        var a = q.split("&");                       //以&符号为界把查询字符串劈开为数组
        var o = {};                                 //定义一个临时对象
        for( var i = 0; i <a.length; i++){          //遍历数组
            var n = a[i].indexOf("=");              //获取每个参数中的等号小标位置
            if(n == -1) continue;                   //如果没有发现则跳到下一次循环继续操作
            var v1 = a[i].substring(0, n);          //截取等号前的参数名称
            var v2 = a[i].substring(n+1);           //截取等号后的参数值
            o[v1] = unescape(v2);                   //以名/值对的形式存储在对象中
        }
        return o;                                   //返回对象
    }

然后调用该函数,即可获取URL中的查询字符串信息,并以对象形式读取它们的值。

    var f1 = queryString();                 //调用查询字符串函数
    for(var i in f1){                       //遍历返回对象,获取每个参数及其值
        console.log(i + "=" + f1[i]);
    }

如果当前页面的URL中没有查询字符串信息,用户可以在浏览器的地址栏中补加完整的查询字符串,如“?id=123&name=location”,再次刷新页面,即可显示查询的字符串信息。

location对象的属性都是可读可写的。例如,如果把一个含有URL的字符串赋给location对象或它的href属性,浏览器就会把新的URL所指的文档装载进来并显示出来:

    location = "http:// www.mysite.cn/navi/";        //页面会自动跳转到对应的网页
    location.href = "http:// www.mysite.cn/";        //页面会自动跳转到对应的网页

如果改变location.hash属性值,则页面会跳转到新的锚点(<a name="anchor">或<element id="anchor">),但页面不会重载。

除了设置location对象的href属性外,还可以修改部分URL信息,用户只需要给location对象的其他属性赋值即可。这时会创建一个新的URL,浏览器会将它装载并显示出来。

如果需要URL的其他信息,只能通过字符串处理方法截取。例如,如果要获取网页的名称,可以这样设计:

    var p = location.pathname;
    var n = p.substring(p.lastIndexOf("/")+1);

如果要获取文件扩展名,可以这样设计:

    var c = p.substring(p.lastIndexOf(".")+1);

location对象定义了两种方法:reload()和replace():

  • reload():可以重新装载当前文档。
  • replace():可以装载一个新文档而无须为它创建一个新的历史记录。也就是说,在浏览器的历史列表中,新文档将替换当前文档,这样在浏览器中就不能够通过“返回”按钮返回当前文档。

对使用框架并且显示多个临时页的网站来说,replace()方法比较有用,这样临时页面都不被存储在历史列表中。

注意:window.location与document.location不同,前者引用location对象,后者只是一个只读字符串,与document.URL同义。但是,当存在服器重定向时,document.location包含的是已经装载的URL,而location.href包含的是原始请求文档的URL。

4、history对象

history对象存储客户端浏览器的浏览历史,通过window对象的history属性可以访问该对象。实际上,history对象仅存储最近访问的、有限条目的URL信息。

注意,在HTML5之前,为了保护客户端浏览信息的安全和隐私,history对象禁止JavaScript脚本直接操作访问信息。不过HTML5新增了一个History API,该API允许用户通过JavaScript管理浏览器的历史记录,实现无刷新更改浏览器地址栏的链接地址,配合History+Ajax可以设计不需要刷新页面的跳转。

在历史记录中后退,等效于在浏览器的工具栏上单击“返回”按钮:

    window.history.back();1

在历史记录中前进,等效于在浏览器的工具栏上单击“前进”按钮:

    window.history.forward();1

移动到指定的历史记录点。使用go()方法从当前会话的历史记录中加载页面。当前页面位置的索引值为0,上一页就是-1,下一页为1,以此类推:

    window.history.go(-1);            //相当于调用back()
    window.history.go(1);             //相当于调用forward()

使用length属性可以了解历史记录栈中一共有多少页:

    var num = window.history.length;

1.添加和修改历史记录条目

HTML5新增history.pushState()和history.replaceState()方法,允许用户逐条添加和修改历史记录条目。使用history.pushState()方法可以改变referrer的值,而在调用该方法后创建的XMLHttpRequest对象会在HTTP请求中使用这个值。referrer的值则是创建XMLHttpRequest对象时所处的窗口的URL。

【示例】假设http://mysite.com/foo.html页面将执行JavaScript代码:

    var stateObj = { foo: "bar" };
    history.pushState(stateObj, "page 2", "bar.html");

这时浏览器的地址栏将显示http:// mysite.com/bar.html,但不会加载bar.html页面,也不会检查bar.html是否存在。

如果现在导航到http://mysite.com/页面,然后单击“后退”按钮,此时地址栏会显示http://mysite.com/bar.html,并且会触发popstate事件,该事件中的状态对象会包含stateObj的一个拷贝。

2.pushState()方法

pushState()方法包含3个参数,简单说明如下:
第1个参数:状态对象。状态对象是一个JavaScript对象直接量,与调用pushState()方法创建的新历史记录条目相关联。无论何时用户导航到新创建的状态,popstate事件都会被触发,并且事件对象的state属性都包含历史记录条目的状态对象的拷贝。

第2个参数:标题。可以传入一个简短的标题,标明将要进入的状态。FireFox浏览器目前忽略该参数,考虑到未来可能会对该方法进行修改,传一个空字符串会比较安全。

第3个参数:可选参数,新的历史记录条目的地址。浏览器不会在调用pushState()方法后加载该地址,不指定的话则为文档当前URL。

提示:调用pushState()方法,类似于设置window.location=‘#foo’,它们都会在当前文档内创建和激活新的历史记录条目。但pushState()有自己的优势:

  • 新的URL可以是任意的同源URL,与此相反,使用window.location方法时,只有仅修改hash才能保证停留在相同的document中。
  • 根据个人需要决定是否修改URL。相反,设置window.location=‘#foo’,只有在当前hash值不是foo时才创建一条新的历史记录。
  • 可以在新的历史记录条目中添加抽象数据。如果使用基于hash的方法,只能把相关数据转码成一个很短的字符串。

3.replaceState()方法

history.replaceState()与history.pushState()用法相同,都包含3个相同的参数。不同之处:pushState()是在history栈中添加一个新的条目,replaceState()是替换当前的记录值。例如,history栈中有两个栈块,一个标记为1,另一个标记为2,现在有第三个栈块,标记为3。当执行pushState()时,栈块3将被添加栈中,栈就有3个栈块。而当执行replaceState()时,将使用栈块3替换当前激活的栈块2,history的记录条数不变。也就是说,pushState()会让history的数量加1。

提示:为了响应用户的某些操作,需要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适。

4.popstate事件

每当激活的历史记录发生变化时,都会触发popstate事件。如果被激活的历史记录条目是由pushState()创建,或者是被replaceState()方法替换,popstate事件的状态属性将包含历史记录的状态对象的一个拷贝。

注意:当浏览会话历史记录时,不管是单击浏览器工具栏中“前进”或者“后退”按钮,还是使用JavaScript的history.go()和history.back()方法,popstate事件都会被触发。

5.读取历史状态

在页面加载时,可能会包含一个非空的状态对象,这种情况是会发生的。例如,如果页面中使用pushState()或replaceState()方法设置了一个状态对象,然后重启浏览器。当页面重新加载时,页面会触发onload事件,但不会触发popstate事件。但是,如果读取history.state属性,会得到一个与popstate事件触发时一样的状态对象。

可以直接读取当前历史记录条目的状态,而不需要等待popstate事件:

    var currentState = history.state;

5、screen对象

screen对象存储客户端屏幕信息,这些信息可以用来探测客户端硬件配置。利用screen对象可以优化程序设计,提升用户体验。例如,根据显示器屏幕大小选择使用图像的大小,或者根据显示器的颜色深度选择使用16色图像或8色图像,或者打开新窗口时设置居中显示等。

【示例】演示让弹出的窗口居中显示:

    function center(url){                      //窗口居中处理函数
        var w = screen.availWidth / 2;         //获取客户端屏幕的宽度一半
        var h = screen.availHeight/2;          //获取客户端屏幕的高度一半
        var t = (screen.availHeight - h)/2;    //计算居中显示时顶部坐标
        var l = (screen.availWidth - w)/2;     //计算居中显示时左侧坐标
        var p = "top=" + t + ",left=" + l + ",width=" + w + ",height=" +h;
                                               //设计坐标参数字符串
        var win = window.open(url,"url",p);    //打开指定的窗口,并传递参数
        win.focus();                           //获取窗口焦点
    }
    center("https://www.baidu.com/");          //调用该函数

注意:不同浏览器在解析screen对象的width和height属性时存在差异。

6、document对象

document对象代表当前文档,可以使用window对象的document属性进行访问。

6.1、访问文档对象

当浏览器加载文档后,会自动构建文档对象模型,把文档中每个元素都映射到一个数据集合中,然后以document进行访问。document对象与它所包含的各种节点(如表单、图像和链接)构成早期的文档对象模型(DOM 0级)。

【示例1】使用name访问文档元素:

    <img name="img" src = "bg.gif" />
    <form name="form" method="post" action="http://www.mysite.cn/navi/">
    </form>
    <script>
    console.log(document.img.src);             //返回图像的地址
    console.log(document.form.action);         //返回表单提交的路径
    </script>

【示例2】使用文档对象集合可以快速检索:

    <img src = "bg.gif" />
    <form method="post" action="http://www.mysite.cn/navi/">
    </form>
    <script>
    console.log(document.images[0].src);       //返回图像的地址
    console.log(document.forms[0].action);     //返回表单提交的路径
    </script>

【示例3】如果设置了name属性,也可以使用关联数组引用对应的元素对象:

    <img name="img" src = "bg.gif" />
    <form name="form" method="post" action="http://www.mysite.cn/navi/">
    </form>
    <script>
    console.log(document.images["img"].src);     //返回图像的地址
    console.log(document.forms["form"].action);  //返回表单提交的路径
    </script>

6.2、动态生成文档内容

使用document对象的write()和writeln()方法可以动态生成文档内容,主要包括以下两种方式:

  • 在浏览器解析时动态输出信息。
  • 在调用事件处理函数时使用write()或writeln()方法生成文档内容。

write()方法可以支持多个参数,当为它传递多个参数时,这些参数将被依次写入文档。

【示例1】使用write()方法生成文档内容:

    document.write('Hello',',','World');

实际上,上面代码与下面的代码用法是相同的:

    document.write('Hello,World');

writeln()方法与write()方法完全相同,只不过在输出参数之后附加一个换行符。由于HTML忽略换行符,所以很少使用该方法,不过在非HTML文档输出时使用会比较方便。

【示例2】演示write()和writeln()方法的混合使用:

    function f(){
        document.write('<p>调用事件处理函数时动态生成的内容</p>');
    }
    document.write('<p οnclick="f()">文档解析时动态生成的内容</p>');

在页面初始化后,文档中显示文本为“文档解析时动态生成的内容”,而一旦单击该文本后,则write()方法动态输出文本为“调用事件处理函数时动态生成的内容”,并覆盖原来文档中显示的内容。

注意:只能在当前文档正在解析时,使用write()方法在文档中输出HTML代码,即在<script>标签中调用write()方法,因为这些脚本的执行是文档解析的一部分。

如果从事件处理函数中调用write()方法,那么write()方法动态输出的结果将会覆盖当前文档,包括它的事件处理函数,而不是将文本添加到其中。所以,使用时一定要小心,不可以在事件处理函数中包含write()或writeln()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/124754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dcoker学习笔记(一)

Dcoker学习笔记一 一、 初识Docker1.1 简介1.2 虚拟机和docker的区别1.3 Docker架构1.4 安装Docker&#xff08;Linux&#xff09; 二、 Dcoker基本操作2.1 镜像操作2.2 容器操作练习 2.3 数据卷volume&#xff08;容器数据管理&#xff09;简介数据卷语法数据卷挂载 2.4 自定义…

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存&#xff1a; 浏览器发起请求&#xff0c;查询浏览器的本地缓存&#xff0c;如果找到资源&#xff0c;则直接在浏览器中使用该资源。若是未找到&#xff0c;或者资源已过期&#xff0c;则浏览器缓存返回未…

Java进阶(JVM调优)——JVM调优参数 JDK自带工具使用 内存溢出和死锁问题案例 GC垃圾回收

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM调优的相关知识&#xff0c;给出了一个demo案例&#xff0c;介绍了JVM调优的主要参数&#xff1b;介绍了jdk自带的jvm分析工具的使用&#xff1b;给出了一个内存溢出的调优场景&am…

Unity中Shader再议ATTENUATION

文章目录 前言一、实现实时阴影的投射1、直接复制之前实现投射阴影的Pass 二、实现实时阴影的接受&#xff0c;同时实现光照衰减1、在 v2f 中使用这个2、在 顶点着色器 中使用这个3、在 片元着色器 中使用这个 前言 在之前文章中&#xff0c;实现了 Global Illumination 的直接…

leetcode经典面试150题---5.多数元素

目录 题目描述 前置知识 代码 方法一 排序法 思路 实现 复杂度 方法二 哈希表 思路 实现 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给…

mybatis嵌套查询子集合只有一条数据

我们再用mybatis做嵌套查询时&#xff0c;有时会遇到子集合只有1条数据的情况&#xff0c;例如下这样&#xff1a; 数据库查询结果 xml <resultMap id"userMap" type"com.springboot.demo.test.entity.User"><id column"uid" property…

【容器化】Docker

文章目录 概述环境配置的难题虚拟机Linux 容器Docker 核心概念安装命令启动与停止命令镜像相关命令容器相关命令 部署MySQL 部署Tomcat 部署Nginx 部署Redis 部署 迁移与备份Dockerfile 制作镜像Docker 私有仓库将镜像上传到私有仓库从私有仓库拉取镜像 来源 概述 环境配置的难…

TIA博途中已经被调用的变量,为什么交叉引用时却没有显示调用信息?

TIA博途中已经被调用的变量&#xff0c;为什么交叉引用时却没有显示调用信息&#xff1f; 故障现象&#xff1a; 如下图所示&#xff0c;在HMI的画面中&#xff0c;已经连接了对应的变量&#xff0c; 如下图所示&#xff0c;这里为HMI变量表&#xff0c; 如下图所示&#xff…

野火霸天虎 STM32F407 学习笔记_5 按键输入;位带操作介绍

输入——按键点灯 开发板按键电路如下&#xff1a; 按键未按下接地&#xff0c;按下后为高电平。电容起到消抖作用&#xff0c;软件处理就不需要手动延时消抖了。 编程没啥难度&#xff0c;就是改了一下输入模式。使用 ReadInputDataBits 读取。 //bsp_button.c #include &q…

SpringCloudAlibaba系列之Nacos配置管理

目录 说明 认识配置中心 Nacos架构图 Nacos配置管理实现原理 核心源码分析-客户端 核心源码分析-服务端 配置修改的实时通知 主流配置中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos配置中心的一些实现&#xff0c;很多细节没有涉及&#…

uniapp H5预览PDF支持手势缩放、分页、添加水印、懒加载、PDF下载

效果预览 项目说明 uniapp vue2 node&#xff1a;v14.18.3 npm&#xff1a; 6.14.15 安装pdfh5.js插件 pdfh5 - npm (npmjs.com)pdfh5.js 基于pdf.js和jQuery pdfh5 - npm (npmjs.com) npm install pdfh5 由于我安装最新的pdfh5.js后运行时报错 所以我选择降低版本,可能是node…

【Node.js入门】1.2 部署Node.js开发环境

1.2 部署Node.js开发环境 在 Windows 系统上安装 Node.js 两种文件格式的安装包 Windows安装包&#xff08;.msi&#xff09;Windows二进制文件&#xff08;.exe&#xff09;安装包 检查Node.js版本 node --version 在 Linux 系统上安装 Node.js Linux操作系统上安装Nod…

基础:JavaScript的怪癖之一:提升(Hoisting)

JavaScript&#xff0c;通常被称为“Web 语言”&#xff0c;是一种多功能且广泛使用的编程语言。它以其怪癖而闻名&#xff0c;其中之一就是 hoisting&#xff08;提升&#xff09;。无论你是经验丰富的开发人员还是刚刚开始你的编码之旅&#xff0c;理解提升对于编写干净和高效…

汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)

目录 1. 自定义ASAP2文件 2. asap2userlib.tlc需要修改的部分 3. 标定量观测量地址替换 3.1 由elf文件替换 3.2 由map文件替换 3.3 正则表达式&#xff08;含asap2post.m修改方法&#xff09; 4.小结 书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-C…

时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

本文介绍 本篇文章给大家介绍的是&#xff0c;当我们在进行有关时间序列相关的工作或者实验时&#xff0c;需要对数据进行的一些数据分析操作(包括周期性、相关性、滞后性、趋势性、离群值等等分析)的方法。在本篇文章中会以实战的形式进行讲解&#xff0c;同时提供运行代码和…

若依 验证码出不来 Fontconfig head is null, check your fonts or fonts configuration

是因为使用的OenJDK不支持awt包下的字体 解决方法&#xff1a; 安装FontConfig组件即可 yum install -y fontconfig

C语言--分段函数--switch语句

如何用switch语句写分段函数呢&#xff1f;⭐️ 首先介绍一下switch语句的语法规则⭐️ switch(整形表达式) {case 常量表达式1&#xff1b; //标签必须唯一语句块1;break;case 常量表达式2&#xff1b; //if(a0),而case中时系统自动加语句块2&#xff1b;break&#xff1b;c…

每天一点python——day65

#每天一点Python——65 #字符串的内容对齐操作类似于word中左对齐、右对齐、居中对齐如图 #例&#xff1a; s1hello,python print(s1.center(20,*))#设置宽度20&#xff0c;填充图是*s1有12个字符&#xff0c;这个字符串的宽度设置为20&#xff0c; 20-128 因为center是居中对齐…

MVCC中的可见性算法

在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理&#xff08;read viewundo log&#xff09;&#xff0c;今天来详细的说一下readview的匹配规则&#xff08;可见性算法&#xff09; 隔离级别在RC&#xff0c;RR的前提下 Read View是如何保证可见性判断的呢&#…
最新文章