2008-11-11 2 views
1

У меня есть этот кусок Javascript, и он просто не сработает. Я все проверил JSlint, но сказал, что все работает. Все еще не работает. Javascript находится не в HTML, но связан в <head>Javascript: var is null

примечание: я работаю с локальным сервером, поэтому pageload мгновенно.

function changeVisibility() { 
    var a = document.getElementById('invisible'); 
    a.style.display = 'block'; 
} 

var changed = document.getElementById('click1'); 
changed.onchange = changeVisibility; 

Это Вот соответствующий HTML

<input type="file" name="click[]" size="35" id="click1" /> 
<div id="invisible" style="display: none;"> 
    <a href="javascript:addFileInput();">Attach another File</a> 
</div> 

Так что же происходит я нажимаю на входе, выберите файл и утвердить. Затем включаются триггеры событий обмена и стиль моего невидимого div для блокировки.

Проблема, я получаю эту ошибку:

"измененное пуста: changed.onchange = changeVisibility;"

Я не понимаю, я серьезно не понимаю, что я здесь просматриваю.


EDIT: ответ на вопрос, спасибо Mercutio за вашу помощь и все остальное тоже, конечно. Окончательный код:

function loadEvents() { 
    var changed = document.getElementById('click1'); 
    var a = document.getElementById('invisible'); 
    document.getElementById('addField').onclick = addFileInput; 

    changed.onchange = function() { 
     a.style.display = 'block'; 
    } 
} 
if (document.getElementById) window.onload = loadEvents; 

Это здесь соответствующий HTML:

<input type="file" name="click[]" size="35" id="click1" /> 
<div id="invisible" style="display: none;"> 
    <a href="#">Attach another File</a> 
</div> 

Кроме того, спасибо за ссылку на JSbin, не знал о том, что выглядит изящная.

+1

Редактирование вопроса и ЗАМЕНА оригинального контента полностью уничтожили эту тему для дальнейшего использования. Пожалуйста, помните об этом в будущем. – EndangeredMassa 2008-11-11 00:39:12

+1

Я отредактировал и поставил исходную проблему в начале для будущих читателей. – nickf 2008-11-11 00:58:37

ответ

8

Это похоже на то, что объект DOM не существует во время ссылки на него. Возможно изменить код, чтобы выполнить после того, как документ полностью загрузится (или поместить JavaScript в нижней части страницы)

note: I am working with a local server, so pageload in instant.

, что это не проблема - составные части документа загружаются в порядке. Это не имеет значения, насколько быстро они будут загружены, некоторые вещи случаются перед другими: D

The onlything I'd like to do now is remove the Javascript link from the ...

Разместить ID там, и внутри функции сделать это:

document.getElementById('addField').onclick = addFileInput; 

Или, как вы уже имеют div как переменную 'a':

a.firstChild.onclick = addFileInput; 

Но это, очевидно, оставляет вас с недопустимым тегом привязки. Лучшая практика предполагает, что вы должны предоставить способ сделать это без javascript и переопределить эту функциональность с помощью javascript-метода, если он доступен.

+0

Меркуцио, ты спасатель. Мой HTML теперь без Javascript. Большое спасибо. – Vordreller 2008-11-11 00:43:09

0

Вам необходимо обернуть свой код в обработчик события window.onload, обработчик события domReady (доступный в большинстве современных js-фреймворков и библиотек) или в нижней части страницы.

В нижней части страницы хорошо работает, как вы можете видеть here.

Разделение ответчика событий от вашей разметки распространяется на тему «Ненавязчивый JavaScript» и может обрабатываться различными способами. В общем, вы хотите объявить ответчиков событий в событии window.onload или document.ready.

0

Я думаю, это потому, что вы пытаетесь изменить элемент файла.

Браузеры обычно не позволяют вам это делать. Если вы хотите показать или скрыть их, поместите их в div и покажите или скройте это.

1

mercutio является правильным. Если этот код выполняется в HEAD, вызов «document.getElementById (« click1 ») всегда будет возвращать значение null, поскольку тело еще не было проанализировано. Возможно, вы должны поместить эту логику внутри обработчика события onload.

0

Правильно, я изменил все, основываясь на ваших коллективных усталостях, и теперь это работает. Единственное, что меня беспокоит, - это прямая ссылка на Javascript внутри якоря.