2010-05-17 3 views
3

Это кнопка представляет:форма JSF не получает представляется, когда форма отключена JavaScript

<h:commandButton 
    actionListener="#{regBean.findReg}" 
    action="#{regBean.navigate}" value="Search" /> 

Это форма:

<h:form onsubmit="this.disabled=true;busyProcess();return true;"> 

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

<h:form onsubmit="busyProcess();return true;"> 

Тогда все работает. Есть идеи?

ответ

5

JSF зависит от наличия пару имени-имени кнопки отправки для вызова определенного действия на стороне сервера. Если вы отключите форму (по крайней мере, кнопку) перед отправкой формы, тогда никакая информация не будет доступна на карте параметров запроса, и JSF не будет вызывать никаких действий.

Ваш лучший выбор - ввести таймаут, в котором вы отключите кнопку около 50 мс после отправки. Например.

onsubmit="setTimeout(function(){document.getElementById('formId:buttonId').disabled=true;},50);busyProcess();" 

Явный return true; в конце концов, кстати superflous. Кроме того, отключение элемента формы HTML напрямую не будет работать, поскольку у него нет атрибута disabled, вы хотите отключить кнопку (и, при необходимости, другие элементы ввода).

Вот некоторые улучшения:

<h:form onsubmit="busyProcess(this);"> 

с

function busyProcess(form) { 
    setTimeout(function() { 
     for (var i = 0; i < form.elements.length; i++) { 
      form.elements[i].disabled = true; 
     } 
    }, 50); 

    // Remnant of your code here. 
} 

Update: так как я подумал, что вы сказали, что она "работает", я тестировал атрибут форме в disabled в различных браузеров, он работает только в MSIE (удивительно ..), но не в других (реальных) браузерах. Вы не хотите быть независимым от браузера, поэтому забудьте об этом и продолжайте отключать отдельные элементы формы.

1

this.disabled = true Изменения в [buttonref].disabled = true

+0

Оцените свой ответ ... но это приведет к отключению кнопки, не так ли? Что делать, если я хочу отключить всю страницу? Кроме того, вы знаете, почему это не сработает? – Mark

+0

Вы имеете в виду всю форму? Тогда вам нужно это сделать после возвращения true, например, используя 'var a = this; setTimeout (function() {a.disabled = true;}, 0); return true' –

0

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

0

Вы отключили всю форму, вам нужно отключить только кнопку.

Также вы должны убедиться, что ваш busyProcess() возвращает правдивое значение или представление может быть также отключено.

+0

Он хочет отключить все возможности запуска второй отправки - клавишу «Ввод» и т. д. – Pointy

0

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

Другой способ, чтобы убедиться, что запросы AJAX использовать общий канал, который имеет очереди, в которой только один запрос обрабатывается одновременно (с помощью простых механизмов, как прототип и т.д.)

0

BalusC, ваш очень творческий вариант таймаута работает хорошо. На самом деле я пришел к такому же выводу, когда я попробовал атрибут «disabled» в других браузерах. Он не отключил форму вообще в Opera и Firefox. Я просто делаю это для тех браузеров, которые более универсальны, чем IE.

Sean K, отключая кнопку только без установки тайм-аута, выдает ту же проблему, что и форма отключения, так как информация передается на сервер.

Спасибо за помощь!

Смежные вопросы