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を使って省略できるようにするため。