2016-09-09 11 views
5

Wynik someElement.getBoundingClientRect() zwraca specjalną obiektu typu ClientRect (lub DomRect podobno)Jak najlepiej konwertować ClientRect/DomRect do zwykłego obiektu

Jest strukturze jak {top: 10, right: 20, bottom: 30, left: 10, width: 10}

Niestety, tego obiektu nie zachowuje się tak jak inne obiekty.

Na przykład, używając Object.keys na to zwraca pustą tablicę (myślę ponieważ ClientRect właściwości nie są przeliczalny

znalazłem coś brudnego sposób przekonwertować do zwykłego obiektu:

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

Moje pytanie brzmi: czy jest lepszy sposób?

+1

To _soooo_ hacky, ale 'Object.keys (document.body.getBoundingClientRect() .__ proto __)' wydaje się działać w chromie. : P –

Odpowiedz

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

Cóż, jest. '.toJSON()' było magią! –

+0

Myślę, że nie potrzebujesz nawet "Object.assign". '.toJSON' zwraca poprawny obiekt (' Object.keys ($ 0.getBoundingClientRect(). toJSON()) 'działa). Za każdym razem otrzymujesz świeży przedmiot! '$ 0.getBoundingClientRect(). ToJSON()! == $ 0.getBoundingClientRect(). ToJSON()' –

8

Nie kompilujmy zbytnio rzeczy!

function getBoundingClientRect(element) { 
    const 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 
    }; 
} 
+2

Oto wersja ES6: '' 'const getBoundingClientRect = (element) => { const {góra, prawo, dół, lewo, szerokość, wysokość, x, y} = element.getBoundingClientRect(); return {top, right, bottom, left, width, height, x, y} } '' ' – aboutaaron

4

można użyć przedłużyć metodę, jeśli używasz jQuery.

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

To może i działa, ale $ .extend jest notorycznie nieefektywny w porównaniu do różnych innych metod klonowania. Zobacz http://jsben.ch/#/bWfk9. Jak zauważa OP, ClientRect jest specjalnym obiektem, a większość (wszystkich?) Innych technik nie działa zgodnie z oczekiwaniami, więc nie ma tu wiele opcji do wyboru. – kamelkev

Powiązane problemy