Jsdom: offsetWidth, offsetHeight, offsetTop ๋ฐ offsetLeft

์— ๋งŒ๋“  2011๋…„ 02์›” 01์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jsdom/jsdom

HighCharts์šฉ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ SVG ๋งˆํฌ์—…์— x, y, ๋„ˆ๋น„ ๋ฐ ๋†’์ด ๊ฐ’์ด ์ „์ฒด์ ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด offsetWidth, offsetHeight, offsetTop ๋ฐ offsetLeft๊ฐ€ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋ชจ๋‘ ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†์„ฑ์ด ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ? ๋˜ํ•œ ๋‹น๋ถ„๊ฐ„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

css feature layout needs tests

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋Š” ์ง€์›์„ ์œ„ํ•ด ์ด ์Šค๋‹ˆํŽซ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ตฌํ˜„๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. window ๋Š” document.parentWindow ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
http://dev.w3.org/csswg/cssom-view/#dom -htmlelement-offsetleft

Object.defineProperties(window.HTMLElement.prototype, {
  offsetLeft: {
    get: function() { return parseFloat(window.getComputedStyle(this).marginLeft) || 0; }
  },
  offsetTop: {
    get: function() { return parseFloat(window.getComputedStyle(this).marginTop) || 0; }
  },
  offsetHeight: {
    get: function() { return parseFloat(window.getComputedStyle(this).height) || 0; }
  },
  offsetWidth: {
    get: function() { return parseFloat(window.getComputedStyle(this).width) || 0; }
  }
});

๋ชจ๋“  32 ๋Œ“๊ธ€

http://www.w3.org/TR/cssom-view/ ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ SVG ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” cssom ํ†ตํ•ฉ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜คํ”„์…‹* ์†์„ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค ๊ด€๋ จ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Highcharts๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์ฒ˜์ง ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ๊ฐ–๊ณ  ์‹ถ๋„ค์š” :)

๋„์›€์ด ๋  ์—ฌ๋ถ„์˜ ์‚ฌ์ดํด์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” svg 1.1์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์˜์š•์ด ์†Ÿ๋Š”๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@tmpvar : ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ์ง€๋งŒ ์„œ๋ฒ„ ์ธก JS ๊ด€๋ จ ํ•ญ๋ชฉ์€
์–ด๋””์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ํžŒํŠธ๋ฅผ ์ฃผ์‹œ๋ฉด ์ตœ์„ ์„ ๋‹คํ•ด ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์„œ๋ฒ„์—์„œ ํ•˜์ด์ฐจํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด SVG 1.1์—๋„ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋จผ์ € SVG 1.0๊ณผ jsdom์˜ ํ˜„์žฌ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ;)

์—ฌ๊ธฐ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ(http://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_Overview)์˜ ์‚ฌ๋ณธ์„ ๊ฐ€์ ธ์™€์„œ ํ—ค๋“œ๋ฆฌ์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ level2/svg.js ํ•˜๊ณ  ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„๋งˆ๋„ ๊ฒฐ๊ตญ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด์ง€๋งŒ, ์ง€๊ธˆ ๋‹น์žฅ์€ jsdom ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์—์„œ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@href svg 1.0 ๊ตฌํ˜„์€ ๋งค์šฐ level1/core ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ svg ํŠน์ • ํ•ญ๋ชฉ์„ ๊ตฌํ˜„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

getBoundingCLientRect๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • svg ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

var html = '<!DOCTYPE html><html><head><title></title></head><body style="margin: 0; padding: 0;"><svg id="svg" xmlns="http://www.w3.org/2000/svg" version="1.1" style="margin: 0; padding: 0;"><rect style="" x="10" y="10" width="100" height="100" rx="0" ry="0"/></svg></body></html>';

        jsdom.env({
            html : html,
            src: [jquery],
            done: function (errors, window) {
                var $ = window.$;
                var clientBox = $("#svg").find(type)[0].getBoundingClientRect();
                console.log(clientBox);
            }
        });

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ bottom: 0, height: 0, left: 0, right: 0, top: 0, width: 0 }

๊ทธ๋Ÿฌ๋‚˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ผํ•œ html์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ bottom: 110, height: 100, left: 10, right: 110, top: 10, width: 100 }

@throrin19 : #653์„ ์ฝ์–ด

