Действительно ли Java абсолютно Независим от платформы?

Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.

Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.

Рассмотрим следующую разметку; сценарий # 1 не находит

, а сценарий # 2 преуспевает:


test div

Итак, что вы должны делать? У вас есть несколько вариантов:


Вариант 1: Переместите свой скрипт

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


  
  

Примечание: размещение скриптов внизу как правило, считается лучшей практикой .


Вариант 2: jQuery's ready()

Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя ready() :



Примечание. Вы можете просто привязать к DOMContentLoaded или window.onload, но у каждого есть свои оговорки. jQuery ready() предоставляет гибридное решение.


Вариант 3: Делегирование событий

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

blockquote>

Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код.

jQuery on() выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:



Примечание: Обычно этот шаблон зарезервированы для элементов, которые не существовали во время загрузки или , чтобы избежать прикрепления большого количества обработчиков. Также стоит отметить, что, пока я прикреплял обработчик к document (для демонстрационных целей), вы должны выбрать ближайшего надежного предка.


Вариант 4: Атрибут defer

Используйте атрибут defer в

Для справки, вот код из этого внешнего скрипта :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

Примечание: атрибут defer, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10

28
задан bakkal 6 August 2010 в 03:41
поделиться

8 ответов

Хотя на практике большая часть скомпилированного байтового кода не зависит от платформы, мой 12-летний опыт разработки на платформе Java научил меня, что все еще существуют идиосинкразии от платформы к платформе.

Например, при разработке приложения Java 1.4 Swing для ПК и MacOSX поведение диалогов было другим, если родительский фрейм был нулевым.

Другой пример - работа с файловой системой и файлами в целом. В Java API есть методы, которые помогают защитить разработчика от различий в разделителях путей ( / vs \ ). При записи в файл важно использовать FileWriter API по назначению, чтобы возвращаемые символы и тому подобное генерировались должным образом для платформы, на которой выполняется запись.

Таким образом, хотя мой девиз - «напиши один раз, запусти где угодно», по моему опыту, для производственной среды он написан один раз, test , везде.

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

Несмотря на некоторые незначительные проблемы здесь и там, здорово видеть, что ваш код работает в Linux, Unix, Windows и MacOSX (BSD Unix) с использованием одних и тех же файлов JAR.

20
ответ дан 28 November 2019 в 03:11
поделиться

Как отметил Дьякобсон, ответом является квалифицированное «да». По большей части, разработчикам Java не нужно беспокоиться о зависимостях платформы. Однако вы можете столкнуться с проблемами, когда имеете дело с API, которые обрабатывают традиционные функции ОС и платформы.

Например, при работе с файловым вводом-выводом легко сделать вашу платформу кода зависимой, игнорируя различия между разделителями файлов и путей на разных платформах (т. Е. Используя '\', а не File.separator).

14
ответ дан Aaron Novstrup 28 November 2019 в 03:11
поделиться

Ваша проблема не в том, что вы выполняете свой код, а скорее в предположениях, которые вы должны сделать относительно путей к файлам, доступных внешних команд (если они вам нужны), необходимых прав доступа к файлам и других внешних факторов, которые на самом деле не подпадают под «Java» проблемный домен. Если вы не планируете использовать нативный код (через JNI), Java не будет вашей проблемой, ваша среда будет. Что возвращает нас к старой поговорке: «пиши один раз, тестируй везде».

5
ответ дан Tore A. 28 November 2019 в 03:11
поделиться

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

OS X особенно виновата в этом при использовании Apple Distribution of Java (почему кто-то захочет выпустить свою собственную упаковку Java, я не знаю, но это отдельный аргумент, а в OSX я не думаю, что у вас есть выбор, кроме как использовать их Java). Библиотеки, на которые вы можете положиться, а можете и не положиться, находятся в совершенно разных каталогах, например, библиотеки вместо lib, если моя память мне правильно служит. И IBM Java, я думаю, упаковывает классы в разные банки в некоторых случаях. Смешно !!

Надеюсь, это поможет.

0
ответ дан Mark Lakewood 28 November 2019 в 03:11
поделиться

Приоритеты потоковой передачи - это одно, что нужно учитывать. В других ОС, таких как Solaris, например, больше приоритетов потоков, чем в окнах. Поэтому, если вы много работаете над многопоточностью, ОС может повлиять на поведение программы.

4
ответ дан 28 November 2019 в 03:11
поделиться

Главное, о чем следует позаботиться, - это код пользовательского интерфейса, чтобы убедиться, что он правильно представлен на всех платформах, на которых вы будете работать.

Другой источник возможных проблем - развертывание на разных серверах приложений. Между ними могут быть проблемы несовместимости.

В остальном Java не зависит от платформы. Это также одна из ее слабых сторон, поскольку вы кодируете общий знаменатель и многие функции каждой отдельной ОС недоступны.

1
ответ дан 28 November 2019 в 03:11
поделиться

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

Однако. Даже виртуальные машины не защищены от ошибок . Быстрый поиск в Google дает, например, следующее:

http://www.ibm.com/developerworks/java/library/j-diag0521.html

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

7
ответ дан 28 November 2019 в 03:11
поделиться

Их очень мало, и они должны быть довольно очевидным. например, System.getProperty ("os.name") явно зависит от ОС, иначе это не сработает. Наиболее распространенным из них является System.exec (), поскольку он вызывает другое приложение, которое находится в вашей системе, опять же, вы должны знать, работает ли вызываемое вами приложение одинаково в каждой системе или нет (маловероятно).

1
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: