読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

Arrow.jsを使ってみる

Home · motemen/arrow-js Wiki · GitHubが、便利そう。でも正直使いこなせてない。

// ==UserScript==
// @name           AutoResizeTextArea
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http*
// @require        http://github.com/motemen/arrow-js/tree/master%2FArrow.js?raw=true
// ==/UserScript==
function autoResizeTextArea(parent) {
  Array.forEach(
    parent.getElementsByTagName("textarea"),
    function(elem) {
      with (elem.style) {
        overflowY = "hidden";
        minHeight = getComputedStyle(elem, null).height;
      }
      Arrow.Event(elem, "input")[">>>"](
        function({target: elem}) {
          elem.rows = elem.value.split("\n").length;
        }).
        loop().run();
    });
}
autoResizeTextArea(document.body);
if ("AutoPagerize" in window)
  window.AutoPagerize.addFilter(
    function(docs) {
      docs.forEach(autoResizeTextArea);
    });

これだと普通にaddEventListener使うのと変わらないか。

Arrow.XHRと["<+>"]とArrow.DelayとArrow.Stopを使って、タイムアウトを実装しようと思ったけど、Arrow.Stopを使ってもArrow.XHRが出したリクエストは止められないので、無理だった。

ここから下はArrowあんまり関係ない。
タイムアウト付きの関数:

function xhr(url, callback, ms) {
  with (new XMLHttpRequest()) {
    open('get', url);
    addEventListener("load", callback, false);
    send();
    setTimeout(function() {
        abort();
        removeEventListener("load", callback, false);
      }, ms);
  }
}

msを省略できるように、
setTimeoutを

    setTimeout(function() {
        abort();
        removeEventListener("load", callback, false);
      }, typeof ms == "undefined"? Infinity: ms);

としたけど、Infinityが0としてすぐ呼び出されてしまうのでうまく動かない。
これはTwitter / javascripter: setTimeout(alert, Infinityにも書いた。
普通に

    if (typeof ms == "undefined") return;
    setTimeout(function() {
        abort();
        removeEventListener("load", callback, false);
      }, ms);

とすると、うまくいく。
arguments.lengthではなくtypeof hoge == "undefined"を使っているのは、hoge.apply(this, [123,,true]);みたいに、applyを使って省略できるようにするため。