базовое предупреждение javascript не работает в редакторе кода Intel XDK

Я начинаю все заново с нового пустого проекта Intel, но еще даже не начал программировать. Я просто настраиваю свое файловое дерево и убеждаюсь, что страницы html и javascript подключены через правильные якоря и пути сценариев. Однако мой первый файл .js не будет работать.

Я включил скриншот тестового кода и ошибок. Я знаю, что синтаксис правильный, потому что он работает, когда я помещаю его в теги <script> в файле index.html. Однако я получаю ошибки «документ не определен» и «предупреждение не определено» или страницу js. Я не знаю, что это значит.

Я подумал, что мой путь src тега сценария в файле индекса неверен, но все пути являются относительными в закомментированных тегах сценария шаблона, которые Intel предоставляет на странице индекса прямо из коробки, так почему я должен использовать абсолютный путь?

Мой путь: js/Test.js, и это последний тег скрипта перед телом.

файл js с ошибками

введите здесь описание изображения файл Index.html

*****ОБНОВИТЬ****

Итак, я пробовал несколько вещей, и это все еще не работает, но мне удалось сократить свои ошибки до одной необъяснимой «отсутствующей точки с запятой», которая превратится в «ненужную ошибку точки с запятой», если я ее поставлю. В любом случае, как видно из первого снимка экрана, я не помещал объект документа внутрь явно объявленной переменной. Как только я сделал это и получил к нему доступ через точечный синтаксис вместо знака равенства, я перестал получать ошибку. Я включил этот снимок экрана, чтобы показать свою работу до внесения изменений. неиспользование ключевого слова var приводило к ошибке

поэтому проблема, с которой я столкнулся, заключалась в том, что если каждая функция или объект dom не были объявлены с помощью «Var», я получил бы ошибку. Это включает в себя функцию alert(), которую я никогда не видел, чтобы ее нужно было объявлять таким образом, но я дал редактору кода то, что он хотел, и этот последний снимок экрана является результатом. Это не работает, НО я не получаю ошибок, которые были раньше, за исключением парадокса отсутствующей/ненужной точки с запятой. Удаление или включение выдает ошибку. Ошибок нет, но не работает


person Spilot    schedule 10.01.2016    source источник
comment
Почему я смотрю на скриншоты кода, а не на текст?   -  person Lee Taylor    schedule 13.01.2016
comment
Почему это имеет значение? Пока вам было интересно, что кто-то другой ответил на вопрос и получил награду.   -  person Spilot    schedule 14.01.2016
comment
Это важно, потому что изображения недоступны для поиска. Хотя это может ответить на ваш вопрос, все после поиска по тексту в вашем коде не найдут этот вопрос. Следовательно, скриншоты кода и/или ошибок не рекомендуются   -  person Leon Adler    schedule 18.01.2016


Ответы (4)


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

Например, если вы хотите включить свои файлы JavaScript в head файла HTML, тогда вы должны обернуть код JavaScript либо DOMContentLoaded, либо кодом $(document).ready() jQuery.

Распространенное заблуждение об использовании window.onload не решит проблему неправильной загрузки элементов.

Сеть разработчиков Mozilla сообщает на этой странице:

Событие DOMContentLoaded запускается, когда исходный HTML-документ полностью загружен и проанализирован, не дожидаясь окончания загрузки таблиц стилей, изображений и подфреймов. Совсем другое событие — загрузка — следует использовать только для обнаружения полностью загруженной страницы. Невероятно популярная ошибка — использовать load вместо DOMContentLoaded, так что будьте осторожны.

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

Ванильный

document.addEventListener("DOMContentLoaded", function (e) {
    /** DOM has been fully loaded here, so manipulation can begin. **/
    /** Your code here. **/
});

JQuery

$(document).ready(function () {
    /** DOM has been fully loaded here, so manipulation can begin. **/
    /** Your code here. **/
});

Нажмите эту ссылку, чтобы увидеть разницу между ваниль и jQuery.

Второй способ, которым вы можете загрузить JavaScript, заключается в том, что все теги script находятся внутри тела, но после всего HTML, таким образом, он гарантированно загружается после HTML.

Пример

Попробуйте этот рабочий пример, который я быстро написал.

HTML

Замените содержимое тега body вашего HTML на следующее:

<button id="myJsTest">Click Me!</button>
<div id="clickCounter">Click Count: 0</div>

Замените содержимое вашего JavaScript следующим:

JavaScript

document.addEventListener("DOMContentLoaded", function() {
    var clickCount = 0;

    document.getElementById("myJsTest").addEventListener("click", function() {
        clickCount++;

        document.getElementById("clickCounter").innerText = "Click Count: " + clickCount;
    });
});

Затем используйте вкладку Эмуляция в Intel XDK, чтобы протестировать ее.

Дополнительная информация

Когда я использую Intel XDK и у меня возникает ошибка, я быстро загружаю файл в браузер и проверяю консоль. Это может быть действительно полезным и эффективным способом избавиться от этих надоедливых маленьких ошибок.

Попробуйте использовать window.alert, так как alert определено в объекте window.

