#java #gwt
#java #gwt
Вопрос:
Я пытаюсь изменить пользовательский агент на safari при посещении страницы с помощью IE9.
Я написал это для gwt.xml файл:
<set-property name='user.agent' value='safari'>
<when-property-is name="user.agent" value="ie9" />
</set-property>
Однако IE9 теперь вообще не находит никакого пользовательского агента (даже не возвращается к своему собственному).
Что я делаю не так?
РЕДАКТИРОВАТЬ: я должен использовать GWT 2.0.4
ПРАВКА 2: Прочитайте комментарии к ответу, чтобы увидеть, как я это исправил.
Ответ №1:
Я не делал этого раньше, но я предполагаю, что вам придется реализовать свой собственный UserAgentPropertyGenerator (потому что это класс, который динамически оценивает свойство user agent!), а затем привязать его, как в com.google.gwt.user.UserAgent.gwt.xml:
<property-provider
name="user.agent"
generator="com.google.gwt.user.rebind.UserAgentPropertyGenerator"/>
Для более старых версий GWT (< 2.3.0) это настраивается непосредственно в com.google.gwt.user.UserAgent.gwt.xml как:
<property-provider name="user.agent"><![CDATA[
var ua = navigator.userAgent.toLowerCase();
var makeVersion = function(result) {
return (parseInt(result[1]) * 1000) parseInt(result[2]);
};
if (ua.indexOf("opera") != -1) {
return "opera";
} else if (ua.indexOf("webkit") != -1) {
return "safari";
} else if (ua.indexOf("msie") != -1) {
if (document.documentMode >= 8) {
return "ie8";
} else {
var result = /msie ([0-9] ).([0-9] )/.exec(ua);
if (result amp;amp; result.length == 3) {
var v = makeVersion(result);
if (v >= 6000) {
return "ie6";
}
}
}
} else if (ua.indexOf("gecko") != -1) {
var result = /rv:([0-9] ).([0-9] )/.exec(ua);
if (result amp;amp; result.length == 3) {
if (makeVersion(result) >= 1008)
return "gecko1_8";
}
return "gecko";
}
return "unknown";
]]></property-provider>
Комментарии:
1. Похоже, это невозможно в GWT 2.0.4, не так ли?
2. @Rob: Да, это новое в GWT 2.3.0. Я обновил свой ответ, чтобы также охватить более старые версии GWT.
3. Спасибо! Однако я получаю ошибку при запуске этого в любой версии IE: Ошибка при выполнении поставщика JavaScript для свойства ‘user.agent’ com.google.gwt.core.client.JavaScriptException: (TypeError): ‘odoc’ не определен
4. На самом деле проблема заключалась в том, как я проверял IE9 (odoc.body.style.opacity != undefined), из-за чего более низкие значения IEs выдавали ошибки. Я изменил его на if (document.documentMode >= 9) вернуть ‘safari’, и это сработало!
Ответ №2:
Я не уверен на 100%, что понимаю ваш вопрос. Однако я считаю, что вы не можете действительно изменить пользовательский агент. Что вы, вероятно, хотите сделать, так это обрабатывать запросы из браузера ie9 так, как если бы они поступали из браузеров safari. В этом случае, я думаю, вы можете использовать отложенную привязку с помощью замены: пример на этой веб-странице для вас выглядел бы примерно так:
<module>
<!-- ... other configuration omitted ... -->
<!-- Fall through to this rule is the browser isn't IE or Mozilla -->
<replace-with class="com.google.gwt.user.client.ui.impl.PopupImpl">
<when-type-is class="com.google.gwt.user.client.ui.impl.PopupImpl"/>
</replace-with>
<!-- Handling safari and ie9 in the same way -->
<replace-with class="com.google.gwt.user.client.ui.impl.PopupImplSafari">
<when-type-is class="com.google.gwt.user.client.ui.impl.PopupImpl" />
<any>
<when-property-is name="user.agent" value="safari"/>
<when-property-is name="user.agent" value="ie9" />
</any>
</replace-with>
</module>
Комментарии:
1. Использование <set-property name=’user.agent’ value=’safari’> работает. Это термин <когда ..>, который не работает. Основываясь на данном коде, я не могу понять, как написать что-либо лучше, чем я уже сделал.