3

我正在注册mousemove处理程序

http://jsfiddle.net/cbsub/2/ 在 Chrome 和 Firefox 上试过

部分代码是:

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

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

但是由于某种原因,它们永远不会被调用,但是会调用html,documentwindow处理程序mousemove。有什么我想念的吗?

4

3 回答 3

3

这是因为您将脚本包装在 head 和语句中。

document.getElementsByTagName("body")[0]

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

将它们包装在 window.onload 或准备好文档中,它会正常工作。

演示

由于脚本在执行时被包裹在头部,因此文档尚未加载,因此无法找到将处理程序绑定到的元素。如果未找到元素, jquery 将不会返回undefined,因此它不会破坏脚本,如果未找到元素,则原生 js 元素的文档函数返回 undefined。只有在 DOM 元素中不需要出现或出现在元素之后的东西才可用,甚至在文档准备好之前就可用。document.readydocument

$(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");
    };
});
于 2013-07-08T03:50:53.440 回答
1

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

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

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

于 2013-07-08T03:54:05.307 回答
0

通过将您的console.log声明更改alert()为窗口变得疯狂,它们都在工作。那不是你的问题。

于 2013-07-08T03:55:18.203 回答