2013-06-05 2 views
0

Я динамически добавляю скрипты GWT с помощью JQuery, а затем отслеживаю историю, используя историю JQuery.Поддержка JQuery и GWT History смешана

Задача: Мои модули GWT генерируют токены History, потому что все мои модули GWT являются модулями MVP. И onClick() s из MenuItem s динамически загружает модуль GWT вместе с этим. Я добавляю историю для MenuItems с использованием JQuery. Но мои модули GWT также используют History. Теперь проблема в том, что если я повторно нажимаю на MenuItem, который загружает GWT MVP modules, someHow мой браузер получает пораженный.

код:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
        <script src="/newclickmenu/jquery.history.js"></script> 

       // Contains code which creates menuItems using JSTL. In this menuItem there will be menuItem and *subMenuItem(onclick of menuItem there will be a slideDown which would show subMenuItem 


        <script type="text/javascript"> 
         jQuery(window).load(function() { 
          $('body').on('click', '#subMenuItem', function(event) { 
           // onClick of subMenuItem(which is anchor) then it add the History and will invoke the GWT mvp module. 
           // After doing the push then below `$.history.on('load change push', function(event, url, type) {` line is called. 
           $.history.push($(this).attr("href")); 
           event.preventDefault(); 
          }); 
          $.ajaxSetup({ cache: true }); 
          $.history.on('load change push', function(event, url, type) { 
           if (event.type == "load") { 
            if (url.split("!").length < 2) { 
             window.location = url; 
            } 
           } else { 
            // This code will add the GWT module dynamically. 
            if (typeof url !== undefined && url !== null && url !== "") { 
             // Remove the old GWT script and append the new script 
             var previousModule = $(".mainModule"); 
             if (previousModule.parent().length !== 0) { 
              $(previousModule).remove(); 
             } 
             var expectedUrl = "<script class='mainModule' src='/Masters/Masters.cache.js'/>"; 
             $('head').append($(expectedUrl)); 
            } 
           } 
         )}; 
          }).listen('hash'); 
        </script> 
+0

Предлагаю вам добавить свой код. – qben

+0

Я добавил код, пожалуйста, проверьте его. –

ответ

0

Вы пробовали отключить Историю GWT's?

Чтение официальной документации here

To use GWT History support, you must first embed an iframe into your host HTML page. 
    <iframe src="javascript:''" id="__gwt_historyFrame" 
      style="width:0;height:0;border:0" /> 

Попробуйте удалить его, компилировать ваши модули снова.

В любом случае только для любопытства, почему вы используете с jQuery инъекцией скриптов GWT? Я думаю, что гораздо лучше сделать обратное.

Вы можете создать представление «Деятельности и места», управлять своей историей очень простым способом и использовать инжектор сценариев GWT для сценариев jQuery.

final JavaScriptObject idScript = $(window).prop("IDSCRIPT"); 
    if (idScript == null){ 
     ScriptInjector.fromUrl("js/jq/myJqueryScript.js").setCallback(
     new Callback<Void, Exception>() { 
      public void onFailure(Exception reason) { 
       AppConf.C("Trying to inject js/fb/myJqueryScript. Fail."); 
      } 
      public void onSuccess(Void result) { 
       executeMyStuff(...); 
      } 
     }).inject(); 
    } else { 
     executeMyStuff(...); 
    } 
+0

Проверьте мою проблему. Я добавил код. –

+0

Ну, сценарий полностью изменился. Почему вы каждый раз вводите модуль GWT? Ну, идея загружает модуль GWT один раз, и внутри него вы контролируете свои виджеты и прочее для того, чтобы делать что угодно, когда захотите. Также, что вы подразумеваете под ударом? Любая ошибка consolo? Любая фотография? Можете ли вы дать нам более подробную информацию? – apanizo

+0

Да, apanizo. Я пытаюсь сделать мои модули более быстрыми.onClick menuItem, это просто отправка. Итак, я решил сократить этот запрос Http. Я почти отрезал запрос Http. Более того, я использую кешированные Js, поэтому время рендеринга будет еще быстрее и обычным. Проблема: если это хром Google, он попросил меня убить и перезагрузить страницу. Я думаю, что история JQuery и событие изменения истории моего gwt вызываются одновременно. –

0

Я думаю, что ваша установка является очень сложным, я не знаю причину, что вам нужно это в вашем приложении, но все равно:

1- При добавлении GWT-модуль, который вы не можете выгрузить его. Поэтому, хотя вы удаляете тег скрипта, код загружается в память, и все события, добавленные gwt, продолжаются в exectution.

2- Если ваш gwt-модуль изменяет токен истории, ваш код jquery, прослушивающий события истории, будет вызываться каждый раз.

3 Эта настройка может работать для первого модуля gwt, но второй модуль будет мешать первому, поскольку оба добавляют некоторые обработчики событий к одной и той же вещи. Таким образом, каждый загруженный gvt-модуль mvp прослушивает события истории, события мыши и т. Д., И вы получите неопределенное поведение.

Возможно, если вы расскажете немного больше о своей архитектуре и требованиях к приложениям, мы сможем найти наиболее подходящую настройку.

+0

Пожалуйста, проверьте ссылку, которая объясняет упрощенную архитектуру для обсуждения. http://stackoverflow.com/questions/16983265/how-to-load-gwt-modules-using-the-jquery –

+0

В приведенной ниже ссылке показана моя текущая архитектура проекта и проблема, с которой сталкиваются мои пользователи. Итак, пожалуйста, помогите мне, что я должен делать inOrder для достижения моей цели? http://stackoverflow.com/questions/16983265/how-to-load-gwt-modules-using-the-jquery Я сделал возможный прогресс, но из-за проблемы, о которой вы упоминали, то есть, *, * * код загружен в память ** Я попал в середину. Я не могу добиться прогресса. Пожалуйста, помогите мне выбрать подходящую настройку. –

Смежные вопросы