#javascript #jsf #jsf-2
#javascript #jsf #jsf-2
Вопрос:
Я проиллюстрирую свой вопрос на примере:
outerfile.xhtml:
<h:head>
<h:outputScript library="js" name="jquery-1.6.2.js" />
<h:outputScript library="js" name="outer.js" />
</h:head>
<h:body>
<h:panelGroup id="inner_panel">
<ui:include src="innerfile.xhtml" />
</h:panelGroup>
</h:body>
innerfile.xhtml:
<ui:composition ... >
<h:head>
<h:outputScript library="js" name="jquery-1.6.2.js" />
<h:outputScript library="js" name="inner.js" />
</h:head>
<h:body>
<h:panelGroup>
I Am Text in The Inner File!
</h:panelGroup>
</h:body>
</ui:composition>
Мои вопросы:
- Можно ли объявлять
js
файлы во внутреннем файле так, как я это сделал? - Нужно ли (и нужно ли) снова объявлять common (
jquery-1.6.2.js
) во внутреннем файле? - Что произойдет, если я отменю рендеринг и повторный рендеринг
inner_panel
с использованием AJAX? Будут ли перезагружены заголовки, включенные во внутренние файлы?
Ответ №1:
Можно ли объявлять файлы js во внутреннем файле так, как я это сделал?
Нет. Вы также не должны указывать <h:head>
include . Это приведет только к недопустимому HTML. То, что у вас есть прямо сейчас, приведет к:
<html>
<head>
<script></script>
</head>
<body>
<head>
<script></script>
</head>
<body>
</body>
</body>
</html>
(щелкните правой кнопкой мыши страницу в браузере и просмотрите исходный код, чтобы увидеть его самостоятельно, w3-при необходимости проверьте)
Исправьте это соответствующим образом в innerfile.xhtml
:
<ui:composition ... >
<h:outputScript library="js" name="jquery-1.6.2.js" target="head" />
<h:outputScript library="js" name="inner.js" target="head" />
<h:panelGroup>
I Am Text in The Inner File!
</h:panelGroup>
</ui:composition>
Это приведет к правильному HTML. Сценарии, объявленные с помощью <h:outputScript target="head">
, просто <head>
автоматически попадают в, если они еще не были объявлены ранее. Как и в реальном HTML, во всем представлении должен быть только один <h:head>
и <h:body>
, включая любые шаблоны и включаемые файлы.
Нужно ли (и должен ли я) объявлять общий (jquery-1.6.2.js ) снова во внутреннем файле?
Нет, если в родительском файле он уже объявлен как <h:outputScript>
. Но повторное объявление его во включаемом не повредит. Он все равно не будет дублироваться, если он уже был объявлен ранее.
Что произойдет, если я отменю рендеринг и повторный рендеринг
inner_panel
с использованием Ajax? Будут ли перезагружены заголовки, включенные во внутренние файлы?
Это работает, только если вы не используете target="head"
. Будут ли они перезагружены с сервера, зависит от того, был ли он уже запрошен браузером ранее и уже присутствует и действителен в кэше браузера. Но в принципе, браузеру снова будет предложено загрузить его, да. С помощью Firebug вы можете легко определить это.
Комментарии:
1. Согласно вашему ответу, если я загружу страницу, когда внутренняя страница не отображается, а затем отобразит внутреннюю страницу, внутренние js-файлы будут отсутствовать. Правильно?
2. Я этого не говорил. Они будут включены. Браузеру будет предложено загрузить их. Но независимо от того, был ли он получен из кэша браузера или непосредственно с сервера, зависит от заголовков ответа JS и от того, находится ли он уже в кэше браузера или нет. Если он кэшируется и присутствует в кэше браузера, он не будет перезагружен (потому что он уже есть в браузере). В противном случае он действительно будет перезагружен с сервера.
Ответ №2:
Правильный способ его записи — использовать target=»head» внутри вашего объявления h:outputScript в innerfile.xhtml:
<ui:composition ... >
<h:outputScript library="js" target="head" name="jquery-1.6.2.js" />
<h:outputScript library="js" target="head" name="inner.js" />
<h:panelGroup>
I Am Text in The Inner File!
</h:panelGroup>
</ui:composition>
Таким образом, все ваши объявления ресурсов будут помещены во внешний . Несколько объявлений одного и того же ресурса с одним и тем же именем библиотеки / ресурса не будут отображать одно и то же объявление несколько раз, потому что средство визуализации для h: outputScript имеет некоторый код, который обнаруживает это и игнорирует повторяющиеся записи. Обратите внимание, что все будет по-другому, если вы отобразите h:outputScript, который не ссылается на файл javascript.