2016-09-09 13 views
5

Kết quả của someElement.getBoundingClientRect() trả về một đặc biệt đối tượng loại ClientRect (hoặc DomRect rõ ràng)Làm thế nào tốt nhất để chuyển đổi một ClientRect/DomRect vào một đối tượng đồng bằng

Nó được cấu trúc như {top: 10, right: 20, bottom: 30, left: 10, width: 10}

Thật không may, đối tượng này không hoạt động giống như các đối tượng khác.

Ví dụ, sử dụng Object.keys vào nó trả về một mảng rỗng (Tôi nghĩ rằng vì ClientRect tính không đếm

tôi tìm thấy một cái gì đó một cách bẩn để chuyển đổi sang một đối tượng đơn giản:

var obj = {} 
for (key in rect) { 
    obj[key] = rect[key] 
} 

Câu hỏi của tôi là, có cách nào tốt hơn không?

+1

Đây là _soooo_ hacky, nhưng 'Object.keys (document.body.getBoundingClientRect() .__ proto __)' dường như làm việc trong chrome. : P –

Trả lời

1
var obj = Object.assign({}, el.getBoundingClientRect().toJSON()) 
+0

Cũng đúng rồi. '.toJSON()' là ma thuật! –

+0

Tôi nghĩ bạn thậm chí không cần 'Object.assign' ở đó. '.toJSON' retuns một đối tượng thích hợp (' Object.keys ($ 0.getBoundingClientRect(). toJSON()) 'hoạt động). Bạn nhận được một đối tượng tươi mỗi lần quá! '$ 0.getBoundingClientRect(). ToJSON()! == $ 0.getBoundingClientRect(). ToJSON()' –

8

Đừng quá phức tạp!

+2

Đây là phiên bản ES6: '' 'const getBoundingClientRect = (phần tử) => { const {top, right, bottom, left, width, height, x, y} = element.getBoundingClientRect(); return {top, right, bottom, left, width, height, x, y} } '' ' – aboutaaron

4

Bạn có thể sử dụng phương pháp mở rộng nếu bạn đang sử dụng jQuery.

var obj = $.extend({}, element.getBoundingClientRect()); 
+0

Điều này có thể và không hoạt động, nhưng $ .extend nổi tiếng không hiệu quả so với các phương pháp nhân bản khác. Xem http://jsben.ch/#/bWfk9. Như OP lưu ý ClientRect là một đối tượng đặc biệt, và hầu hết (tất cả?) Các kỹ thuật khác không hoạt động như mong đợi, vì vậy không có nhiều lựa chọn ở đây. – kamelkev

Các vấn đề liên quan