首页 > 其他分享 >dom、js原生常用api, 兼容ie等主流浏览器(持续更新)

dom、js原生常用api, 兼容ie等主流浏览器(持续更新)

时间:2023-05-23 21:11:46浏览次数:43  
标签:styleName return dom element window api currentNode js document

开发组件库必须知道的东西

/**
 * 获取scrollTop
 * @param  { HTMLElement | window } element - dom元素或者window对象
 * @returns { number }
 */
function getScrollTop(element) {
  if (element === window) {
    return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
  }
  return element.scrollTop
}

/**
 * 获取元素的样式
 * @param  { HTMLElement } element - dom元素
 * @param  { string } styleName - 样式属性名称
 * @param  { pseudoElement } pseudoElement=null  - 伪类名称
 * @returns { string }
 * - defaultView:
 * Firefox 3.6 上访问子框架内的样式 (iframe)必须加defaultView
 * IE8 浏览器中 document.defaultView !== window
 */
function getStyle(element, styleName, pseudoElement = null) {
  if (!element || !styleName) return ''
  const isLessIe9 = Number(document.documentMode) < 9
  // ie9以下float属性名为styleFloat
  const alias = {
    float: isLessIe9 ? 'styleFloat' : 'cssFloat',
  }
  if (Object.prototype.hasOwnProperty.call(alias, styleName)) styleName = alias[styleName]

  try {
    //获取到的一定是字符串,所以不用考虑0为false的情况
    const str = element.style[styleName]
    if (str) return str //行内样式
    // ie || 其它 || 异常
    let styleObj = element.currentStyle || document.defaultView.getComputedStyle(element, pseudoElement) || {}
    return styleObj[styleName] || ''
  } catch (error) {
    return element.style[styleName]
  }
}

/**
 * 获取指定元素所在滚动容器
 * @param  { HTMLElement } element  - dom元素
 * @param  { boolean } isVertical=true  - 是否是垂直方向,默认true
 * @returns { HTMLElement | window }
 */
function getScrollEventTarget(element, isVertical = true) {
  let currentNode = element
  while (currentNode) {
    if ([window, document, document.documentElement].includes(currentNode)) {
      return window
    }
    if (currentNode instanceof Element) {
      const styleName = isVertical ? 'overflowY' : 'overflow-x'
      if (['scroll', 'auto', 'overlay'].includes(getStyle(currentNode, styleName))) {
        return currentNode
      }
    }
    currentNode = currentNode.parentNode
  }
  return currentNode
}

 

标签:styleName,return,dom,element,window,api,currentNode,js,document
From: https://www.cnblogs.com/wiliam/p/17426389.html

相关文章

  • python:Error: EPERM: operation not permitted, mkdir 'F:\Program Files\nodejs\
     可以发现文件没有权限npmERR!Error:EPERM:operationnotpermitted,mkdir'F:\ProgramFiles\nodejs\node_global\node_modules'将nodejs的文件权限改为完全控制之后操作即可 ......
  • 记录--使用率比较低的10个Web API
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助avaScript中有些API可能使用率比较低,下面我们逐一介绍它们的用法和使用场景。至于标题,主要是想让你进来看看,兄弟们别打我!BlobAPIBlobAPI用于处理二进制数据,可以方便地将数据转换为Blob对象或从Blob对象读取数......
  • js基础
    作用域js采用的是静态作用域(函数定义的时候作用域就已经确定)变量对象当前代码段中所有的变量(变量,函数,形参aguments)组成的一个对象变量对象在执行全局上下文被激活,只有被激活代码中才能使用变量分为全局变量对象VariableObjectVO和局部变量对象(函数执行时被激活)ActiveO......
  • APlayer & MetingJS 音乐播放器使用指南
    1.介绍APlayer是一个简洁漂亮、功能强大的Html5音乐播放器,GitHub地址:https://github.com/DIYgod/APlayerMetingJS是为APlayer添加网易云、QQ音乐等支持的插件,GitHub地址: https://github.com/metowolf/MetingJS2.安装引用三个文件APlayer.min.js  APlayer.min.css ......
  • java api调用kafka
    已经启用了zookeeper和kafka单机的ip为192.168.80.128加入maven的pom.xml代码如下 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>0.8.2.1</version&g......
  • js如何终止请求发送
    fetch的方式:letcontroller=nullinput.oninput=async()=>{controller&&controller.abort()controller=newAbortController()try{constapi=awaitfetch('https://xxxx.api.xxx',{signal:contro......
  • 解锁各种js数组骚操作,总有你想要的!
    解锁各种js数组骚操作,总有你想要的!解锁各种js数组骚操作,总有你想要的!标签:javascript前端在开发中,数组的使用场景非常多,平日中也涉及到很多数组相关操作,对一些常见的操作方法进行总结和收藏,在开发中就能信手拈来,大大提高开发效率。本文在gitthub做了收录github.com/Michael-......
  • 1、Nodejs学习笔记
    1、fs模块fs模块名称,可以用来操作文件,比如:文件创建,删除,重命名,移动,写入,读取2、来一个fs模块写入的例子//第一个参数文件名称,不存在会创建,第二个参数:写入内容,第三个参数:是写入情况返回值,如果写入成功返回null,如果失败返回错误信息fs.writeFile('','',err=>{})//异步fs.......
  • JS 鼠标粒子效果
    <!--鼠标粒子特效--><script>!function(){functionn(n,e,t){returnn.getAttribute(e)||t}functione(n){returndocument.getElementsByTagName(n)}functiont(){......
  • Uni-app 封装 API 请求
    一、在文件夹API下创建api.jsconstBASE_URL="";//封装请求方法constrequest=(url,method,data)=>{ wx.showLoading({ title:'加载中'//数据请求前loading }) returnnewPromise((resolve,reject)=>{ wx.request({ url:BASE_URL+url,......