В 8-й версии всеми нами “любимого” ослобраузера Internet Explorer (далее просто IE) появилась одна очень интересная фишечка. Назвали ее режимом совместимости. Смысл ее состоял в том, чтобы позволить пользователю просматривать web-страницы таким образом, как будто они отображаются в одной из предыдущих версий IE (так, в IE8 предполагался режим совместимости только с IE7).
Как это закономерно случается со всеми хорошими начинаниями в IE, фича со временем стала предметом еще одного геморроя для web-разработчиков.
Поясню. Во-первых, количество режимов совместимости с выходом каждой новой версии браузера увеличивается (радует, пока что еще только в арифметической прогрессии). В 10-й версии браузера этих режимов будет уже туева хуча штук:
Во-вторых, если специально не говорить IE, в каком из режимов нужно отображать страницу, то он отображает страницу, как попало. Точнее, выбор режима отображения страницы зависит от большого числа не вполне контролируемых факторов, но выглядит это действительно так: как попало. :)
Для того, чтобы сообщить IE режим отображения страницы, используется заголовок ответа “X-UA-Compatible”. Детально все возможные его значения я рассматривать не буду. Об этом можно почитать, например, здесь.
Мы же поговорим о том, какие имеются возможности задания режима отображения страниц в рамках популярного web-фреймворка Apache Wicket.
Вариант первый
На самом деле, установить режим отображения web-страницы в IE можно, всего лишь задав специальный заголовок META на странице. То есть, если мы хотим, например, чтобы IE показывал web-страницу всегда в режиме номера своей текущей версии, то нам достаточно вставить строку
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
в разметку (html-файл), соответствующую классу страницы Wicket.
Проблем тут две и они следующие:
- Данная строка всегда должна идти сразу после открывающего тега <head> (пробелы тоже нежелательны! :)), иначе IE ее тупо проигнорирует. Это с некоторой долей вероятности может привести к проблемам при добавлении в коде страницы различных header contributor’ов и т.д.
- Данный заголовок нужно будет указывать отдельно для каждой из страниц проекта, если, например, в вашем приложении используется несколько шаблонных страниц (или шаблонные страницы не используются вообще).
Вариант второй
Добавить заголовок META для всех страниц приложения можно с помощью следующей строчки кода в методе init класса приложения (потомка WebApplication):
public class MyApp extends WebApplication {
...
@Override
protected void init() {
...
addRenderHeadListener(new StringHeaderContributor(
"<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\" />\n"));
}
...
}
Если эта строчка будет последним вызовом метода addRenderHeadListener в методе init, то необходимый нам заголовок с большой долей вероятности будет первой строкой в разделе <head /> на страницах приложения.
Но опять же не всегда.
Вариант третий
Чтобы указать необходимые нам параметры совместимости непосредственно в заголовке ответа для всех web-страниц, переопределим метод newRequestCycle класса приложения:
public class MyApp extends WebApplication {
...
@Override
public RequestCycle newRequestCycle(Request request, Response response) {
return new WebRequestCycle(this, (WebRequest)request, (WebResponse)response) {
@Override
public WebResponse getWebResponse() {
WebResponse response = super.getWebResponse();
response.setHeader("X-UA-Compatible", "IE=Edge");
return response;
}
}
}
...
}
При этом нужно помнить о том, что указанный на странице заголовок META имеет приоритет над HTTP-заголовком, который передается в response.
Такие дела. Наверняка, имеются и другие способы управлять режимом совместимости в IE средствами Wicket, но тратить слишком много времени на борьбу с вIEтренными мельницами не очень хочется.
Пойду я лучше готовиться к Хэллоуину. :) Начать никогда не рано, я считаю.