Вопрос по omnifaces, jsf, conditional-comments – Условный комментарий OmniFaces не записывается в вывод HTML

2

Я использую OmniFaces conditionalComment для загрузки файла JavaScript для браузеров IE 6. На веб-сайте написано, что скрипт должен быть включен в страницу как:

<script type="text/javascript" src="[JS library]"></script>
<!--[if (gte IE 6)&(lte IE 8)]>
  <script type="text/javascript" src="selectivizr.js"></script>
  <noscript><link rel="stylesheet" href="[fallback css]" /></noscript>
<![endif]-->

Это недопустимый xml, поэтому его нельзя использовать в файлах JSF xhtml. Вместо этого я использую это:

<h:body>
  <f:facet name="last">
    <o:conditionalComment if="if (gte IE 6)&amp;(lte IE 8)">
      <h:outputScript library="js" name="selectivizr-min.js" target="head"/>
    </o:conditionalComment>
  </f:facet>
...
</h:body>

Я включаю сценарий в часть тела xhtml и помещаю его в фасет name = "last", поэтому он включается после JQuery (я использую PirmeFaces и читаю, что это самый безопасный способ сделать это). target = "head" гарантирует, что он будет записан в раздел head полученного html-файла. Ссылка на скрипт включена в правильную часть документа (после импорта PrimeFaces), но она не окружена условными комментариями.

Вот соответствующая часть html (переформатирована для удобства чтения):

<head>
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/theme.css.xhtml?ln=primefaces-aristo" />
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/primefaces.css.xhtml?ln=primefaces&amp;v=5.1" />
  <script type="text/javascript" src="/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/primefaces.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/jquery/jquery-plugins.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/omnifaces.js.xhtml?ln=omnifaces"></script>
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/styles.css.xhtml?ln=css" />
  <script type="text/javascript" src="/javax.faces.resource/selectivizr-min.js.xhtml?ln=js"></script>

В последней строке отсутствуют комментарии (! - [if (gte IE 6) & (lte IE 8)]> ...).

Что я делаю неправильно? Какие-либо предложения?

Ура, Доминик

Ваш Ответ

1   ответ
2

Эта проблема имеет две стороны:

<f:facet name="last"> не имеет смысла в этом контексте. Избавиться от этого. Было бы проигнорировано, включая любого из его детей. Это действует только внутри<h:head> (и даже тогда, только если вы используете PrimeFaces; кто на самом деле упустил собственную возможность JSF упорядочить ресурсы заголовка как последний).

Вы не можете использовать<h:outputScript> (ни<h:outputStylesheet> внутри<o:conditionalComment>потому что JSF неявно автоматически переместит его в<head>, Это также намекается вдокументация а такжевитрина.

Просто используйте простую ваниль<script> (или же<link rel="stylesheet">).

<o:conditionalComment if="(gte IE 6)&amp;(lte IE 8)">
    <script src="#{resource['js/selectivizr-min.js']}" />
</o:conditionalComment>

Обратите внимание, что я исправил недействительныйif Значение атрибута путем удаления дублированногоif.

несвязанный к конкретной проблеме:library="js" указывает на недопониманиеlibrary приписывать. Внимательно читайтеДля чего нужна библиотека ресурсов JSF и как ее использовать? #{resource} решатель в ответе выше уже был изменен для использованияjs как обычная папка, а не как библиотека.

Просто положить в тело. Собственный JSF просто переместит его вконец головы:stackoverflow.com/q/8768317 Нет необходимости<f:facet>. BalusC
ОБНОВЛЕНИЕ: Вместо того, чтобы использовать <h: outputStyleheet ...>, я использую обычный html в конце моего раздела заголовка, то есть <link type = "text / css" rel = "stylesheet" href = "/ javax.faces.resource /css/styles.css.xhtml "/> и помещает его в правильное положение, то есть в конец секции head. Это хорошая практика, хотя? user473453
Большое спасибо за ваш очень быстрый ответ! Ваш код для условного комментария работает. По поводу порядка следования файлов в заголовке: у меня была проблема с тем, что мой файл CSS был загружен до стилей CSS PrimeFaces, и поэтому я не мог переопределить стили PF. Я нашел решение здесь:mkyong.com/jsf2/primefaces/resource-ordering-in-primefaces В любом случае, после прочтения ваших предложений, я удалил последний фасет и просто добавил: <h: outputStylesheet name = "css / styles.css" /> в конце заголовка, но теперь мой css появляется в неправильной части в результате стили HTML и PF больше не перезаписываются user473453

Похожие вопросы