Phonegap和requirejs动态脚本加载失败

Phonegap and requirejs dynamic script loading fails

本文关键字:加载 失败 脚本 动态 requirejs Phonegap      更新时间:2023-09-26

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

我现在正试图用phonegap来构建它。然而,我遇到了以下问题,这可能是一个bug?或者我做错了什么。

发生以下情况:

  1. 页面加载良好
  2. 四处点击效果良好
  3. 应用程序将在后台更改URL(使用Backbone)
  4. 最后,我单击一个触发requirejs的按钮,requirejs又试图加载脚本
  5. 当我在安卓虚拟机上使用Chrome调试WebView时,我可以看到以下错误

得到file:///js/step.search-2.0.6-SNAPSHOT.min.jsstep2.0.6-SNAPSHOT.min.js:1未捕获错误:搜索的脚本错误http://requirejs.org/docs/errors.html#scripterror步骤2.0.6-SNAPSHOT.min.js:1

得到file:///js/step.qtip-2.0.6-SNAPSHOT.min.js步骤2.0.6-SNAPSHOT.min.js:1未捕获错误:qtip的脚本错误http://requirejs.org/docs/errors.html#scripterror

得到file:///js/step.quick-lexicon-2.0.6-SNAPSHOT.min.jsstep2.0.6-SNAPSHOT.min.js:1未捕获错误:的脚本错误:quick_lexiconhttp://requirejs.org/docs/errors.html#scripterror

这是个虫子吗?

这是我的requirejs配置

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控制台,并在页面第一次加载时尝试写入标记,则文件加载良好
  • 如果在点击一些按钮/菜单后,我也这样做了,那么文件无法加载,可能是因为网络视图中的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给出的URL是:

之前:file:///android_asset/www/index.html"在:file:///之后?q=版本=ESV|strong=G0018&选项=HVNUG

所以我无论如何都会发布这篇文章,以防其他人发现同样的问题,但我认为写这篇文章有助于我理解问题的根源。

Chris

因此,可以肯定的是,根本原因是:使用历史URL似乎将浏览器的位置移动到了与android_asset/www/index.html无关的位置,这反过来会中断任何其他脚本的加载。

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