【问题标题】:Pass parameter to GWT bootstrap .nocache.js script将参数传递给 GWT bootstrap .nocache.js 脚本
【发布时间】:2012-01-16 22:32:15
【问题描述】:

有什么方法可以将参数传递给 GWT 生成的 .nocache.js 脚本文件并在 onModuleLoad 函数中对其进行评估?像这样:

<script type="text/javascript" src="application/Application.nocache.js?appId=461333815262909"></script>

主机页面 URL 应该与内部工作的 GWT 内容完全分离,因此将 appId 参数作为主机页面的查询参数传递并使用 Window.Location.getParameter 访问它不是一种选择。我知道我可以隐藏这样的参数,例如在隐藏的 DIV 中,然后从脚本中查询它们,但如果可能的话,我希望避免对主机页面的任何进一步依赖。

谢谢! 丽莎

【问题讨论】:

    标签: gwt parameters


    【解决方案1】:

    不是将信息隐藏在可能会变得混乱的隐藏 div 中,传递参数的一种简单方法是通过 HTML 元标记。

    在调用GWT脚本的HTML页面中,添加meta标签如下:

    <html>
      <head>
        <meta name="appId" content="461333815262909">
        ...
    

    然后,在你的模块入口点,解析它如下:

    @Override
    public void onModuleLoad() {
        NodeList<Element> metas = Document.get().getElementsByTagName("meta");
        for (int i=0; i<metas.getLength(); i++) {
            MetaElement meta = (MetaElement) metas.getItem(i);
            if ("appId".equals(meta.getName())) {
                Window.alert("Module loaded with appId: " + meta.getContent());
            }
        }
    }
    

    当然,这并不像在脚本标签的 src URL 中传递参数那么简单,但我相信它比在文档内容中隐藏 div 更干净,并且比人为重新解析脚本更不容易出错标签的来源属性。

    【讨论】:

      【解决方案2】:

      否,但this article 可能有助于将参数从服务器传递到客户端脚本以评估页面加载。

      【讨论】:

        【解决方案3】:

        GWT 中似乎没有对此的原生支持,但我最近想出了以下解决方案:

        假设您的脚本始终遵循命名约定“/&lt;moduleName&gt;.nocache.js”,您可以从主机页面获取所有&lt;script&gt; 元素并在src 属性中搜索引用此元素的元素。然后,您可以从那里提取 URL 编码的属性。

        这是我的示例实现,旨在以GWT.getModuleName() 作为第一个参数调用。

        /**
         * Fetches a parameter passed to the module's nocache script.
         * 
         * @param moduleName the module's name.
         * @param parameterName the name of the parameter to fetch.
         * @return the value of the parameter, or <code>null</code> if it was not
         *   found.
         */
        public static native String getParameter( String moduleName, String parameterName ) /*-{
            var search = "/" + moduleName + ".nocache.js";
            var scripts = $doc.getElementsByTagName( "script" );
            for( var i = 0; i < scripts.length; ++i ) {
                if( scripts[ i ].src != null && scripts[ i ].src.indexOf( search ) != -1 ) {
                    var parameters = scripts[ i ].src.match(/\w+=\w+/g);
                    for( var j = 0; j < parameters.length; ++j ) {
                        var keyvalue = parameters[ j ].split( "=" );
                        if( keyvalue.length == 2 && keyvalue[ 0 ] == parameterName ) {
                            return unescape( keyvalue[ 1 ] );
                        }
                    }
                } 
            }
            return null;
        }-*/;   
        

        欢迎提出改进建议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-15
          • 2019-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多