#jquery #jsf #jsf-2 #richfaces #input-mask
#jquery #jsf #jsf-2 #richfaces #ввод-маска
Вопрос:
Мне нужно иметь несколько масок в полях ввода в моей форме. Я пытаюсь вставить jQuery.js
и jQuery.MaskedInput.js
, как показано в приведенном ниже коде:
<h:head>
<h:outputScript name="jquery-1.6.4.min.js" library="javascript" />
<h:outputScript name="jquery.maskedinput-1.3.js" library="javascript" />
<script>
jQuery(function($){
$("#date").mask("99/99/9999");
$("#phone").mask("(999) 999-9999");
$("#tin").mask("99-9999999");
$("#ssn").mask("999-99-9999");
});
</script>
<title>TITLE</title>
</h:head>
<h:body>
<h:form id="form">
<h:inputText id= "date" />
</h:form>
</h:body>
Но пока ничего.
ОБНОВЛЕНИЕ с помощью BalusC $("[id='form:phone']").mask("(99) 9999-9999");
работает нормально! (спасибо, чувак). Но мне нужно применить эту маску в таблице данных :
<script>
jQuery(function($){
$("input.phones").mask("(999) 999-9999");
});
</script>
<title>TITLE</title>
<h:form id="form">
<h:panelGrid columns="3">
<h:outputLabel for="phones" value="Telefone(s) :" />
<h:dataTable id="phones" value="#{profile.user.userPhones}" var="item">
<h:column>
<h:inputText id= "phone" value="#{item.phone}" />
</h:column>
<h:column>
<h:commandButton value="Remove" action="#{profile.removePhone}"/>
</h:column>
<h:column>
<rich:message id="m_phone" for="phone" />
</h:column>
</h:dataTable>
<h:commandButton value="Add" action="#{profile.addPhone}"/>
</h:panelGrid>
</h:form>
Есть идеи?
Ответ №1:
JavaScript / jQuery запускается в браузере и работает с деревом HTML DOM, которое генерируется JSF и отправляется в браузер, оно не перехватывается в самом дереве компонентов JSF. Ваш $("#date")
ничего не вернет, поскольку в дереве HTML DOM не существует элемента с таким идентификатором. Откройте страницу в своем браузере, щелкните правой кнопкой мыши и просмотрите исходный код. Вы увидите, что на самом деле он был сгенерирован как <input id="form:date">
, а не как <input id="date">
.
Вместо этого вы должны использовать следующие селекторы (обратите внимание, что :
это недопустимый символ в CSS и поэтому его следует избегать):
$("#form\:date").mask("99/99/9999");
$("#form\:phone").mask("(999) 999-9999");
$("#form\:tin").mask("99-9999999");
$("#form\:ssn").mask("999-99-9999");
или, без необходимости явного экранирования:
$("[id='form:date']").mask("99/99/9999");
$("[id='form:phone']").mask("(999) 999-9999");
$("[id='form:tin']").mask("99-9999999");
$("[id='form:ssn']").mask("999-99-9999");
Или, в качестве альтернативы, просто дайте им имя класса:
<h:inputText id="date" styleClass="date" />
<h:inputText id="phone" styleClass="phone" />
<h:inputText id="tin" styleClass="tin" />
<h:inputText id="ssn" styleClass="ssn" />
который затем можно более обобщенно выбрать следующим образом без необходимости манипулировать идентификаторами, возможно, нескольких полей ввода одного и того же типа в представлении, например, внутри <h:dataTable>
:
$("input.date").mask("99/99/9999");
$("input.phone").mask("(999) 999-9999");
$("input.tin").mask("99-9999999");
$("input.ssn").mask("999-99-9999");
Комментарии:
1. Балуск, я следую твоему подходу и помогаю мне, спасибо, чувак. Но я пытаюсь понять идентификатор, сгенерированный моей таблицей данных для использования в маске jQuery, не могли бы вы помочь мне с этим?
2. Ах, это внутри datatable? Вы могли бы использовать селектор ends-with
$("[id$=date]")
, но использование класса CSS намного лучше (читай: не подвержено ошибкам) для такого случая, поскольку у вас их сейчас несколько.3. Спасибо! использование $(«[id $ = date]») действительно решает мою проблему. Вы сказали использовать CSS, но в <h:inputText /> нет атрибута ‘class’ , вместо этого не должно быть styleClass ?
4. впервые я помогаю тебе, аииииии! 😉 (кстати, у тебя прекрасные дети, спасибо за все, приятель)
5. @BalusC Я пробовал использовать ваши примеры, маска работает, но мой метод не вызывается при нажатии кнопки, есть идеи?
Ответ №2:
Используя JSF и RichFaces, мне удалось решить конфликтные маски следующим образом:
var $j = jQuery.noConflict();
window.onload = function () {
$j(#{rich:element('parProcecessoNumProtocolo')}).mask('9999.999999/9999-99');
}