0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

twitter widget の横幅が mobile safari でバグるのを js で直す

Last updated at Posted at 2019-04-24

結論

window.twttr = {_e: [
  (t)=>{
    t.events.bind(
      'rendered',
      (e)=> e.target.style.width=`${e.target.parentElement.clientWidth}px`
    );
  }
]}

経緯

mobile safari が iframe の width 指定をうまく処理できないバグらしい。
回避するために、無意味なCSS指定を追加するといいらしいのだが、どうも私の手元ではうまくいかなかった。まったく同じコードなのにリロードするたびに結果が変わる (多分同時に貼ってる別のウィジェットとの順序とかの影響) ので強引に Javascript で直すことにした。

twitter widget は公式に完了イベントを補足できるように作られている。これを利用するにはまず既存の widgets.js 読み出しを以下のコードに書き換え、

  window.twttr = (function (d,s,id) {
    var t, js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
    js.src="//platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs);
    return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
  }(document, "script", "twitter-wjs"));

さらに、以下のようにしてイベントハンドラを登録する。

twttr.ready(function (t) {
  t.events.bind("rendered", function (event) {
    event.target.style.width = "100px"
  });
});

というようなことが https://developer.twitter.com/en/docs/twitter-for-websites/javascript-api/guides/javascript-api に書いてある。
ところでこの twttr.ready って何?と思うまでもなく、 twttr._e に配列をセットして関数を詰めておけばいいということは容易にわかる。どうせ1つしか関数登録しないし、ready関数いらんよな、ということで冒頭のコードになる。 widgets.js は script タグで普通に読み込めばOK.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?