🌐

[JavaScript] スマホやタブレットでも使える開発者ツール!

に公開

「低スペだけどスマホやタブレットですぐに使える開発者ツールが欲しい」そう思ったこと一度はありますよね?((圧
ということで、作ってみました。
まあ、Safari上でHTML編集しかできないんですけどね。

javascript:(function() {
  let html = document.documentElement.outerHTML;
  document.head.innerHTML = '';
  document.body.innerHTML = '';
  document.documentElement.style.cssText = 'margin:0;padding:0;background:#fff;color:#000;box-sizing:border-box;width:100%;height:100%;overflow:hidden;';
  document.body.style.cssText = 'margin:0;padding:0;background:#fff;color:#000;box-sizing:border-box;width:100%;height:100%;overflow:hidden;';

  let style = document.createElement('style');
  style.innerHTML = `
    ::selection { background:#d7d4f0; }
    textarea::-webkit-scrollbar { display:none; }
    textarea { -ms-overflow-style:none; scrollbar-width:none; }
  `;
  document.head.appendChild(style);

  let wrapper = document.createElement('div');
  wrapper.style = 'width:100vw;height:100vh;overflow:auto;position:relative;box-sizing:border-box;display:flex;flex-direction:column;';

  let editor = document.createElement('textarea');
  editor.value = html;
  editor.style = `
    flex:1;margin:0;padding:20px 40px 20px 20px;background:#fff;color:#000;
    font-family:monospace;font-size:13px;white-space:pre;tab-size:2;
    border:none;outline:none;box-sizing:border-box;resize:none;width:100%;height:100%;
  `;

  let spacer = document.createElement('div');
  spacer.style = 'height:120px;flex-shrink:0;background:#fff;pointer-events:none;user-select:none;';

  wrapper.appendChild(editor);
  wrapper.appendChild(spacer);

  let buttonWrap = document.createElement('div');
  buttonWrap.style = `
    position:fixed;bottom:10px;right:10px;z-index:9999;display:flex;gap:10px;
  `;

  let makeButton = (text, onClick) => {
    let btn = document.createElement('button');
    btn.textContent = text;
    btn.style = `
      background:#e8e8e8;color:#000;padding:10px 14px;border:1px solid #ccc;
      border-radius:3px;font-size:13px;font-family:sans-serif;cursor:pointer;
    `;
    btn.onclick = onClick;
    return btn;
  };

  let applyBtn = makeButton('Apply', () => {
    let raw = editor.value;
    let temp = document.createElement('html');
    temp.innerHTML = raw;
    document.replaceChild(temp, document.documentElement);

    temp.querySelectorAll('script').forEach(orig => {
      let s = document.createElement('script');
      if (orig.src) s.src = orig.src;
      else s.textContent = orig.textContent;
      if (orig.type) s.type = orig.type;
      if (orig.defer) s.defer = true;
      if (orig.async) s.async = true;
      (document.head || document.body).appendChild(s);
    });
  });

  let closeBtn = makeButton('Close', () => {
    let temp = document.createElement('html');
    temp.innerHTML = html;
    document.replaceChild(temp, document.documentElement);
  });

  buttonWrap.appendChild(applyBtn);
  buttonWrap.appendChild(closeBtn);

  document.body.appendChild(wrapper);
  document.body.appendChild(buttonWrap);
})();

使い方は簡単。開発者ツールを使いたいサイトでSafariのブックマークレットに登録して実行するだけ!
※Safariでないと使えません。

本当は、CodeMirrorでリアルタイム色付け、自動タグ閉じも実装したかったんですが、処理的に重たくなったり、カーソルジャンプが酷かったりしたので諦めました。
もしCodeMirrorの実装を軽量化、自動タグ閉じの実装、カーソルジャンプを防げたりした場合は報告とコードをコメントに送ってくれると嬉しいです(((

Discussion