API-интерфейсы JAXB считаются API-интерфейсами Java EE и поэтому больше не содержатся в пути класса по умолчанию в Java SE 9. В Java 11 они полностью удалены из JDK.
Java 9 вводит понятия модулей, и по умолчанию модуль агрегации java.se
доступен по пути класса (или, скорее, к пути к модулю). Как следует из названия, модуль агрегации java.se
делает not включать Java EE API, которые традиционно были связаны с Java 6/7/8.
К счастью, эти Java EE API-интерфейсы, которые были предоставлены в JDK 6/7/8, все еще находятся в JDK, но по умолчанию они не находятся на пути к классу. Дополнительные API Java EE предоставляются в следующих модулях:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Быстрое и грязное решение: (только для JDK 9/10) Чтобы API-интерфейсы JAXB были доступны во время выполнения, укажите следующий параметр командной строки : --add-modules java.xml.bind
Но мне все еще нужно это для работы с Java 8 !!! Если вы попробуете указать --add-modules
со старшим JDK, он взорвется, потому что это непризнанный вариант. Я предлагаю один из двух вариантов:
$JAVA_HOME/release
для свойства JAVA_VERSION
. -XX:+IgnoreUnrecognizedVMOptions
, чтобы JVM молча игнорировал непризнанные опции вместо того, чтобы взорваться. Но будьте осторожны! Любые другие аргументы командной строки, которые вы используете, больше не будут проверяться JVM. Эта опция работает с Oracle / OpenJDK, а также с IBM JDK (с JDK 8sr4) Альтернативное быстрое решение: (только JDK 9/10) Обратите внимание, что вы можете сделать все вышеуказанные модули Java EE доступны во время выполнения, указав параметр --add-modules java.se.ee
. Модуль java.se.ee
является агрегатным модулем, который включает в себя java.se.ee
, а также вышеупомянутые модули API Java EE.
Правильное долгосрочное решение: (все версии JDK)
Все перечисленные выше модули API Java EE отмечены @Deprecated(forRemoval=true)
, поскольку они запланированы для удаления в Java 11 . Таким образом, подход --add-module
больше не будет работать в Java 11 из коробки.
Что вам нужно сделать в Java 11 и forward, это включить вашу собственную копию API-интерфейсов Java EE на пути к пути или пути к модулю. Например, вы можете добавить API JAX-B в качестве зависимости от maven следующим образом:
javax.xml.bind
jaxb-api
2.2.11
com.sun.xml.bind
jaxb-core
2.2.11
com.sun.xml.bind
jaxb-impl
2.2.11
javax.activation
activation
1.1.1
Подробную информацию о модульности Java см. В JEP 261: Система модулей
HTML:
<input list="values" placeholder="select">
<datalist id="values">
<option value="orange">
<option value="banana">
<option value="lemon">
<option value="apple">
</datalist>
JS:
$('input').on('click', function() {
$(this).attr('placeholder',$(this).val());
$(this).val('');
});
$('input').on('mouseleave', function() {
if ($(this).val() == '') {
$(this).val($(this).attr('placeholder'));
}
});
<datalist>
использует функцию автозаполнения, так что это нормальное поведение.
Например, если вы установите значение ввода «o», вы увидите только оранжевый в параметрах каталогизации. Он проверяет слово из первой буквы. Но если вы установите значение ввода в «a», вы не увидите никаких параметров.
Итак, если у вас уже есть значение во вводе, то ничего не будет отображаться в параметрах datalist, кроме этого значения, если оно существует. Это не ведет себя как select.
Обходным решением для этого было бы использовать jquery, например, это:
$('input').on('click', function() {
$(this).val('');
});
$('input').on('mouseleave', function() {
if ($(this).val() == '') {
$(this).val('apple');
}
});
Полный тест здесь: https: // jsfiddle .net / yw5wh4da /
Или вы могли бы использовать <select>
. Для меня это лучшее решение в этом случае.
Вышеприведенные решения великолепны, но если пользователь, естественно, просто нажимает рядом с величиной-заполнителем, внутри поля ввода, намереваясь сохранить и продолжить его, он станет полностью стертым.
Так на основе решения выше, я сделал для меня следующее решение:
HTML:
<input id="other" list="values" value="<?php echo $val; ?>">
<datalist id="values">
<option value="orange">
<option value="banana">
</datalist>
JS:
jQuery(document).ready(function ($) {
function putValueBackFromPlaceholder() {
var $this = $('#other');
if ($this.val() === '') {
$this.val($this.attr('placeholder'));
$this.attr('placeholder','');
}
}
$('#other')
.on('click', function(e) {
var $this = $(this);
var inpLeft = $this.offset().left;
var inpWidth = $this.width();
var clickedLeft = e.clientX;
var clickedInInpLeft = clickedLeft - inpLeft;
var arrowBtnWidth = 12;
if ((inpWidth - clickedInInpLeft) < arrowBtnWidth ) {
$this.attr('placeholder',$this.val());
$this.val('');
}
else {
putValueBackFromPlaceholder();
}
})
.on('mouseleave', putValueBackFromPlaceholder);
});
Для меня много ввода коробки на странице, и я хочу, чтобы у этого было такое поведение, поэтому я работаю с id и имею его «личным». Если вы хотите изменить его на более общую функцию, вам придется привязать putValueBackFromPlaceholder
к элементу, по которому произошел щелчок, и самому событию.
Просто вставьте желаемое значение по умолчанию во входной тег. Никакого дополнительного кодирования JavaScript не требуется
<input list="skills" value="DBA">
<datalist name="skills" id="skills">
<option value="PHP">Zend PHP</option>
<option value="DBA">ORACLE DBA</option>
<option value="APEX">APEX 5.1</option>
<option value="ANGULAR">ANGULAR JS</option>
</datalist>