๊ทธ๋ž˜์„œ ๋‹ฌ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ phantomJS๋ฅผ ํ†ตํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋งค์šฐ ๋Š๋ฆฌ๊ณ  ํฐ SVG๊ฐ€ ์žˆ์œผ๋ฉด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ ์—”์ง„์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ณ  ์•„๋ฌด๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋‚ด ๋‡Œ๊ฐ€ ๊ฒฝ๋ จ์„ ์ผ์œผํ‚ค๊ณ  ๋– ๋‚˜์•ผํ•ฉ๋‹ˆ๋‹ค.

์‚ฐ ์ด์™ธ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•œ ๊ธฐ๋Šฅ์„ ์ฐพ๋Š” ๋ฐ +1

๋‚ด ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋Š” ์ง€์›์„ ์œ„ํ•ด ์ด ์Šค๋‹ˆํŽซ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ตฌํ˜„๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. window ๋Š” document.parentWindow ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
http://dev.w3.org/csswg/cssom-view/#dom -htmlelement-offsetleft

Object.defineProperties(window.HTMLElement.prototype, {
  offsetLeft: {
    get: function() { return parseFloat(window.getComputedStyle(this).marginLeft) || 0; }
  },
  offsetTop: {
    get: function() { return parseFloat(window.getComputedStyle(this).marginTop) || 0; }
  },
  offsetHeight: {
    get: function() { return parseFloat(window.getComputedStyle(this).height) || 0; }
  },
  offsetWidth: {
    get: function() { return parseFloat(window.getComputedStyle(this).width) || 0; }
  }
});

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด tobyhinloopen์ด ์ œ์•ˆํ•œ ๊ฒƒ์œผ๋กœ ์„ฑ๊ณต์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

@tobyhinloopen : ๋‚ด ๊ทธ๋ž˜ํ”„ ๋ฐฐ๊ฒฝ, ์ถ• ๋ฐ ๋ ˆ์ด๋ธ”์ด ํ‘œ์‹œ๋˜์ง€๋งŒ(๋น„๋šค์–ด์ง„ ๋ฐฉ์‹์œผ๋กœ) ๋‚˜๋จธ์ง€๋Š” ์—ฌ์ „ํžˆ ํ๋ฆฟํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

์ œ์•ˆํ•œ ๊ตฌํ˜„์ด ์ž‘๋™ํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ์—ฐ์žฅํ•˜์‹ญ์‹œ์˜ค. ๊ฐ€๋Šฅํ•œ OffsetHeight/width์—๋Š” ํŒจ๋”ฉ๋„ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ ๊ตฌํ˜„์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜๋„๋ก ๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚ค ํ•ซํ”ฝ์Šค๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@tobyhinloopen์ด ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ์‚ฌ์šฉํ•  ๋•Œ "์„ธ๋ จ๋œ ์†์„ฑ offsetLeft๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@zallek ์ด๋ฏธ offsetLeft ์ง€์›์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :) window.HTMLElement.prototype.offsetLeft ๋Š” ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‚ด ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tobyhinloopen์— ๊ฐ์‚ฌ ์ธ์‚ฌ๋ฅผ

@tobyhinloopen ์†”๋ฃจ์…˜์„ ๊ฒŒ์‹œํ•ด ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ offset ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  this ์ œ์™ธํ•˜๋Š” ํ•œ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. this ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚˜์˜ค๋Š”๋ฐ, ์ปจํ…์ŠคํŠธ๊ฐ€ ์‹ค์ œ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ผ์ข…์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@jordantomax ์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  โ€‹โ€‹๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์š”์†Œ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. 'this'๋Š” html ์š”์†Œ์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์š”์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@tobyhinloopen ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ๋‚ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ jest๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ this ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ž‘์€ ์ƒ˜ํ”Œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์ด ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/jordantomax/jest-htmlelement-prototype-sandbox

๊ด€๋ จํ•˜์—ฌ jest ๋ฐ jsdom์„ ์‚ฌ์šฉํ•˜์—ฌ scrollIntoView ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„์™€์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

get: () => {} ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. () => {} ํ•จ์ˆ˜ ๊ตฌ๋ฌธ์ด this ์™€ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  get() {} (๊ถŒ์žฅ) ๋˜๋Š” get: function() {} (๋Œ€์ฒด)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. @jordantomax

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this

