Для начала, ваш градиент может быть упрощен, как показано ниже.
.box{
background:
radial-gradient( farthest-side at bottom left, rgba(218, 218, 216, 0.5), transparent),
radial-gradient( farthest-corner at bottom right, rgba(253, 253, 253, 0.5), transparent 300px);
height:200px;
}
body {
background:blue;
}
Теперь проблема в том, что сафари не поддерживает синтаксис, используемый с at
, как вы можете видеть в Страница MDN :
Вы можете изменить свой синтаксис, как показано ниже. Я разделю градиент, чтобы лучше видеть результат, тогда вы можете легко объединить их.
Первый градиент:
.box{
background:
radial-gradient( farthest-side at bottom left, rgba(218, 218, 216, 0.5), red);
height:200px;
}
.box2{
background:
radial-gradient( farthest-side, rgba(218, 218, 216, 0.5), red) top right/200% 200%;
height:200px;
}
Второй градиент
.box{
background:
radial-gradient( farthest-corner at bottom right, rgba(253, 253, 253, 0.5), red 300px);
height:200px;
}
.box2{
background:
radial-gradient( farthest-corner, rgba(253, 253, 253, 0.5), red 300px) top left/200% 200%;
height:200px;
}
Хитрость в том, что если вы удалите at
, градиент по умолчанию начнется с центра, а при запуске с центра нам понадобится X
расстояние, чтобы достичь угла или сторон, в отличие от того, когда мы начинаем с угла, когда нам потребуется удвоенное расстояние X
. Вот почему я сделал градиент размером 200% 200%
, и я просто настраиваю фоновое положение, чтобы оно имело ту же визуализацию.
Вот последний фон:
.box{
background:
radial-gradient( farthest-side, rgba(218, 218, 216, 0.5) , transparent) top right/200% 200%,
radial-gradient( farthest-corner, rgba(253, 253, 253, 0.5), transparent 300px) top left/200% 200%;
height:200px;
}
body {
background:blue;
}
Каждый раз, когда компонент UICommand
(
,
и т. д.) не может вызвать связанный метод действия или компонент UIInput
(
,
и т. д.) не может обработать отправленные значения и / или обновить значения модели, и вы не видите никаких исключений и / или предупреждений googlable в журнале сервера, также не при настройке обработчика исключений ajax согласно Обработка исключений в запросах JSF ajax , а также когда вы устанавливаете ниже параметр контекста в web.xml
,
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
, и вы также не видите никаких ошибок и / или предупреждений в консоли JavaScript браузера (нажмите F12 в Chrome / Firefox23 + / IE9 +, чтобы открыть набор инструментов веб-разработчика, а затем откройте вкладку Консоль ), затем просмотрите приведенный ниже список возможных причин.
UICommand
и UIInput
должны быть размещены внутри компонента UIForm
, например
(и, следовательно, не простой HTML
), иначе ничего не может быть отправлено на сервер. Компоненты UICommand
также не должны иметь атрибута type = "button"
, иначе это будет неработающая кнопка, которая полезна только для JavaScript onclick
. См. Также Как отправлять входные значения формы и вызывать метод в bean-компоненте JSF и
Вы не можете вложить несколько компонентов UIForm
друг в друга. Это незаконно в HTML. Поведение браузера не указано. Остерегайтесь включаемых файлов! Вы можете использовать компоненты UIForm
параллельно, но они не будут обрабатывать друг друга во время отправки. Вы также должны быть осторожны с антипаттерном «Форма Бога»; убедитесь, что вы непреднамеренно не обрабатываете / не проверяете все другие (невидимые) входные данные в той же самой форме (например, имея скрытый диалог с необходимыми входными данными в той же самой форме). См. Также Как использовать
Нет Ошибка проверки / преобразования значения UIInput
не должна была произойти. Вы можете использовать
для отображения любых сообщений, которые не отображаются какими-либо специфичными для ввода компонентами
. Не забудьте включить id
из
в
, если таковой имеется, чтобы он был обновлен. а также на запросы ajax. См. Также h: messages не отображает сообщения при нажатии p: commandButton .
Если компоненты UICommand
или UIInput
помещаются внутри повторяющегося компонента, например
,
и т. д., то вам необходимо убедиться, что точно такое же значение
итерационного компонента сохраняется во время фазы применения значений запроса в запросе отправки формы. JSF будет повторять это, чтобы найти нажатую ссылку / кнопку и отправленные входные значения.Помещение bean-компонента в область просмотра и / или обеспечение загрузки модели данных в @PostConstruct
bean-компонента (и, следовательно, не в методе получения!) Должно исправить это. См. Также Как и когда мне следует загрузить модель из базы данных для h: dataTable .
Если компоненты UICommand
или UIInput
включены динамическим источником, например
, тогда вам нужно убедиться, что точно такой же # {bean.Значение include}
сохраняется во время построения представления запроса на отправку формы. JSF выполнит его повторно во время построения дерева компонентов. Помещение bean-компонента в область просмотра и / или обеспечение загрузки модели данных в @PostConstruct
bean-компонента (и, следовательно, не в методе получения!) Должно исправить это. См. Также Как с помощью ajax-refresh динамически включать содержимое с помощью меню навигации? (JSF SPA) .
Атрибут визуализированного
компонента и всех его родителей и атрибут test
любого родительского элемента
/
не должно оцениваться как false
во время фазы применения значений запроса запроса отправки формы. JSF перепроверит его как часть защиты от несанкционированных / взломанных запросов. Сохранение переменных, ответственных за условие, в bean-компоненте @ViewScoped
или проверка правильности предварительной инициализации условия в @PostConstruct
bean-компонента @RequestScoped
должны почини это. То же самое относится к атрибуту disabled
компонента, который не должен оцениваться как true
на этапе применения значений запроса. См. Также Действие CommandButton JSF не запущено и Отправка формы в условно визуализированном компоненте не обрабатывается .
Атрибут onclick
компонента UICommand
и атрибут onsubmit
компонента UIForm
не должны возвращать false
или вызвать ошибку JavaScript. В случае
или
также не должно быть ошибок JS, видимых в консоли JS браузера. Обычно поиск точного сообщения об ошибке уже дает ответ. См. Также Добавление jQuery в PrimeFaces приводит к появлению Uncaught TypeErrors .
Если вы используете Ajax через JSF 2.x
или, например, PrimeFaces
, убедитесь, что у вас есть
в главном шаблоне вместо
. В противном случае JSF не сможет автоматически включать необходимые файлы JavaScript, содержащие функции Ajax. Это приведет к ошибке JavaScript, например, «mojarra is not defined» или «PrimeFaces is not defined» в консоли JS браузера. См. Также h: commandLink actionlistener не вызывается при использовании с f: ajax и ui: repeat .
Если вы используете Ajax, и отправленные значения оказываются равными null
, убедитесь, что интересующие компоненты UIInput
и UICommand
покрыты с помощью
или, например,
, иначе они не будут выполнены / обработаны.См. Также Отправленные значения формы не обновляются в модели при добавлении
Если отправленные значения по-прежнему имеют значение null
, и вы используете CDI для управления bean-компонентов, убедитесь, что вы импортируете аннотацию области из правильного пакета, иначе CDI по умолчанию будет ] @Dependent
, который эффективно воссоздает компонент при каждой оценке выражения EL. См. Также @SessionScoped bean теряет область видимости и постоянно воссоздается, поля становятся пустыми и Какая область действия управляемого компонента по умолчанию в приложении JSF 2?
Если родительский объект ]
с кнопкой UICommand
предварительно отображается / обновляется запросом ajax, поступающим из другой формы на той же странице, тогда первое действие всегда будет терпеть неудачу в JSF 2.2 или более ранней версии. . Второе и последующие действия будут работать. Это вызвано ошибкой в обработке состояния представления, которая сообщается как JSF spec issue 790 и в настоящее время исправлена в JSF 2.3. Для более старых версий JSF необходимо явно указать идентификатор
в рендере
из
. См. Также h: commandButton / h: commandLink не работает при первом щелчке, работает только при втором щелчке .
Если
имеет enctype = "multipart / form-data"
, установленный для поддержки загрузки файлов, то вам необходимо убедиться, что вы использовать как минимум JSF 2.2, или что фильтр сервлета, который отвечает за синтаксический анализ запросов multipart / form-data, настроен правильно, иначе FacesServlet
в конечном итоге не получит никаких параметров запроса и, следовательно, не сможет применить значения запроса. Как настроить такой фильтр, зависит от используемого компонента загрузки файлов. Для Tomahawk
проверьте этот ответ , а для PrimeFaces
,проверьте этот ответ . Или, если вы на самом деле вообще не загружаете файл, полностью удалите атрибут.
Убедитесь, что аргумент ActionEvent
для actionListener
является javax.faces.event.ActionEvent
, а не java.awt.event. ActionEvent
, который большинство IDE предлагает в качестве первого варианта автозаполнения. Отсутствие аргумента также неверно, если вы используете actionListener = "# {bean.method}"
. Если вам не нужен аргумент в вашем методе, используйте actionListener = "# {bean.method ()}"
. Или, возможно, вы действительно хотите использовать action
вместо actionListener
. См. Также Различия между action и actionListener .
Убедитесь, что ни PhaseListener
, ни какой-либо EventListener
в цепочке запрос-ответ не изменили жизненный цикл JSF, пропустив этап вызова действия, например, вызвав FacesContext # renderResponse ()
или FacesContext # responseComplete ()
.
Убедитесь, что ни один Фильтр
или Сервлет
в той же цепочке запрос-ответ каким-то образом не заблокировал запрос к FacesServlet
.
Если вы используете PrimeFaces
или
, убедитесь, что у них есть собственный
. Потому что эти компоненты по умолчанию JavaScript перемещены в конец HTML
.Итак, если бы они изначально сидели внутри
, то теперь они больше не сидели бы в
. См. Также p: действие commandbutton не работает внутри p: dialog
Ошибка во фреймворке. Например, RichFaces имеет « ошибку преобразования » при использовании элемента пользовательского интерфейса rich: calendar
с атрибутом defaultLabel
(или, в некоторых случаях, ] rich: подэлемент заполнителя
). Эта ошибка предотвращает вызов метода bean-компонента, если для календарной даты не установлено значение. Ошибки фреймворка можно отслеживать, начав с простого рабочего примера и создавая резервную копию страницы до тех пор, пока ошибка не будет обнаружена.
Если вы все еще зависаете, пора отладить. На стороне клиента нажмите F12 в веб-браузере, чтобы открыть набор инструментов веб-разработчика. Щелкните вкладку Консоль , чтобы увидеть консоль JavaScript. В нем не должно быть ошибок JavaScript. Ниже приведен снимок экрана с примером из Chrome, который демонстрирует случай отправки включенной кнопки
без объявления
(как описано в пункте 7 выше) .
Щелкните вкладку Сеть , чтобы увидеть монитор HTTP-трафика. Отправьте форму и проверьте, соответствуют ли заголовки запроса, данные формы и тело ответа ожиданиям.Ниже приведен снимок экрана с примером из Chrome, который демонстрирует успешную отправку ajax простой формы с одним
и одним
с < f: ajax execute = "@ form" render = "@ form">
.
(предупреждение: когда вы публикуете снимки экрана из заголовков HTTP-запросов, как указано выше, из производственной среды, убедитесь, что вы скремблируете / запутываете все файлы cookie сеанса на снимке экрана, чтобы избежать атак с захватом сеанса!)
На стороне сервера сделайте убедитесь, что сервер запущен в режиме отладки. Поместите точку останова отладки в метод интересующего компонента JSF, который, как вы ожидаете, будет вызван во время обработки отправки формы. Например. в случае компонента UICommand
это будет UICommand # queueEvent ()
, а в случае компонента UIInput
это будет UIInput # validate ()
. Просто выполните выполнение кода и проверьте, соответствуют ли поток и переменные ожиданиям. На скриншоте ниже показан пример отладчика Eclipse.
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
</p:dialog>
</h:form>
<h:form id="form2">
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
</p:dialog>
</h:form>
</ui:composition>
Решить;
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!-- Working -->
</p:dialog>
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Working -->
</p:dialog>
</h:form>
<h:form id="form2">
<!-- .......... -->
</h:form>
</ui:composition>