Javascript проблема решена, не понимаю, в чем проблема - PullRequest
3 голосов
/ 26 августа 2009

В разделе заголовка HTML:

<script type="text/javascript" src="Scripts/editScripts.js"></script>

Чуть выше тега </body> (закрывающий тег, внизу html-страницы). Также: это старый код, так было, когда он не работал :

    <script type="text/javascript">if(document.getElementById)initialize();loadEvents();</script>
  </body>
</html>  

В файле editScripts.js:

/*global document,addFileInput*/
function loadEvents() {
    var a = document.getElementById('addField');
    a.onclick = addFileInput;
}
var upload_number = 2;
function addFileInput() {
    var d = document.createElement("div");
    var file = document.createElement("input");
    file.setAttribute("type", "file");
    file.setAttribute("name", "addFile[]");
    file.setAttribute("size", "35");
    file.setAttribute("class", "file");
    file.setAttribute("id", "addFile"+upload_number);
    d.appendChild(file);
    document.getElementById("moreUploads").appendChild(d);
    upload_number++;
}

Это не сработает. Я заменяю JavaScript в нижнем колонтитуле следующим:
Это новый код, который работает так, как я ожидаю. :

<script type="text/javascript">if (document.getElementById)loadEvents();</script>

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

Ответы [ 4 ]

4 голосов
/ 26 августа 2009

В операторе if без скобок только первый оператор является условным. Каждый следующий за ним оператор безусловный независимо от отступа.

Таким образом, в первом примере loadevents() выполняется безоговорочно.

1 голос
/ 26 августа 2009

Браузер сообщил бы об ошибке при попытке вызвать функцию «initialize», так как такой функции не было. Следовательно, следующая строка, где вы называете loadEvents, не будет работать. Смотрите этот пример:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>JS Error Test</title>
    </head>
    <body>
        <script type="text/javascript">
            if(document.getElementById) {
                initialize();
                alert("You shouldn't see me!");
            }
        </script>
    </body>
</html>

В этом примере окно предупреждения не должно появляться, потому что я не объявил функцию «initialize», и браузер сообщит об ошибке JS. Однако удаление функции «инициализация» вызовет появление окна с предупреждением.

Так вот, устраняя причину ошибки Javascript, вы исправили свою проблему.

1 голос
/ 26 августа 2009

вероятно, потому что вы не вызываете свои скрипты при событии загрузки документа. поэтому, когда вы вызывали свои скрипты в заголовке до , когда ваш dom полностью загружен, ничего из этого не работало, но теперь, когда вы вызываете его после загрузки dom, оно работает.

Правильным исправлением для всего этого должен быть вызов ваших скриптов после полной загрузки документа или, по крайней мере, из события onload тела:

<body onload="initScripts()">

А затем добавьте все скрипты, которые вы хотите запустить при загрузке страницы, в функции initScripts.

также, есть гораздо лучшие способы сделать это, например, с помощью jquery и / или прочитать это: http://onlinetools.org/articles/unobtrusivejavascript/chapter4.html

0 голосов
/ 26 августа 2009

Вы говорите: «Я не понимаю, как исключение этого вызова функции, даже если функция, на которую она ссылалась, не существует, так по-королевски все испортила» Это не соответствует остальной части вашего вопроса, что подразумевает, что добавление вызова испортило все. Но я думаю, что текст, который я цитирую, является правильным описанием.

Вот реальный ответ. Старый код:

if(document.getElementById)loadEvents();

не вызывает loadEvents, если getElementsById не определен. Это не определено во всех браузерах.

Новый код, вместо этого, вы не только пропускаете вызов функции: семантика также меняется.

if(document.getElementById)initialize();loadEvents();

всегда вызывает loadEvents, поэтому всегда происходит то, что вы хотите.

...