如何最好地将ClientRect/DomRect转换为普通对象

Zac*_*bey 15 javascript dom getboundingclientrect

someElement.getBoundingClientRect()返回类型(或显然)的特殊对象的结果ClientRectDomRect

它的结构就像 {top: 10, right: 20, bottom: 30, left: 10, width: 10}

不幸的是,这个对象的行为与其他对象不同.

例如,使用Object.keys它返回一个空数组(我认为因为ClientRect属性不可枚举

我找到了一种转换为普通对象的脏方法:

var obj = {}
for (key in rect) {
  obj[key] = rect[key]
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,有更好的方法吗?

Bar*_*ski 16

让我们不要过于复杂化!

function getBoundingClientRect(element) {
  var rect = element.getBoundingClientRect();
  return {
    top: rect.top,
    right: rect.right,
    bottom: rect.bottom,
    left: rect.left,
    width: rect.width,
    height: rect.height,
    x: rect.x,
    y: rect.y
  };
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个ES6版本:```const getBoundingClientRect =(element)=> {const {top,right,bottom,left,width,height,x,y} = element.getBoundingClientRect(); 返回{top,right,bottom,left,width,height,x,y}}``` (8认同)

小智 5

如果使用jQuery,可以使用extend方法.

var obj = $.extend( {}, element.getBoundingClientRect());
Run Code Online (Sandbox Code Playgroud)

  • 这可以而且确实有效,但众所周知,与其他各种克隆方法相比,$.extend 效率低下。参见 http://jsben.ch/#/bWfk9。正如 OP 指出的那样, ClientRect 是一个特殊的对象,并且大多数(所有?)其他技术都不能按预期工作,所以这里没有很多选择。 (2认同)

jsd*_*ond 5

警告:非标准行为(不适用于Firefox < 62,包括 ESR 60 和可能除 Chrome 之外的其他浏览器)

var obj = el.getBoundingClientRect().toJSON();
Run Code Online (Sandbox Code Playgroud)

  • 对不起,但我不得不拒绝回答,因为你没有提到它不支持 Firefox (2认同)

Sky*_*ker 5

这是我可以忍受的:

const persistRect = JSON.parse(JSON.stringify(someElement.getBoundingClientRect()))
Run Code Online (Sandbox Code Playgroud)