JQuery和GWT历史记录支持混淆了

JQuery和GWT历史记录支持混淆了,jquery,gwt,Jquery,Gwt,我使用JQuery动态地附加GWT脚本,然后使用JQuery历史记录跟踪历史记录 问题:我的GWT模块生成历史令牌,因为我的所有GWT模块都是MVP模块。而MenuItems的onClick()s正在动态加载GWT模块,同时我正在使用JQuery为MenuItem添加历史记录。但是我的GWT模块也使用历史。现在的问题是,如果我重复单击加载GWT MVP模块的MenuItem,不知何故我的浏览器会被破坏 代码: <script src="https:/

我使用JQuery动态地附加GWT脚本,然后使用JQuery历史记录跟踪历史记录

问题:我的GWT模块生成
历史
令牌,因为我的所有GWT模块都是MVP模块。而
MenuItem
s的
onClick()
s正在动态加载GWT模块,同时我正在使用JQuery为
MenuItem
添加历史记录。但是我的GWT模块也使用
历史
。现在的问题是,如果我重复单击加载
GWT MVP模块的
MenuItem
,不知何故我的浏览器会被破坏

代码:

                    <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>

//包含使用JSTL创建菜单项的代码。在此菜单项中,将有菜单项和*子菜单项(单击菜单项后,将有一个向下滑动的窗口,显示子菜单项)
jQuery(window).load(函数(){
$('body')。在('click','#subnumitem',函数(事件)上{
//单击子菜单项(即锚点),然后添加历史记录并调用GWT mvp模块。
//完成推送后,在`$.history.on('LoadChangePush')下面调用函数(事件、url、类型){`line。
$.history.push($(this.attr(“href”));
event.preventDefault();
});
$.ajaxSetup({cache:true});
$.history.on('load change push',函数(事件、url、类型){
如果(event.type==“加载”){
如果(url.split(“!”)。长度<2){
window.location=url;
}
}否则{
//此代码将动态添加GWT模块。
如果(url的类型!==未定义和url!==空和url!==“”){
//删除旧的GWT脚本并附加新脚本
var-previousModule=$(“.mainModule”);
if(previousModule.parent().length!==0){
$(上一个模块).remove();
}
var expectedUrl=“”;
$('head')。追加($(expectedUrl));
}
}
)};
}).听('hash');

您是否尝试禁用GWT的历史记录

阅读官方文件

要使用GWT历史记录支持,必须首先将iframe嵌入主机HTML页面。
尝试删除它,重新编译模块

不管怎样,只是出于好奇,为什么要使用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(...);
    }
final JavaScriptObject idScript=$(window.prop(“idScript”);
if(idScript==null){
ScriptInjector.fromUrl(“js/jq/myJqueryScript.js”).setCallback(
新回调函数(){
公共失效失效失效(异常原因){
AppConf.C(“尝试注入js/fb/myJqueryScript.Fail”);
}
成功时公开作废(作废结果){
executeMyStuff(…);
}
}).inject();
}否则{
executeMyStuff(…);
}

我认为您的设置非常复杂,我不知道为什么您需要在应用程序中使用此功能,但无论如何:

1-当您添加gwt模块时,您无法卸载它。因此,尽管您删除了脚本标记,但代码将加载到内存中,gwt添加的所有事件将在执行中继续

2-如果gwt模块更改了历史标记,那么每次都会调用侦听历史事件的jquery代码

3-此设置可能适用于加载的第一个gwt模块,但第二个模块会干扰第一个模块,因为两个模块都在向同一事物添加某些事件处理程序。因此,加载的每个mvp gwt模块都在侦听历史事件、鼠标事件等,您将获得不确定的行为


也许如果你再解释一下你的应用程序架构和需求,我们可以找到一个最合适的设置。

我建议你添加一些代码。我已经添加了代码,请检查一下。场景已经完全改变了。为什么每次都要注入GWT模块?好吧,想法是加载GWT模块一次,然后再加载ide it你可以控制你的小部件和其他东西,在你想要的时候做任何你想做的事情。还有你所说的strucked是什么意思?任何控制台错误?任何图片?你能给我们更多的细节吗?是的,apanizo。我正试着让我的模块呈现得更快。单击menuItem它只是执行分派。所以,我想切断Http请求。我几乎切断了Http请求。此外,我正在使用缓存的Js,因此渲染时间将比正常情况下更快。问题是:如果是google chrome,它要求我关闭并重新加载页面。我认为,JQuery历史记录和我的gwt模块历史记录更改事件正在一次调用。请等待更多答案,因为e我仍然感到困惑。在修改之前阅读你的帖子,我以为你在某种程度上注入了GWT的历史。但是如果你只注入了js,而你在任何地方都没有我之前发布的html代码,那么你的应用程序中就没有GWT的历史。我不确定你是否理解我的第二个答案。你是
    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(...);
    }