我认为问题在于您使用了
querySelector
,这只会获取第一个活动元素。但是您的锚点要远得多。
更新:有趣的是,我在Firefox或Opera中什么都没有得到,但是在Chrome中却有。以下是Chrome结果。请参见下面的更多信息。
考虑以下内容(
实时演示):
document.addEventListener("mousedown", handler, false);
function handler(e){
console.log(
"event " + e.type + ": " +
Array.prototype.join.call(document.querySelectorAll("*:active")));
}
当我点击锚点时,控制台会显示以下内容:
事件mousedown:[object HTMLHtmlElement],[object HTMLBodyElement],[object HTMLDivElement],http://fiddle.jshell.net/_display/#
请注意末尾的URL,它是
HTMLAnchroElement
实例的默认
toString
,由
join
触发。
由于
querySelectorAll
需要按文档顺序返回元素,如果要获取最具体的活动元素,则应该使用最后一个。例如(
实时演示):
(function() {
document.addEventListener("mousedown",handler, false);
function handler(e){
var active = document.querySelectorAll("*:active");
var specific = active && active.length && active[active.length-1];
display("Most specific active element: " +
(specific ? specific.tagName : "(none)"));
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
在我的情况下(使用Chrome),如果我点击链接,我会看到最具体元素的标签名称(锚点等)。
看起来Chrome正在遵循规范,而Firefox和Opera没有。从CSS3选择器规范的
第6.6.1.2节中可以看出:
:active
伪类应用于用户激活元素时。例如,在用户按下鼠标按钮和释放它之间。
因此,在上面的情况下应该应用
:active
。如果我们使用以下CSS,则支持这种断言:
*:active {
background-color: red;
}
使用以下JavaScript代码:
(function() {
document.addEventListener("mousedown", mouseDown, false);
document.addEventListener("mouseup", mouseUp, false);
function mouseDown(){
var active = document.querySelectorAll("*:active");
var specific = active && active.length && active[active.length-1];
display("Mouse down: Most specific active element: " +
(specific ? specific.tagName : "(none)"));
}
function mouseUp() {
display("Mouse up");
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
现场演示
我尝试了三种浏览器(Chrome,Firefox,Opera),当鼠标按下时,元素会变成红色背景,并在释放后变为白色;但是mousedown
处理程序在Firefox或Opera中看不到:active
元素,只有Chrome可以。
但我不是CSS规范的律师。 :-)
e.target
记录了锚点。 - bfavarettoe.target
确实记录了锚点,但第一个记录了 *null
*。 - Asad Saeeduddin