仅对于 Webkit,webkitConvertPointFromPageToNode 函数处理缺失的行为:
var point = webkitConvertPointFromPageToNode(
document.getElementById("outer"),
new WebKitPoint(event.pageX, event.pageY)
);
jsFiddle:http://jsfiddle.net/kB4ra/108/
要覆盖其他浏览器,您可以使用此 StackOverflow 答案中描述的方法:https://stackoverflow.com/a/6994825/638544
function coords(event, element) {
function a(width) {
var l = 0, r = 200;
while (r - l > 0.0001) {
var mid = (r + l) / 2;
var a = document.createElement('div');
a.style.cssText = 'position: absolute;left:0;top:0;background: red;z-index: 1000;';
a.style[width ? 'width' : 'height'] = mid.toFixed(3) + '%';
a.style[width ? 'height' : 'width'] = '100%';
element.appendChild(a);
var x = document.elementFromPoint(event.clientX, event.clientY);
element.removeChild(a);
if (x === a) {
r = mid;
} else {
if (r === 200) {
return null;
}
l = mid;
}
}
return mid;
}
var l = a(true),
r = a(false);
return (l && r) ? {
x: l,
y: r
} : null;
}
这有一个缺点是当鼠标在目标元素之外时不起作用,但是应该可以将它覆盖的区域扩展任意数量(尽管很难保证它覆盖整个窗口不管多大)。
jsFiddle:http://jsfiddle.net/kB4ra/122/
这可以通过添加 mousemove 事件扩展为应用于#point:
$('#outer').mousemove(function(event){
var point = convertCoordinates(event, $("#outer"));
$("#point").css({left: point.x+1, top: point.y+1});
});
请注意,我将#point的x和y坐标调整了1px,以防止它直接位于鼠标下方;如果我不这样做,那么它会阻止拖动#inner。另一种解决方法是将处理程序添加到 #point 以检测鼠标事件并将它们传递给直接位于 #point 下方的任何元素(以及 stopPropagation,以便它们不会在较大的页面元素上运行两次)。
jsFiddle:http://jsfiddle.net/kB4ra/123/