GWT - IE не загружает внешние скрипты, включенные в UiBinder
У меня есть некоторые внешние файлы Javascript в моем приложении GWT, которые я хочу загрузить, только когда пользователь получает доступ к разделу, который требует их. Я включил файлы JS в страницу UiBinder следующим образом:
<g:HTMLPanel>
<script src="blah.js"/>
</g:HTMLPanel>
Файлы не обязательно будут загружаться сразу после загрузки представления, поэтому при загрузке представления я проверяю наличие исключения, указывающего, что внешний код недоступен, и повторяю попытку до тех пор, пока представление не может быть создано без исключения.
Это работает в Firefox, но не работает в IE7/IE8. Я использовал AJAX Edition, чтобы отследить, что происходит в IE, и был сделан запрос на файл, но он ничего не загружает, размер равен 0. Журналы доступа к веб-серверу не показывают, что файл был запрошен.
Есть идеи, что происходит?
Или есть лучший способ сделать это? Проведенное мной до сих пор расследование не указывает на то, что у GWT есть удобный способ сделать это.
Обновить:
Хотя мы еще не на 2.4, просто чтобы попытаться скопировать исходные файлы, необходимые для ScriptInjector, и попытался использовать это в соответствии с предложением Томаса. Файлы JS загружаются правильно в обоих браузерах, но я получаю исключение "$wnd.xxxx is undefined", указывающее, что ссылки во внешнем скрипте не могут быть найдены. Я не пытаюсь загрузить свой виджет, пока вызов onSuccess() не вернется из сценария инъекции - поэтому мой код выглядит примерно так:
ScriptInjector.fromUrl("../xxxx.js").setCallback(
new Callback<Void, Exception>() {
public void onFailure(Exception reason) {
Window.alert("Script load failed.");
}
public void onSuccess(Void result) {
Window.alert("Script load success.");
MyWidget widget = new MyWidget();
client.onSuccess(widget); // adds the widget to the view
}
}).inject();
Я также не вижу ссылок на файлы JS, добавленных к DOM в Firebug, но мне интересно, не потому ли это, что они добавляются в DOM части GWT страницы, а не в сам фактический index.jsp.
2 ответа
Вам нужно указать ScriptInjector, чтобы добавить скрипт в окно верхнего уровня.
ScriptInjector.fromUrl(scriptUrl)
.setWindow(ScriptInjector.TOP_WINDOW)
.setCallback(new Callback<Void, Exception>() {
@Override
public void onSuccess(Void result) {
//script loaded OK
}
@Override
public void onFailure(Exception reason) {
//TODO script injection failed
}
}).inject();
Элементы скрипта, вставленные с использованием innerHTML
(который является то, что HTMLPanel
использует) не выполняются.
Вам придется использовать ScriptInjector
динамически внедрить скрипт на вашу страницу.