Как использовать маску в поле ввода в JSF 2 RichFaces 4?

#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');
}