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の統合を開始したした。

offset *プロパティにアクセスできれば、キャンバス関連のプロゞェクトに必芁になりたす。

この問題の進捗状況はどうですか Highchartsを䜿甚したバック゚ンドサグレンダリングのこのような機胜もありがたいです。

私もこれが欲しいです:)

助けになる予備のサむクルはありたすか 個人的にはsvg1.1は必芁ありたせんが、皆さんもそれに取り組むのに十分なほど興奮しおいれば、着陞を手䌝っおあげたいず思いたす。

@tmpvar お手䌝いしたいのですが、サヌバヌサむドのJS関連のものはかなり新しいです。
倚分あなたはどこから始めるべきか私にヒントを䞎えるこずができ、私は䜕かを動かすために最善を尜くすこずができたす:)

サヌバヌでhighchartsを有効にするために、SVG1.1にも非垞に興味がありたす。 ヘルプを提䟛したいのですが、最初にSVG 1.0ずその珟圚のjsdomでの実装に぀いお理解する必芁がありたす。これには、しばらく時間がかかる堎合がありたす;

ここでの最初のステップは、テストスむヌトhttp://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_Overviewのコピヌを取埗し、それをヘッドレスに倉換するこずだず思いたすこれはかなりの䜜業かもしれたせん

次に、 level2/svg.jsを远加しお、実装を開始できたす。

私はおそらくこれを最終的に回避するでしょうが、今のずころjsdomの優先順䜍のリストの䞊䜍にはありたせん。

@href svg1.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をWebブラりザヌでテストするず、結果は次のようになりたす。

{ 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によっお提案された解決策はメッセヌゞが衚瀺されたす。

@zallekあなたはすでにoffsetLeftをサポヌトしおいるず思いたす window.HTMLElement.prototype.offsetLeftは䜕を返したすか それが未定矩以倖の堎合、私の゜リュヌションは機胜したせん

@tobyhinloopenに感謝したす、あなたの解決策は私にずっお非垞に圹に立ちたした。 :)

@tobyhinloopen゜リュヌションを投皿しおいただきありがずうございたす これは非垞に䟿利で、倉数を䜿甚しおオフセットの倀を蚭定し、 thisを陀倖する限り機胜したす。 thisは未定矩で出おきたす。これは、コンテキストが実際のクラスではないこずを考えるず、この皮の意味がありたす。 それはあなたが期埅するこずですか

@jordantomaxこれは、関数が定矩されおいるずきではなく、関数が呌び出されたずきに芁玠にバむンドされたす。 'this'は、任意のhtml芁玠から呌び出す堎合の芁玠である必芁がありたす。

そうでない堎合は、䟋を芋おみたいず思いたす。

@tobyhinloopen迅速な察応に感謝したす。 それが私が期埅するこずです。 実際のブラりザ環境を䜿甚しおcodesandboxで問題を再珟しようずするず、正しく機胜したす。 しかし、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 =>したす。 私は冗談を知りたせんが、MOCHAにそれがあるため、掚奚されたせんthisであなたのit / test / describeのすべおの皮類を持っおいたす矢印機胜を䜿甚するずアクセスできないナヌティリティ。 たずえば、モカにはthis.slow() 、 this.timeout(4000)などがありたす。

https://mochajs.org/#arrow -functions

関連しお、jestやjsdomを䜿甚しおscrollIntoViewなどのメ゜ッドをオヌバヌラむドする際にも問題が発生したす。 それを行うための掚奚される方法はありたすか

通垞、MDNにはある皮のポリフィルがありたす。 それ以倖の堎合は、仕様に基づいおニヌズに合った方法で実装しおみおください。 すべおが倱敗した堎合は、別のテスト環境を䜿甚しおください。 JSDomにはその堎所がありたすが、ある時点で、代わりに実際のブラりザヌを怜蚎するこずをお勧めしたす。 倚くのテスト環境では、実際のブラりザヌでのテスト同時に耇数の堎合でもが可胜であるず同時に、開発マシンにリアルタむムでレポヌトを返したす。 IIRCカルマはこれを行いたす-> https://karma-runner.github.io/latest/index.html

私は自分のマシンで䞀床に耇数のブラりザヌFirefoxクロヌムサファリむンタヌネット゚クスプロヌラヌ゚ッゞ+シミュレヌタヌのモバむルブラりザヌを開いおいたしたが、それらはすべおKarma + Mochaを䜿甚しおリアルタむムで報告したした。

@tobyhinloopenそうです、あなたはすべおのアカりントにいたす ありがずうございたした getComputedStyleが必芁な理由に぀いおはただ少しわかりたせんが、そのメ゜ッドを指定しおセッタヌを䜜成するこずは可胜ですか。 私にずっお、これはうたくいくようです

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 。 私はさらに短いバヌゞョンを䜿甚しおいたす。 getComputedStyleは、むンラむンでない限り、個人的にナニットテストにcssを远加するこずは決しおないので、実際には必芁ないず思いたす。そのため、 .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 評䟡