Debug friendly な ON/OFF できるロールオーバー機能の実装
SubmitボタンのonClickイベントの流れを追いたいのに、Submitボタンに仕掛けられたロールオーバー機能(mouseover等)にデバッガの制御を奪われて、しかもその先がMinifyされたライブラリで、イラッとしたことはありませんか?
デバッグ中はロールオーバーを一括でOFFにして、あとで戻せればいいじゃない? と思い、そのような機能を作ってみました。
jsdo.it で試せます http://jsdo.it/uupaa/DebugFriendlyRollover
<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8" /> <title></title> <style> .rollover { outline: 5px solid green; } </style> <script src="src/uupaa.js"></script> <script> uu.ready(function(uu, doc) { uu.add([ uu.click(uu.button("rollover target button1"), fire), uu.click(uu.button("rollover target button2"), fire), uu.click(uu.button("rollover target button3"), fire), uu.click(uu.button("rollover target button4"), fire) ]); uu.rollover(uu.query("button"), "rollover"); }); function fire(evt) { alert("onclick"); } function handleClick(evt, off) { if (off) { uu.rollover.disable(); alert('ロールオーバーをOFFにしました') } else { uu.rollover.enable(); alert('ロールオーバーをONにしました') } } (function(uu) { // build struct uu.rollover = uu.mix(uurollover, { enable: uurolloverrebind.bind(null, true), // Function#bind(null, true) disable: uurolloverrebind.bind(null, false) // Function#bind(null, false) }); uu.unrollover = unrollover; // uu.rollover - bind rollover handler function uurollover(node, // @param NodeArray/Node: roll) { // @param ClassNameString/CallbackFunction: var db = uurollover._, ary = node.nodeType ? [node] : node, // toArray i = 0, iz = ary.length; for (; i < iz; ++i) { uu.event.hover(ary[i], roll, "rollover"); // hint("rollover") db.node.push(ary[i]); db.roll.push(roll); db.disable.push(false); } } // uu.unrollover - unbind rollover handler function unrollover(node) { // @param NodeArray/Node(= void): var db = uurollover._, ary = node.nodeType ? [node] : node, // toArray i = 0, iz = ary.length, pos; for (; i < iz; ++i) { pos = db.node.indexOf(ary[i]); if (pos >= 0) { uu.event.unhover(ary[i]); db.node.splice(pos, 1); // remove db.roll.splice(pos, 1); db.disable.splice(pos, 1); } } } // inner - uu.rollover.rebind function uurolloverrebind(enable) { // @param Boolean: true -> hover, false -> unhover var db = uurollover._, ary = db.node, i = 0, iz = ary.length, j, jz, fn = enable ? uu.event.hover : uu.event.unhover; for (; i < iz; ++i) { if (enable === db.disable[i]) { fn(ary[i], db.roll[i], "rollover"); db.disable[i] = !enable; } } } // db uurollover._ = { node: [], // Node: roll: [], // ClassNameString/CallbackFunction: disable: [] // Boolean: }; })(uu); </script> </head><body> <p>debug friendly な ON/OFF できるロールオーバー機能の実装</p> <input type="button" value="rollover off()" onclick="handleClick(event, true)" /> <input type="button" value="rollover on()" onclick="handleClick(event, false)" /> <hr /> </body></html>
rollover がデバッグのジャマになるときは、コンソールに
uu.rollover.disable()
とタイプしてください。
uu.rollover を使って仕掛けた mouseover ハンドラなどが一括で外れます。
uupaa.js 0.8 上では uu.rollover → uu.event.rollover となる予定です
。