Object literal + document.body.onclick не выполняет то, что я ожидаю - PullRequest
0 голосов
/ 17 января 2009

хорошо, люди, вот моя удивительная антигравитационная библиотека. Я пытаюсь определить его как литерал объекта, который я прочитал все, что делают классные дети, чтобы инкапсулировать их библиотеки. Базовые тесты показывают, что он работает правильно, но я не могу видеть document.body внутри моего объекта.

что должно произойти, когда я нажму на страницу «Это работает», должно появиться предупреждение. Вместо этого я получаю document.body = null error. что дает? Где моё тело? почему я не могу установить событие мыши для него? Я потратил впустую весь свой пятничный день с этим! Г!

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

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

}

document.onload=antigrav.activate();

Ответы [ 3 ]

4 голосов
/ 17 января 2009

Вы, вероятно, хотите сделать

document.onload=antigrav.activate;

С круглыми скобками вы устанавливаете document.onload для результата запуска antigrav.activate (), вместо указания, что вы хотите, чтобы antigrav.activate запускался как обработчик document.onload. Поэтому activ () запускался для выполнения назначения до загрузки документа, следовательно, 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;
0 голосов
/ 17 января 2009

Хорошо, люди, я дурак, но вы все равно были очень полезны.

/ 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>

Чтобы растянуть тело, я поместил div на 2000px, 2000px. полосы прокрутки есть, тело должно быть огромным, верно? В действительности, все это пространство между div имеет / вообще ничего / в нем - включая элемент body, я полагаю? Вы должны нажать на фактический текст, чтобы вызвать document.body.onclick ...

Как ни странно, (и это выявленная «странная причуда»), если вы дадите тегу тела onclick = "foo ()", то foo () срабатывает, когда вы щелкаете в любом месте страницы, включая несуществующую область тела , Я понятия не имею, почему это так, но на самом деле это была проблема. спасибо за помощь людям, вы указали и на другие хорошие методы.

0 голосов
/ 17 января 2009

ОК, здесь текущий статус:

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 ('начался')", но все равно выдает "error: document.body is null" закомментированные строки имеют одинаковый результат ...

...