在某网课学习前端笔记整理js篇28-xml在不同浏览器的解析与序列化、浏览器对象模型BOM

xml在不同浏览器的解析与序列化、浏览器对象模型BOM

一、xml在不同浏览器的解析与序列化

大多数浏览器都内建了供读取和操作 XML 的 XML 解析器。解析器把 XML 转换为 JavaScript 可存取的对象。html是xml发展来的。

ie下:

example1

//以前获取ie的xmldom,我在ie试了下,支持ie9-,ie9及以上不支持
function createXMLDom(){
    var version = [
        "MSXML2.DOMDocument.6.0",
        "MSXML2.DOMDocument.3.0",
        "MSXML2.DOMDocument"
    ];
    for(var i=0;i<version.length;i++){
        try{
            var xmlDom = new ActiveXObject(version[i]);
        }catch(e){
            // 跳过
        }
    }
    return xmlDom
}
//w3cschool上的创建xmlDom的方法,和createXMLDom的兼容一样,ie9以下才支持。
function createXMLDom2(){
    xmlDom = new ActiveXObject('Microsoft.XMLDOM');
    return xmlDom;
}
// alert(createXMLDom());
alert(createXMLDom());

var xmlDom = createXMLDom2();
//解析字符串
xmlDom.loadXML('<root><name>tds</name><age>11</age></root>');
//序列化(序列化,把对象转为字节序列的过程)
console.log(xmlDom.xml);
//解析xml文件
xmlDom.load('33_test.xml');
//这里获取到了,但是如果33_test.xml是在服务器上的话,会获取不到,因为默认的解析是异步的,所以需要加上个监听事件。或者将它变为同步的
//xmlDom.async = false;//将解析变为同步
//可以像html一样添加子节点
var child = xmlDom.createElement('sex');
var textNode = xmlDom.createTextNode('男');
child.appendChild(textNode);
xmlDom.documentElement.appendChild(child);
console.log(xmlDom.xml);
//这个必须是加载服务器的xml文件时候才会触发,加载本地的不能触发
xmlDom.onreadystatechange = function(){
    //readyState有0,1,2,3,4这几个值,4表示完成。
    if(xmlDom.readyState ==  4){
        if(xmlDom.parseError == 0){
            console.log(xmlDom.xml);
        }else{
            /*
                        错误的行号  line
                        错误的位置  linepos
                        错误的信息  errorCode
                        错误的解释  reason
                     */
            throw new Error(
                "错误的行号:"+xmlDom.parseError.line+"n"+
                "错误的位置:"+xmlDom.parseError.linepos+"n"+
                "错误的信息:"+xmlDom.parseError.errorCode+"\n"+
                "错误的解释:"+xmlDom.parseError.reason);
        }
    }
}

非ie:

example2

//非ie创建xml对象加载xml文件。谷歌不行,其他的没试,火狐好像可以。

xmlDom=document.implementation.createDocument("","",null);
console.log(xmlDom);
xmlDom.async="true";
xmlDom.load("33_test.xml");
xmlDom.onload = function(){
    //序列化
    var str = (new XMLSerializer()).serializeToString(xmlDom);
    alert(str);
}

example3

//解析xml字符串
var parser = new DOMParser(),
    xmlStr = "",
    xmlDom = null;
try{
    xmlStr = "<root><user>xq</user></root>";
    xmlDom = parser.parseFromString(xmlStr, 'text/xml');
    var error = xmlDom.getElementsByTagName("parsererror");
    if(error.length > 0){
        throw new Error("xml格式有误:" + error[0].innerText);
    }
}catch(e){
    console.log(e)
}
var str = (new XMLSerializer()).serializeToString(xmlDom);
console.log(str);

关于解析xml在各个浏览器的支持。

ie9-ie9及ie9+谷歌火狐
解析xml文件(我这里指的是本地的,远程的没试过)支持不支持不支持支持
解析xml字符串支持支持支持支持

因为解析xml文件在谷歌不好用,所以这里我们用解析xml字符串来解析xml。下面是写的兼容方法:

example4

 //解析xml字符串并返回xml对象
function parseXML(xml){
    var xmlDom = null;
    //非ie9-
    if(typeof DOMParser != 'undefined'){
        xmlDom = (new DOMParser()).parseFromString(xml,'text/xml');
        // 检测是否xml文档有没有问题
        var error = xmlDom.getElementsByTagName('parsererror');
        console.log(error);
        if(error.length > 0){
            throw new Error('xml格式有误:'+error[0].textContent);
        }
    }else if(typeof ActiveXObject != 'undefined'){
        xmlDom = createXMLDom();
        xmlDom.loadXML(xml);
        if(xmlDom.parseError.errorCode != 0){
            throw new Error(
                "错误的行号:"+xmlDom.parseError.line+"\n"+
                "错误的位置:"+xmlDom.parseError.linepos+"\n"+
                "错误的信息:"+xmlDom.parseError.errorCode+"\n"+
                "错误的解释"+xmlDom.parseError.reason
            )
        }
    }else{
        throw new Error("NO XML available");
    }
    return xmlDom;
}
// 序列化xml  jDom
function serializerXML(xmlDom){
    //非ie9-
    if(typeof XMLSerializer != 'undefined'){
        xml = (new XMLSerializer()).serializeToString(xmlDom)
        console.log(xml);
    }else if(typeof xmlDom.xml != 'undefined'){
        //ie9-
        xml = xmlDom.xml;
    }else{
        throw new Error("无法解析");
    }
    return xml;
}
var xmlDom = parseXML("<root><name>tds</name><age>26</age></root>");
alert(serializerXML(xmlDom));

上面用typeof判断DOMParser因为DOMPareser如果没有用var声明,且没有赋值的话会报undefined错误。(我猜的)

二、浏览器对象模型BOM(browser object model)

screen: 获取屏幕的分辨率。

example5

console.log(screen.width, screen.height);//1536 864

location: 获取窗口的url相关的信息。

example6

console.log(location.href);	//url
console.log(location.hash);//#后边的内容
console.log(location.host);//ip
console.log(location.hostname);//主机名
console.log(location.port);//端口
console.log(location.pathname);//路径
console.log(location.protocol);//协议
console.log(location.search);//?后边的内容
location.reload();//重新加载文档,如果缓存中有该文档,会用缓存的文档
location.reload(true);//不加载缓存,从服务器加载缓存

方法可以对decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

navigator: 包含浏览器相关信息。

examle7

//判断浏览器是什么浏览器
function validBrowser(){
    var u_agent = navigator.userAgent;
    var browser_name='Failed to identify the browser';
    if(u_agent.indexOf('Firefox')>-1){
        browser_name='Firefox';
    }else if(u_agent.indexOf('Chrome')>-1){
        browser_name='Chrome';
    }else if(u_agent.indexOf('Trident')>-1&&u_agent.indexOf('rv:11')>-1){
        browser_name='IE11';
    }else if(u_agent.indexOf('MSIE')>-1&&u_agent.indexOf('Trident')>-1){
        browser_name='IE(8-10)';
    }else if(u_agent.indexOf('MSIE')>-1){
        browser_name='IE(6-7)';
    }else if(u_agent.indexOf('Opera')>-1){
        browser_name='Opera';
    }else{
        browser_name+=',info:'+u_agent;
    }
  return  browser_name;
}

history:

example8

history.go(-1);//后退1
history.go(2);//前进2
history.forward();//前进1
history.back();//后退1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值