person Script47    schedule 12.01.2016
comment
это работает, но я не могу заставить оповещение работать. Если я не объявлю пустую переменную с именем alert, Intel выдаст ошибку, когда я попытаюсь использовать функцию alert(). Что-то в этом кажется неправильным, но это единственное, что предотвратит появление ошибки, кроме того, это ПО-ПРЕЖНЕМУ не работает, а это означает, что оповещение по-прежнему не срабатывает. Я попытался поместить предупреждение прямо в код прослушивателя событий, который вы написали. - person Spilot; 13.01.2016
comment
@Spilot, попробуй window.alert. Также не могли бы вы показать мне ваш обновленный код. - person Script47; 13.01.2016
comment
Хорошо, это сработало. Я не уверен, почему редактор кода Intel требует, чтобы вы прошли через объект окна dom для предупреждения, но это так. Это также требует, чтобы вы сначала объявляли каждый объект dom, прежде чем использовать его. Так что это как быть var window; var document, а затем в прослушивателе событий я могу сделать document.getElementById..etc. В любом случае спасибо @Script47. Вы получаете награду! - person Spilot; 13.01.2016
comment
Также стоит отметить для будущих зрителей этого вопроса, что window.alert по какой-то причине не работал вне прослушивателя событий DOMcontentLoaded. Это может быть связано с Intel XDK или нет, я не знаю. - person Spilot; 13.01.2016

Причина, по которой вы видите все эти сообщения об ошибках в окне редактора, заключается в том, что в редактор загружены различные инструменты JSLint/Hint. Они пытаются сохранить вашу честность и сэкономить много времени в отладчике, преследующем потенциальные синтаксические ошибки.

Редактор внутри XDK — это Brackets, он использует стандартные расширения Brackets для предоставления этих инструментов JSLint/Hint. Вы можете загрузить его и запустить отдельно в своей системе и редактировать прямо в нем, вам не нужно использовать редактор внутри XDK (или вы можете использовать любой другой редактор, который вам нравится).

Поскольку инструменты Lint/Hint просматривают только один файл за раз, а ваше приложение обычно распределено по нескольким файлам, они мало что знают о том, что определено в других ваших файлах. Аналогичным образом, этим инструментам подсказки/подсказки необходимо сообщить, что вы используете некоторые стандартные глобальные методы и свойства, которые, как ожидается, будут найдены в браузере (но которые могут отсутствовать в других средах JavaScript, поскольку JavaScript больше не поддерживается). ограничено только средой браузера — на самом деле ваше приложение XDK, также известное как приложение Cordova, работает внутри «веб-просмотра», а не в браузере, но это уже другая история...)

Таким образом, вы должны следовать некоторой стандартной практике настройки ваших директив JSHint/Lint в верхней части ваших файлов JS. Например, это хорошая отправная точка:

/*jslint browser:true, devel:true, white:true, vars:true */
/*global $:false, intel:false */

Подробнее см. в документации JSHint... Проект" на вкладке Проекты для более удобного запуска пустого шаблона (нет реальной разницы между пустым шаблоном и демонстрационным приложением, они имеют идентичную структуру).

Более полное и еще более поучительное приложение см. в примере приложения «Hello, Cordova». Оба эти приложения также можно найти в репозитории Intel XDK GitHub.

person xmnboy    schedule 18.01.2016
comment
p.s. Перейдите в пункт меню ФайлДиспетчер расширений... на вкладке Разработка (в редакторе), чтобы увидеть расширения Brackets, на которые я ссылаюсь. к. Если вы установите Brackets отдельно в своей системе, вы найдете гораздо больший набор таких расширений для улучшения вашего редактора. - person xmnboy; 18.01.2016

Вы добавляете файл js, который находится <script src="js/Test.js"></script> внутри тега header. Таким образом, сначала будет загружен js, и он будет привязывать к нему все события. Но когда js загружен, button id="jsTest" нет, потому что DOM не загружен.

Решения: - Вы можете следовать любому из подходов

Добавьте файлы js после того, как DOM будет готов

<body>
  <button id ="js/Test.js">Test JS</button>
     // other HTML tags
<script src = "js/Test.js></script>
</body>

Используйте window.onload

Событие загрузки возникает в конце процесса загрузки документа.

window.onload = testJsFile(){
  //Your code goes here
}

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

person brk    schedule 10.01.2016

Попробуйте поместить строку вне вашей JS-функции

документ.getElementById(......

внутри вашей html-страницы между

<script>HERE</script>

Если это все еще не работает. Попробуйте добавить атрибут onClick к кнопке следующим образом:

<button id="" onClick="testJsFile()">

Также полезно использовать проверку элементов Google Chrome во время разработки, потому что это даст вам сообщение об ошибке для всех этих вещей.

person MadeInDreams    schedule 10.01.2016
comment
Не определяйте встроенные обработчики событий. - person Michał Perłakowski; 13.01.2016
comment
Ну хорошо, но почему бы и нет? - person MadeInDreams; 14.01.2016
comment
На самом деле это довольно хороший способ отладки скрипта. Таким образом, он будет знать, работает ли сама функция или обработчик событий jquery, чтобы он мог определить проблему. - person MadeInDreams; 14.01.2016