mousemove + elementFromPoint でマウスカーソルが示すノードを取得
mousemove と elementFromPoint を使うと、マウスカーソル直下のノードを取得できます。
- elementFromPoint のサポート状況
デモ
http://pigs.sourceforge.jp/blog/20100401/test/uu.Class.ElementFromPoint.htm
IE6+, Safari3.1+, Firefox3+, Google Chrome4+, Opera9.5+ で動きます。
コード
// === elementFromPoint === //{{{!depend uu, uu.class //}}}!depend uu.Class.ElementFromPoint || (function(win, doc, uu) { // client coordinates // true: Safari3x, Safari4, Opera9.x, Opera10.10 // false: IE, Gecko, Chrome4, Opera10.50 var _clientCoordinates = uu.ver.safari || (uu.ver.opera && !uu.ver.jit); // uu.Class.ElementFromPoint uu.Class("ElementFromPoint", { init: init, // init(callback:Function) handleEvent: handleEvent // handleEvent(evt:EventObjectEx) }); // uu.Class.ElementFromPoint.init function init(callback) { // @param Function: callback this._callback = callback; uu.event(doc, "mousemove+", this); // document.addEventListener("mousemove", true) 相当 } // uu.Class.ElementFromPoint.handleEvent function handleEvent(evt) { // @param EventObjectEx: var node, px, py; // クロスブラウザなあーだこーだ if (uu.ie) { // IE px = evt.clientX; py = evt.clientY; } else if (_clientCoordinates) { // Safari, Opera9.x - Opera10.10 px = evt.clientX + win.pageXOffset; py = evt.clientY + win.pageYOffset; } else { // IE, Firefox, Google Chrome px = evt.pageX - win.pageXOffset; py = evt.pageY - win.pageYOffset; } node = doc.elementFromPoint(px, py); // Opera9.x has text-node if (node.nodeType === 3) { node = node.parentNode; } if (node) { this._callback(evt, node); } } })(window, document, uu);
<script> function xboot(uu) { // このへんはオマケ var tgts = uu.klass("tgt"), grips = uu.klass("grip"); uu.factory("Drag", tgts[0], grips[0], { wheel: 1, minw: 100, minh: 100, maxw: 200 }); uu.factory("Drag", tgts[1], grips[1], { wheel: 1 }); uu.factory("Draggable", uu.klass("draggable"), uu.klass("droppable")); // このへんが本題 uu.factory("ElementFromPoint", function(evt, node) { var info = uu.format("? (?,?) - ? - ?", node.tagName, evt.px, evt.py, uu.xpath(node), uu.json(node)); window.status = info; if (!uu.ver.ie6) { uu.id("trace").innerText = info; } }); } </script>
より詳しくは
@edvakf さんのすてきなエントリをどうぞ。
http://d.hatena.ne.jp/edvakf/20100205/1265338487