Object literal + document.body.onclick没有做我期望的事情

时间:2009-01-17 05:20:55

标签: javascript object-literal

好的,这里的人是我惊人的反重力图书馆。我试图将它定义为一个对象文字,呃,我读了所有很酷的孩子正在做的,以便封装他们的库。基本测试表明它工作正常,但我似乎无法从我的对象中看到document.body。

当我点击页面“它正在工作”应该提醒时应该发生什么。相反,我得到一个document.body = null错误。是什么赋予了?我的身体在哪里?为什么我不能为它设置鼠标事件?我整个星期五都浪费了这个!尔加!

antigrav={
activate:function(){
    // turn on antigrav
    document.body.onmousedown = antigrav.startPan();
},

startPan:function(event){
    alert('it is working!');
},

}

document.onload=antigrav.activate();

3 个答案:

答案 0 :(得分:4)

您可能想要

document.onload=antigrav.activate;

使用括号,您将document.onload设置为运行antigrav.activate()的结果,而不是指示您希望antigrav.activate作为document.onload处理程序运行。因此,在加载文档之前,运行activate()以进行赋值,因此document.body尚未定义。

你想为onmousedown处理程序赋值做同样的事情:

document.body.onmousedown = antigrav.startPan;

试试这个,我也不得不切换到window.onload ...

另外,请注意对象文字定义中的尾随逗号。 Firefox对他们没问题,但IE窒息。所以,总而言之:

var antigrav={
    activate:function(){
        // turn on antigrav
        document.body.onmousedown = antigrav.startPan;
    },
    startPan:function(event){
        alert('it is working!');
    }
};
window.onload=antigrav.activate;

答案 1 :(得分:0)

这里是当前状态:

var antigrav={
activate:function(){
    // turn on antigrav
    alert('started');
    document.body.onmouseup = antigrav.startPan;
    // make flash shield
},

startPan:function(event){
    alert('dude, you are panning!');
},


}
antigrav.activate();
//document.onload=window.antigrav.startPan;

它达到“alert('started'),但仍然抛出”错误:document.body为null“ 注释掉的行有相同的结果......

答案 2 :(得分:0)

好的,伙计们,我是个傻瓜,但无论如何你都非常乐于助人。

/ real / problem,与任何事情无关,并揭示了一个奇怪的body.onclick行为的怪癖:

在我/ HTML /中我试图设置一个大文档来测试我的点击次数:

<html>
<script src="antigrav.js"></script>
<body onload='test()'>
<!--<body onload="antigrav.activate();"  >-->

    yo, fool, this is the body!

    <div style="position:absolute; top:2000px;  left:2000px;">
        it is mad wide and tall!
    </div>

</body>
</html>

为了伸展身体,我在2000px,2000px处放置了一个div。滚动条在那里,身体必须是巨大的,对吧?实际上,div之间的所有空间都有/什么都没有 - 包括身体元素,我猜?您必须单击实际文本才能触发document.body.onclick ...

奇怪的是,(这是显露出来的“奇怪的怪癖”)如果你给body标签一个onclick =“foo()”,当你点击页面上的任何地方时都会触发foo(),包括不存在的身体区域。我不知道为什么会这样,但那确实是问题所在。感谢您的帮助,您也指出了其他一些好技术。