DOM Future と DOM の将来

わかば (id:wakabatan)

自己紹介

わかば

id:wakabatan

JavaScript は15年目くらい

株式会社はてな アプリケーションエンジニア
www c h m s developer copie let ugomemo (h2 l)

仕事では JavaScript 書いてない 最近たまに書いてる

DOM Future と DOM の将来

DOM の歴史

DOM Standard

DOM Standard の歴史

DOM3 から変わったこと

もっと JavaScript っぽく


// DOM
new Document
new Text ("Hoge")
new MouseEvent ("click", {bubbles: true, view: window})

// DOM2
document.implementation.createDocument (null, null, null)
document.createTextNode ("Hoge")
ev = document.createEvent ("MouseEvent"); ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)

exception.name === 'HierarchyRequestError'         // DOM
exception.code === exception.HIERARCHY_REQUEST_ERR // DOM1-3

object.addEventListener ("click", function (ev) { ... }) // 第3引数は省略可能に

MutationObserver


var observer = new MutationObserver (function (records) {
  ...
});
observer.observe (element, {childNodes: true, characterData: true});

新しい木操作メソッド


element.append ("Hoge", childElement1, childElement2, "fuga");

element.appendChild (document.createTextNode ("Hoge"));
element.appendChild (childElement1);
element.appendChild (childElement2);
element.appendChild (document.createTextNode ("fuga"));

element.before (childNode, "text");

element.parentNode.insertBefore (childNode, element);
element.parentNode.insertBefore (document.createTextNode ("text"), element);

node.after ("text", childNode);
node.replace ("hoge");
node.remove ();

Future

Future 使わない例


xhr.onreadystatechange = function () {
  if (xhr.readyState == 4) {
    if (xhr.status == 200) {
      if (xhr.responseText == '') {
        alert ('error');
      } else {
        var xhr2 = new XMLHttpRequest ();
        xhr2.open ('GET', xhr.responseText, true);
        xhr2.onreadystatechange = function () {
          if (xhr2.readyState == 4) {
            if (xhr2.status == 200) {
              step3 ();
            } else {
              alert ('error');
            }
          }
        };
        xhr2.send (null);
      }
    } else {
      alert ('error');
    }
  }
};

Future 使った例


xhr.send ().then (function () {
  if (xhr.status == 200) {
    if (xhr.responseText == '') {
      throw "error";
    } else {
      return xhr.responseText;
    }
  } else {
    throw "error";
  }
}).then (function (path) {
  var xhr2 = new XMLHttpRequest ();
  xhr2.open ('GET', path, true);
  return xhr2.send (); // Future を返す
}).then (function () {
  step3 ();
}).catch (function (e) {
  alert (e.name);
});

「実行中かこれから実行されるかもう実行完了した操作」


document.ready().then(...)
navigator.geolocation.getCurrentPosition().then(...)
indexDB.open(name).then(...)

new Future (function (resolver) {
  if (...) {
    resolver.accept(...);
  } else {
    resolver.reject("error");
  }
}).then(...)

Future の組み合わせ


Future.any(future1, future2, ...).then(...)
Future.some(future1, future2, ...).then(...)
Future.every(future1, future2, ...).then(...)


Future.every(fetchJSON("/user/mario"), fetchJSON("/user/luigi")).done(
  function(mario, luigi) { ... },
  showFailcat
)

DOM の将来

参考文献

終わり

この発表資料は Kyoto.js のページ https://github.com/kyotojs/meetup/wiki/8 に置く予定です。