Phonegap和requirejs动态脚本加载失败

时间:2014-10-19 20:36:23

标签: javascript cordova requirejs

我刚刚开始使用phonegap。我有一个Java servlet容器的现有应用程序。我编写了一个简单的爬虫程序,它可以提取所有相关的JS和CSS以及图像等等。所以我现在有一个直接的HTML应用程序。它使用requirejs。

我现在正试图通过phonegap进行构建。但是,我遇到了以下问题,可能是一个错误?或者我正在做的事情是错误的。

发生以下情况:

  1. 页面加载正常
  2. 点击工作正常
  3. 该应用将在后台更改网址(使用Backbone)
  4. 最后,我点击一个触发requirejs的按钮,然后尝试加载脚本。
  5. 当我使用Chrome在我的Android vm上调试WebView时,我可以看到以下错误
  6.   

    获取文件:///js/step.search-2.0.6-SNAPSHOT.min.js   step.2.0.6-SNAPSHOT.min.js:1未捕获错误:脚本错误:搜索   http://requirejs.org/docs/errors.html#scripterror   step.2.0.6-SNAPSHOT.min.js:1

         

    获取文件:///js/step.qtip-2.0.6-SNAPSHOT.min.js   step.2.0.6-SNAPSHOT.min.js:1未捕获错误:脚本错误:qtip   http://requirejs.org/docs/errors.html#scripterror

         

    获取文件:///js/step.quick-lexicon-2.0.6-SNAPSHOT.min.js   step.2.0.6-SNAPSHOT.min.js:1未捕获错误:脚本错误:   quick_lexicon http://requirejs.org/docs/errors.html#scripterror

    这是一个错误吗?

    这是我的requirejs config

    requirejs.config({
    waitSeconds: 15000,
    
    paths : {
        sidebar: ["js/step.sidebar-STEP_SERVER_VERSION_TOKEN.min"],
        quick_lexicon : ["js/step.quick-lexicon-STEP_SERVER_VERSION_TOKEN.min"],
        qtip : ["js/step.qtip-STEP_SERVER_VERSION_TOKEN.min"],
        view_help_menu: ["js/step.help-menu-STEP_SERVER_VERSION_TOKEN.min"],
        drag: ["js/step.draggabilly-STEP_SERVER_VERSION_TOKEN.min"],
        menu_extras: ["js/step.menu_extras-STEP_SERVER_VERSION_TOKEN.min"],
        html2canvas: ["js/step.html2canvas-STEP_SERVER_VERSION_TOKEN.min"],
        search: ["js/step.search-STEP_SERVER_VERSION_TOKEN.min"]
    }
    

    });

    我也注意到以下行为:

    • 如果我打开chrome dev控制台,并在页面首次加载时尝试编写标记,则文件加载正常
    • 如果单击某些按钮/菜单后我也这样做,则文件无法加载,可能是因为webview中的URL已更改?

    换句话说,如果我在应用渲染后运行以下代码段,则在与其进行交互之前,它会起作用。与应用程序交互后,它将停止使用与上述相同的错误。

    $("head").append('<script src="js/step.2.0.6-SNAPSHOT.min.js" type="script/javascript"></script>')
    

    在头脑中,我注意到requirejs正确地将相对路径而不是绝对路径放到资源中:

    <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="sidebar" src="./js/step.sidebar-2.0.6-SNAPSHOT.min.js"></script>
    

    最后,window.location.href由dev控制台提供的URL是:

    之前:file:///android_asset/www/index.html“ 之后:file:///?q =版本= ESV | strong = G0018&amp; options = HVNUG

    所以我打算发布这个以防其他人发现同样的问题,但是我认为写这个有助于我理解问题的根源。

    克里斯

1 个答案:

答案 0 :(得分:1)

所以,非常确定根本原因是:使用历史记录URL似乎已将浏览器的位置移动到某个不再相对于android_asset / www / index.html的位置,这反过来会打破任何进一步的加载脚本。

显然,下一个问题是如何解决这个问题 - 我会详细说明。也许标签可能会派上用场。但更好的是,修复URL以确保它保持相对于index.html。这可能是我自己的用例所特有的。