为什么div和body没有得到mousemove事件?

时间:2013-07-08 03:47:41

标签: javascript jquery javascript-events

我正在

注册mousemove个处理程序 在Chrome和Firefox上试用了

http://jsfiddle.net/cbsub/2/

部分代码是:

$("body").on("mousemove", function () {
    console.log("$('body') mousemove listener invoked");
});

$("#foo").on("mousemove", function () {
    console.log("$('#foo') mousemove listener invoked");
});

但出于某种原因,他们永远不会被调用,但会调用html的{​​{1}},documentwindow处理程序。有什么我想念的吗?

3 个答案:

答案 0 :(得分:3)

这是因为你有脚本和声明包装的脚本。

document.getElementsByTagName("body")[0]

返回undefined并且您的脚本会中断,因此除了执行之外没有任何事件处理程序附件代码。

将它们包装在window.onload或文档就绪,它将正常工作。

<强> Demo

由于脚本在执行时被包裹在头部,因此文档尚未加载,并且无法找到要将处理程序绑定到的元素。如果找不到元素,jquery将不会返回undefined,因此它不会破坏脚本,因为如果找不到元素,本机js元素的文档函数将返回undefined。 只有不需要在document.ready中或在DOM中的元素之后出现的内容document即使在文档准备好之前也可用。

$(function () { //document.ready
    $(window).on("mousemove", function () {
        console.log("window mousemove listener invoked");
    });

    $(document).on("mousemove", function () {
        console.log("document mousemove listener invoked");
    });

    $(document.documentElement).on("mousemove", function () {
        console.log("document.documentElement mousemove listener invoked");
    });

    $(document.body).on("mousemove", function () {
        console.log("document.body mousemove listener invoked");
    });

    $("body").on("mousemove", function () {
        console.log("$('body') mousemove listener invoked");
    });

    $("#foo").on("mousemove", function () {
        console.log("$('#foo') mousemove listener invoked");
    });

    $("#foo").mousemove(function () {
        console.log("$('#foo') mousemove listener invoked");
    });

    document.getElementsByTagName("body")[0].onmousemove = function () {
        console.log("DOM level 0 body mousemove listener invoked");
    };

    document.getElementById("foo").onmousemove = function () {
        console.log("DOM level 0 foo mousemove listener invoked");
    };
});

答案 1 :(得分:1)

小提琴工作正常。但是始终将您的Js代码包含在document.onready函数

$(function(){
< your Js code here >
});

这是因为在浏览器呈现元素之前读取代码,因此在阅读时它无法绑定到任何甚至不存在的内容。因此,您的代码可能无效。

答案 2 :(得分:0)

通过将console.log语句更改为alert()窗口发疯,它们都在工作。那不是你的问题。