๋˜ํ•œ ์‚ฌ์šฉ => ์—์„œ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์˜ it / describe ์˜. JEST์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ this ์˜ it / test / describe ์—๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ์นด์—๋Š” this.slow() , this.timeout(4000) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://mochajs.org/#arrow -ํ•จ์ˆ˜

๊ด€๋ จํ•˜์—ฌ jest ๋ฐ jsdom์„ ์‚ฌ์šฉํ•˜์—ฌ scrollIntoView์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ MDN์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ํด๋ฆฌํ•„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์–‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋‘ ์‹คํŒจํ•˜๋ฉด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. JSDom์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์–ด๋Š ์‹œ์ ์—์„œ ๋Œ€์‹  ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จ)์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋™์‹œ์— ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ค์‹œ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. IIRC Karma๋Š” ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค -> https://karma-runner.github.io/latest/index.html

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €(ํŒŒ์ด์–ดํญ์Šค ํฌ๋กฌ ์‚ฌํŒŒ๋ฆฌ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์—์ง€ + ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €)๋ฅผ ์—ด์—ˆ๊ณ  ๋ชจ๋‘ Karma + Mocha๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ค์‹œ ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@tobyhinloopen ๋งž์•„์š” ๋‹น์‹ ์€ ๋ชจ๋“  ๊ณ„์ •์— ์žˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! getComputedStyle ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ๋ถˆ๋ถ„๋ช…ํ•˜๋ฉฐ ํ•ด๋‹น ๋ฐฉ๋ฒ•์ด ์ฃผ์–ด์ง€๋ฉด setter๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Object.defineProperties(window.HTMLElement.prototype, {
  offsetTop: {
    get () {
      return this.marginTop
    },
    set (offset) {
      this.marginTop = offset
    }
  }
})

๋‹ค์‹œํ•œ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค๐Ÿ™

@jordantomax getComputedStyle ๋Š” ์ ์šฉ๋œ ์œ„์น˜(์Šคํƒ€์ผ์‹œํŠธ, style ์†์„ฑ ๋˜๋Š” JS์—์„œ)์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  CSS ์†์„ฑ์— ๋Œ€ํ•ด ์‹ค์ œ ๊ณ„์‚ฐ๋œ ์Šคํƒ€์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. this.marginTop ๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์•„๋งˆ๋„ ๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋ชจ๋“  CSS ์†Œํ’ˆ์ด ์•„๋‹Œ ์—ฌ๋ฐฑ์— ๋Œ€ํ•ด์„œ๋งŒ)

@tobyhinloopen ์•„,

@tobyhinloopen ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋” ์งง์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ธ๋ผ์ธ์ด ์•„๋‹Œ ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— CSS๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— getComputedStyle ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด .style ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ข‹๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.

Object.defineProperties(window.HTMLElement.prototype, {
  offsetLeft: {
    get () { return parseFloat(this.style.marginLeft) || 0 }
  },
  offsetTop: {
    get () { return parseFloat(this.style.marginTop) || 0 }
  },
  offsetHeight: {
    get () { return parseFloat(this.style.height) || 0 }
  },
  offsetWidth: {
    get () { return parseFloat(this.style.width) || 0 }
  }
})

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? offsetWidth = 0์ด ๋ฉ๋‹ˆ๋‹ค.

   const dom = new JSDOM(`<!DOCTYPE html><body></body>`);
    let document = dom.window.document
    let span = document.createElement("span");
    span.innerHtml = 'test
    span.style.fontSize = 150 + 'px';
    span.style.fontFamily = 'Arial'
    document.body.appendChild(span)
    console.log(span.offsetWidth) // 0

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? offsetWidth = 0์ด ๋ฉ๋‹ˆ๋‹ค.

@petran ๊ธ€๊ผด ํฌ๊ธฐ์™€ ์ƒ์†๋œ ๋ชจ๋“  CSS ์†์„ฑ์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— jsdom์ด SPAN์˜ ๋„ˆ๋น„๋ฅผ ๊ณ„์‚ฐํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ํ˜„์‹ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด JSDOM์˜ ๋ชฉํ‘œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ธŒ๋ผ์šฐ์ € ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์›ํ•˜์‹œ๋ฉด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