У меня есть более сложное веб-приложение в JSF2 (+ EJB3.1 + JPA2 на glassfish 3.1), которое использует только стандартные (mojarra) JSF-компоненты и широко использует вложенные композиты и вызовы ajax.
Я хочу, чтобы все мои полосы прокрутки сохраняли и восстанавливали свое положение всякий раз, когда происходит ajax-вызов.
Я пробовал разные подходы, но ни один не кажется мне действительно хорошим, поэтому мне нужны некоторые подсказки, в какую сторону идти:
1) JavaScript:
Добавьте JavaScript, который считывает все позиции полосы прокрутки, либо когда происходит прокрутка (element.onScroll должен быть установлен javascript, потому что этот атрибут недоступен в XHTML4), либо когда ajax-request происходит (jsf.ajax.addOnEvent (savePositions)).Сохраняйте позиции полос прокрутки либо в скрытых полях ввода, либо в cookie.Восстановите их при возникновении ajax-ответа (jsf.ajax.addOnEvent (restorePositions)).
Противоположности, если файлы cookie не используются:
-Позиция прокрутки должна сохраняться в скрытом поле ввода передпроисходит ajax-запрос, поэтому здесь необходимо использовать атрибут element.onScroll.Не очень хорошо, потому что он сохраняет позиции много-много раз, хотя одного раза перед каждым ajax-запросом будет достаточно.
-Все скрытые поля ввода должны быть переданы в вызове ajax.Поскольку JSF-сайт использует несколько форм, кажется, нет способа автоматически добавить их во все ajax-вызовы.Вместо этого каждому элементу нужны скрытые поля ввода, добавленные в атрибут execute.
- Для каждого элемента с возможностью прокрутки необходимо одно скрытое поле ввода.
Против, если используются файлы cookie:
- ну, куки должны быть включены для веб-сайта.
Против общего:
-JavaScript-код должен либо знать, либо перебирать все элементы, имеющие полосы прокрутки.
-JavaScript-код должен быть выполнен снова, если компонент повторно визуализируется и ему нужен набор атрибутов onScroll.
2) JavaScript + Composite:
Поэтому я подумал о написании составного scrollStateSave,который указывает на JSF-идентификатор элемента, который имеет полосы прокрутки.Композит содержит скрытое поле ввода (или cookie) и javascript и обрабатывает все, поэтому мне просто нужно добавить один «экземпляр» композита на элемент, который имеет полосы прокрутки.Javascript использует замыкания для работы с несколькими элементами на одном сайте.
Contra:
-Javascript внутри композита не выполняется при повторном рендеринге после ajax-вызова.Для этого есть обходные пути, но мне они кажутся некрасивыми.
3) У Myfaces есть опция AUTO_SCROLL:
Как это работает точно?Работает ли он для non-myfaces-jsf-components?
4) Tomahawk предлагает по адресу: autoScroll-поведения:
Использование томагавк-замен для стандартных-mojarra-jsf2-компонентов будетдля меня нормально.Но документация по t: autoscroll говорит об атрибуте «событие», тогда как для реализации необходим атрибут «значение».Что я должен добавить в этот атрибут, чтобы t: autoScrolll работал?