Создание кнопок JSF, которые действуют как клавиши «Backspace» и «Enter» для inputTextArea?

#java #jsf-2

#java #jsf-2

Вопрос:

ОБНОВЛЕНИЕ: я обновил здесь для ясности, вместо того, чтобы писать в комментариях или делать сообщение с ответом.

Это часть того, как выглядит код, с которым будут работать эти кнопки:

Я сделал кнопки такими:

   <h:commandButton value="Delete"  onclick="return addBackspace();">
                    <f:ajax execute="@form" render="formula"/>
                </h:commandButton> //the backspace button
  

Текстовая область:

  <h:inputTextarea id="formula" value="#{output.formula}" /> 
  

Я сделал несколько простых кнопок, которые записывали бы их значение в текстовую область, чтобы пользователь видел формулу по мере ее построения:

  <h:commandButton value="  "  onclick="return checkButtons(this.value);">                   
                    <f:ajax execute="@form" render="formula"/>
                </h:commandButton>
  

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

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

  Property:
                <h:selectOneMenu  value ="#{output.propertyReferenceValue}" id="selectTwo" onchange="return checkItem(this.value);">    
                    <f:selectItems value="#{property.propertyReference.keySet()}"/> 
                </h:selectOneMenu>
  

Теперь, если я сделаю текстовую область отключенной или доступной только для чтения, я все равно смогу записать в нее содержимое selctBoxes (что хорошо), но если я попробую простые кнопки, такие как » «, их значение просто появится быстро, а затем так же быстро исчезнет. Если я попробую backspace , он удалит все содержимое текстовой области, то же самое, если я помещу часть содержимого полей выбора в текстовую область, а затем, если я нажму кнопку » » (например), все содержимое области будет удалено. Я все еще копаюсь в коде, чтобы понять, что заставляет его вести себя таким образом 🙂

КОНЕЦ ОБНОВЛЕНИЯ

Можно ли создать в JSF несколько командных кнопок, которые будут работать с inputTextArea так же, как клавиши «Enter» и «Backspace»? Например:

Кнопка «Enter» при нажатии переместит курсор на новую строку текстовой области. Кнопка «Backspace» удалит следующую букву или пробел, который находится за курсором.

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

Спасибо, Дэниел

Комментарии:

1. Ну, мне удалось сделать «кнопку ввода» такой: document.getElementById(«texAreaId»).value =»n»; . Все еще пытаюсь разобраться с «кнопкой возврата»

Ответ №1:

Вы могли бы просто использовать JavaScript для этого.

Например.

 <h:inputTextarea id="textarea" binding="#{textarea}" value="#{bean.text}" />
<input type="button" value="Enter" onclick="addEnter('#{textarea.clientId}')" />
<input type="button" value="Backspace" onclick="addBackspace('#{textarea.clientId}')" />
  

с помощью этих функций

 function addEnter(textareaId) {
    var textarea = document.getElementById(textareaId);
    textarea.value  = 'n';
    textarea.focus();
}

function addBackspace(textareaId) {
    var textarea = document.getElementById(textareaId);
    textarea.value = textarea.value.substring(0, textarea.value.length - 1);
    textarea.focus();
}
  

Комментарии:

1. Связанный с этим вопрос: если я сделаю текстовую область «отключенной», addBackspace удалит все ее содержимое. Можно ли изменить addBackspace, чтобы по-прежнему удалять в соответствии с положением курсора (не уверен в этом, поскольку текстовая область отключена, курсор идет с ней, насколько я могу судить) или заставить его удалить последнее слово?

2. Интересно, я не могу воспроизвести вашу проблему в FF6, IE7 / 8 / 9 и GC13. Какой браузер вы используете?

3. Я использую последнюю версию Google Chrome.

4. Я обновился до GC14, но я все еще не могу его воспроизвести. Возможно, в вашем коде есть что-то еще, что противоречит этому?

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