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 динамически внедрить скрипт на вашу страницу.

Другие вопросы по тегам