JavaScript中BOM和DOM详解|JavaScript中BOM和DOM详解
目录
- BOM(浏览器对象模型)
- 1. window 获取浏览器c窗口尺寸
- 2. screen 获取电脑屏幕大小
- 3. window 开启关闭窗口
- 4. 浏览器事件
- 5. location
- 6. history
- 7. navigator 获取浏览器相关信息
- 8. 弹窗
- DOM (文档对象模型)
- DOM 分类
- DOM对象
- Document文档对象
- element文档对象
- DOM事件操作
- 鼠标事件
- 键盘事件
- 触屏事件
- 特殊事件
- 表单事件
- 浏览器兼容处理
- 兼容性写法,封装工具
BOM(浏览器对象模型)
所有浏览器都支持window对象,他表示浏览器窗口。
所有js全局对象,函数,变量均自动成为window对象的成员。
全局变量是window对象的属性。
全局函数是window对象的方法。
基于html dom的document也是window对象的属性之一。
window.document.getElementById("header"); document.getElementById("header");
1. window 获取浏览器c窗口尺寸
浏览器窗口的内部高度(不包括滚动条,菜单栏,工具栏)
window.innerHeightwindow.innerWidth
适用于Internet Explorer 8、7、6、5浏览器的window如下:
document.documentElement.clientHeightdocument.documentElement.clientWidth
兼容方案获取浏览器宽高`
var width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidthvar height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight
2. screen 获取电脑屏幕大小
属性返回访问者屏幕的宽/高度,以像素计,减去界面特性,比如窗口任务栏。
screen.availWidth
screen.availHeight
3. window 开启关闭窗口
开启:window.open()
关闭:window.close()
4. 浏览器事件
名称 | 描述 |
---|---|
window.onload | 浏览器加载事件 |
window.onscroll | 浏览器滚动监听 |
window.onresize | 浏览器缩放监听 |
window.open | 打开事件 |
window.close | 关闭 |
5. location
名称 | 描述 |
---|---|
location.herf | 当前url |
location.hostname | 主机域名 |
location.pathname | 当前页面路径和文件名 |
location.port | 端口 |
location.protocol | 协议(http/https) |
location.assign | 加载新的文档 |
location.search | url参数 |
console.log(location.href);console.log(location.hostname);console.log(location.pathname);console.log(location.port);console.log(location.protocol);
6. history
浏览器历史,可以不用写window这个前缀
名称 | 描述 |
---|---|
history.length | 次数 |
history.back | 上一页 |
history.forward | 下一页 |
history.go | 小括号中,设定数值和 正负号,+数值 向下一个跳转的次数,-数值 向上一个跳转的次数,次数计算 : 结束页面 - 起始页面 ,错误跳转次数,没有执行效果 |
window.history.back();
7. navigator 获取浏览器相关信息
window.navigator
名称 | 描述 |
---|---|
navagator.userAgent | 型号,内核,版本,平台 |
navagator.appVersion | 浏览器版本信息 |
navagator.appName | 浏览器名称 |
navagator.platform | 操作系统 |
navagator.geolocation | 位置信息包括经度longitude和纬度latitude |
export function GetCurrentBrowser() {var agent = navigator.userAgent.toLowerCase();var regStr_ie = /msie [\d.]+;/gi;var regStr_ff = /firefox\/[\d.]+/givar regStr_chrome = /chrome\/[\d.]+/gi;var regStr_saf = /safari\/[\d.]+/gi;//IE11以下if (agent.indexOf("msie") > 0) {return agent.match(regStr_ie);}//IE11版本中不包括MSIE字段if (agent.indexOf("trident") > 0 && agent.indexOf("rv") > 0) {return "IE " + agent.match(/rv:(\d+\.\d+)/)[1];}//firefoxif (agent.indexOf("firefox") > 0) {return agent.match(regStr_ff);}//Chromeif (agent.indexOf("chrome") > 0) {return agent.match(regStr_chrome);}//Safariif (agent.indexOf("safari") > 0 && agent.indexOf("chrome") < 0) {return agent.match(regStr_saf);}}// get osexport function GetOs() {let userAgent = navigator.userAgent.toLocaleLowerCase() //toLocaleLowerCase()将字母转小写let wins = [{sys: 'windows nt 5.0',alias: 'windows 2000',name: 'Win2000'},{sys: 'windows nt 5.1',alias: 'windows xp',name: 'WinXP'},{sys: 'windows nt 5.2',alias: 'windows 2003',name: 'Win2003'},{sys: 'windows nt 6.0',alias: 'Windows Vista',name: 'WinVista'},{sys: 'windows nt 6.1',alias: 'Windows 7',name: 'Win7'},{sys: 'windows nt 6.2',alias: 'Windows 8',name: 'Win8'},{sys: 'windows nt 10.0',alias: 'Windows 10',name: 'Win10'},]for (let win of wins) {if (userAgent.indexOf(win.sys) > -1 || userAgent.indexOf(win.alias) > -1) {return win.name}}}export function getEdition() {var userAgent = navigator.userAgent.toLocaleLowerCase()if (userAgent.indexOf("win64") > -1 || userAgent.indexOf("wow64") > -1) {return '64位'} else {return '32位'}}export function IsPC() {var userAgentInfo = navigator.userAgent;var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];var flag = true;for (var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) {flag = false;break;}}return flag;}//获取url参数返回对象export function GetRequest() {var url = location.search; //获取url中"?"符后的字串var theRequest = {}let strs = []if (url.indexOf("?") != -1) {var str = url.substr(1);strs = str.split("&");for (var i = 0; i < strs.length; i++) {theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);}}return theRequest;}export const browser = {versions: (function() {let u = navigator.userAgent// let app = navigator.appVersionreturn {trident: u.indexOf('Trident') > -1, // IE内核presto: u.indexOf('Presto') > -1, // opera内核webKit: u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, // 火狐内核mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, // android终端iPhone: u.indexOf('iPhone') > -1, // 是否为iPhone或者QQHD浏览器iPad: u.indexOf('iPad') > -1, // 是否iPadwebApp: u.indexOf('Safari') === -1, // 是否web应该程序,没有头部与底部weixin: u.indexOf('MicroMessenger') > -1, // 是否微信qq: u.match(/\sQQ/i) === 'qq' // 是否QQ}}()),language: (navigator.browserLanguage || navigator.language).toLowerCase()}
8. 弹窗
1、警告框:Window.alert()
2、输入框:Window.prompt()
3、确认框: Window.confirm()
DOM (文档对象模型)
通过 HTML DOM,使用 JavaScript访问 HTML 文档的所有元素。
当网页被加载时,浏览器会创建页面的文档对象模型
DOM 分类
定义了访问和操作 HTML 文档的标准方法。DOM 将 HTML 文档表达为树结构
html中,一切都是节点
- 元素节点
- 文本节点
- 属性节点
通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML
- JavaScript 能够改变页面中的所有 HTML 元素。
- JavaScript 能够改变页面中的所有 HTML 属性。
- JavaScript 能够改变页面中的所有 CSS 样式。
- JavaScript 能够对页面中的所有事件做出反应。
DOM对象
对象 | 描述 |
---|---|
Document:文档对象 | 每个载入浏览器的 HTML 文档都会成为 Document 对象 |
Element:元素对象 | Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。 |
Attribute:节点属性对象 | Attr 对象表示 HTML 属性 |
Event:事件对象 | 事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状 |
Document文档对象
Document对象所有属性
属性 | 描述 |
---|---|
document.body | 获取body |
document.Head | 获取head |
document.Element | 获取html |
document.cookie | 获取cookie |
document.domain | 当前文档域名,可做跨域操作 |
document.lastModified | 文档最后修改日期时间 |
document.referrer | 当前文档的url |
document.title | 标题 |
document.URL | 当前文档的URL |
Document常用方法
方法 | 描述 |
---|---|
document.write() | 文档写入内容 |
document.open() | 打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。 |
document.close() | 关闭用 document.open() 方法打开的输出流,并显示选定的数据。 |
document.writeIn() | 等同于 write() 方法,不同的是在每个表达式之后写一个换行符 |
获取元素 | |
document.getElementById() | 通过id获取元素 |
document.getElementsByName() | 通过name获取相关元素数组 |
document.getElementsByTagName() | 通过标签获取相关元素数组 不能使用forEach循环 |
document.getElementsByClassName() | 通过class获取相关元素数组 不能使用forEach循环 |
document.querySelector() | 获取第一个匹配条件的标签对象 --- 只会获取一个标签对象 |
document.querySelectorAll() | 获取所有匹配条件的标签对象 执行结果是伪数组 |
创建元素 | |
document.createAttribute() | 创建属性对象 |
document.createElement() | 创建元素对象 |
document.createTextNode() | 创建文本对象 |
document.createComment() | 创建注释 |
element文档对象
element元素对象常用的方法
方法 | 描述 |
---|---|
元素增,删,改,克隆 | |
appendChild(doc) | 插入节点到最后 |
insertBefore(ndoc, oldoc) | 插入节点到某个节点之前 |
removeChild(doc) | 移除该节点 |
replaceChild(doc) | 替换节点 |
cloneNode() | 克隆节点 |
cloneNode(true) | 克隆节点及其内容 |
属性相关 | |
getAttribute() | 获取属性 |
setAttribute() | 设置属性 |
removeAttribute() | 移除属性 |
getAttributeNode() | 指定属性节点 |
setAttributeNode() | 设置属性节点 |
removeAttributeNode() | 移除属性节点 |
getElementsByTagName() | 指定标签名的所有子元素的集合 |
nodelist.item() | NodeList 中位于指定下标的节点 |
element元素对象常用的属性
属性 | 描述 |
---|---|
id | 元素id |
style | 样式 |
className | class属性 |
innerHML | 标签内容 |
innerText | 文本内容 |
获取节点 | |
childNodes | 获取元素子节点 |
parentNode | 获取元素父节点 |
attributes | 获取所有属性 |
children | 获取所有标签子节点 |
firstchild | 第一个子节点 |
lastchild | 最后一个子节点 |
firstElementchild | 第一个标签子节点 |
lastElementChild | 最后一个标签子节点 |
previousSibling | 上一个兄弟节点 |
nextsibling | 下一个兄弟节点 |
previousElementsibling | 上一个标签 |
nextElemntSibling | 下一个标签 |
parentNode | 父级节点 |
parentElement | 父级标签节点 |
nodeName | 名字:元素节点--标签名称、属性节点--属性名、文本节点--#text、注释节点--#comment |
nodeType | 节点类型:1元素, 2属性 3文本, 8注释 |
nodeValue | 元素值:属性值、文本内容、注释内容 |
nodelist.length | NodeList 中的节点数 |
尺寸距离 | |
clientHeight | 高度-内容+padding |
Clientwidth | 宽度 |
offsetHeight | 高度-内容+padding+border |
Offsetwidth | 宽度 |
ClientTop | 上边框宽度 |
clientLeft | 做边框宽度 |
offsetTop | 父物体顶部距离 |
offsetLeft | 父物体左侧距离 |
DOM事件操作
鼠标事件
名称 | 描述 |
---|---|
click | 点击事件 |
dbclick | 双击事件 |
contextmenu | 右键点击事件 |
mousedown | 按下事件,执行一次 |
mouseup | 抬起事件 |
mousemove | 鼠标移动 |
mouseover | 移入 |
mouseout | 移除 |
mouseenter | 移入,不发生冒泡 |
mouseleave | 移除,不冒泡 |
键盘事件
获取点击时的事件对象
- 普通版本
- IE低版本
兼容写法:var e=e||window.event获取案件相关
- 按键名称:
- 按键编码:
- 兼容火狐:
兼容写法: e.Keycode|| e.Which
altkey ctrlkey shiftkey 判断是否按下 alt ctrl shift
触屏事件
名称 | 描述 |
---|---|
touchstart | 开始 |
touchend | 结束 |
touchmove | 移动 |
特殊事件
名称 | 描述 |
---|---|
animationend | 动画结束 |
transitionend | 过度结束 |
表单事件
名称 | 描述 |
---|---|
submit | 只有提交表单时,触发的事件 |
focus | 标签获取焦点会处触发的事件 |
input | 输入数据时会触发的事件 |
change | 失去加并且输入数据改变是触发事件 |
浏览器兼容处理
1、浏览器滚动高度
var height=document.documentElement.scrollTop||document.body.scrollTopvar width=document.documentElement.scrollLeft||document.body.scrollLeft
- 有文档类型声明
document.documentElement.scrollTopdocument.documentElement.scrollLeft
- 没有文档类型声明
document.body.scrollTopdocument.body.scrollLeft
2、获取非行内样式属性
实际效果是,获取标签执行的样式属性
if(window.getComputedStyle){window.getComponentStyle(dom).width}else{doc.currentStyle.width}
3、获取事件对象
dom.onclick=function(e){e=e||window.event}
4、获取事件对象目标
兼容低版本火狐浏览器,现在基本上不用了
dom.事件=function(){e=e||window.eventvar target=e.target||e.srcElement}
5、按键数值
兼容低版本火狐浏览器,现在基本上不用了
document.onkeyup=function(e){e=e||window.eventvar keyNum=e.keyCode||e.which}
6、事件的监听/事件的注册
function myAddEvent(ele,type,fun){判断addEventListener这个方法是否存在if(ele.addEventListener){ele.addEventListener(type,fun)}else{ele.attachEvent('on'+type,fun)}}
7、删除事件处理函数
function delFun(ele,type,fun){if(ele.removeEventListener){ele.removeEventListener(type,fun)}else{ele.detachEvent('on'+type,fun)}}
8、阻止事件传递
function stopBBle(e){if(e.stopPropagation){e.stopPropagation()}else{e.cancelBubble=true}}
9、阻止默认事件执行
if(e.preventDefault){e.preventDefault}else{e.returnValue=https://www.it610.com/article/false}
10、ajax对象
let xhr;try{//普通路蓝旗xhr=new XMLHttpRequest()}catch(e){//兼容IE低版本xhr=new ActiveXObject('Microsoft.XMLHTTP')}xhr.open('post','url')xhr.setRequestHeader('content-type','application/x-www/form-url-encoded')xhr.send('name=111&age=222')//标准浏览器xhr.onload = function(){}//兼容性写法xhr.onreadystatechange=function(){if(xhr.readystate==4){let reg=/^a\d{2}$/if(res.test(xhr.status)){console.lof(json.parse(xhr.response))}}}
兼容性写法,封装工具
生成验证码函数
function mySetVc() {var str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXUZ';var newStr = '';for (var i = 1; i <= 6; i++) {var num = parseInt(Math.random() * str.length)if (newStr.indexOf(str[num]) === -1) {newStr += str[num];} else {i--;}}return newStr;}
获取地址栏数据信息
function getUrlVal() {// 1,获取地址栏参数字符串let str = decodeURI(window.location.search).substr(1);// 创建存储结果的对象let obj = {};// 2 转化为数组 根据 分号空格转化const arr1 = str.split('&')// 3 循环变量数组,将数据字符串,根据=等号分割为数组arr1.forEach(v => {let arr2 = v.split('=');obj[arr2[0]] = arr2[1];})return obj;}
生成table表格函数
// 参数1:数组,需要参照的数据数组// 参数2:标签,需要写入内容的标签对象function mySetTable(array, element) {var str = '';array.forEach(function (v, k) {str += '';for (var key in v) {str += ` ';});element.innerHTML = str;var oBtns = document.querySelectorAll('button');mySetButton(oBtns, array, element);}${v[key]} `;}str += ``str += '
给button按钮绑定删除效果函数
// 参数1,button按钮数组// 参数2,数据数组// 参数3,写入内容的标签对象function mySetButton(BtnArray, array, element) {BtnArray.forEach(function (v) {v.onclick = function () {var bool = window.confirm('确定,是否删除');if (bool) {var index = v.getAttribute('index');array.splice(index, 1);mySetTable(array, element);}}})}
处理监听事件兼容性函数
// 参数1:需要绑定事件的标签对象// 参数2:需要绑定的事件类型,没有on// 参数3:需要绑定的事件处理函数function myAddEvent(element, type, fun) {if (element.addEventListener) {// 普通浏览器element.addEventListener(type, fun);} else {// 低版本IE浏览器element.attachEvent('on' + type, fun);}}
获取css样式函数
// 参数1,需要属性的标签对象// 参数2,需要属性的属性名称function myGetStyle(element, type) {if (window.getComputedStyle) {return window.getComputedStyle(element)[type];} else {return element.currentStyle[type];}}
设定 cookie 函数
// 参数1: cookie 的键名// 参数2: cookie 的键值// 参数3: cookie 的时效(秒数)function mySetCookie(key, value, time) {// 1,获取当前的时间对象const nowTime = new Date();// 2,获取当前时间的时间戳 --- 单位是毫秒let timeStamp = nowTime.getTime();// 3,计算时间戳当前时间戳 - 8小时 + 时效的时间(秒)// 获取带有时效的时间戳 是世界标准时间let newTimeStamp = timeStamp - 8 * 60 * 60 * 1000 + time * 1000;// 4,将时间戳设定回时间对象nowTime.setTime(newTimeStamp);// 5,兼容没有传第三个参数的情况// 如果 time 是 undefined ,证明没有第三个参数,执行会话时效,赋值空字符串// 如果 time 不是 undefined ,证明没有第三个参数,执行 nowTime 时间对象中的时间戳时效let endTime = time === undefined ? '' : nowTime;// 6,设定cookie// 给cookie多设定一个属性,path=/// 让www中的所有文件都可以使用设定的cookiedocument.cookie = `${key}=${value};expires=${endTime};path=/`;}
获取 cookie 的具体数据
function myGetCookie() {// 创建存储结果的对象let obj = {};// 1 获取cookie字符串let str = document.cookie;// 2 转化为数组 根据 分号空格转化const arr1 = str.split('; ')// 3 循环变量数组,将数据字符串,根据=等号分割为数组arr1.forEach(v => {let arr2 = v.split('=');obj[arr2[0]] = arr2[1];})return obj;}function fun(){console.log('我是新建的js文件中的内容,你压缩我了吗?')}
【JavaScript中BOM和DOM详解|JavaScript中BOM和DOM详解】到此这篇关于JavaScript中BOM和DOM详解的文章就介绍到这了,更多相关js BOM和DOM内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理