javascript - 使用 native 功能增强 Web 应用程序 - 将 PhoneGap 的 InAppBrowser 与 Rails Web 应用程序应用程序 javascript 桥接

标签 javascript ruby-on-rails cordova jquery-mobile

我使用 Rails 3 和 JQuery Mobile 编写了一个简单的聊天应用程序,您可以在此处查看原型(prototype): http://budz.vdsites.com

然而,作为一个纯粹的网络应用程序,它的实用性相当有限,我希望包含一些 native 移动功能,例如通知、图片上传(通过图库或相机)、联系人获取,也许之后还会有更多功能。我还计划为桌面部署一个类似的增强型客户端,两者使用相同的前端。

一个重要的要求是能够编写最少的所需代码来实现这些功能,因为我可以支持多个平台集,然后维护每个代码库将变得乏味。

经过一些研究,我最好的选择是基于 PhoneGap 的 chromeless native 应用程序,在手机端具有足够的功能来启用这些额外的功能。为此,InAppBrowser 小部件似乎非常适合这项工作。

但是,进一步研究它的 API,似乎几乎没有任何设施可以在 native 应用程序和 Web 应用程序之间启用基本通信,除了基本的负载相关事件之外,除非我破解我的应用程序,否则这些事件对我来说毫无用处大规模地触发这些事件(这样做看起来很假)。

最终,我希望能够监听 PhoneGap 端的自定义事件,并从 Web 应用程序触发它们。

我想出了一些线索来实现所需的功能:

  • 我可以创建一个 DOM 元素来使用它的属性作为 native 端和 Web 应用程序之间的媒介 - 但似乎没有办法从其容器外部访问 DOM。
  • 我可以从phoneGap、inAppBrowser之外监听我的web应用程序中的一些特定端点,并根据服务器响应触发 native 功能 - 这绝对有效,但这意味着我必须为其他平台编写不同的监听代码,因此会稍微中断我的最低编码要求。

这是我的问题:

  • 有没有办法使用 PhoneGap 实现我想要的行为(事件调度)?
  • 您对我建议的两种方法有何看法?
  • 我应该寻找其他平台吗?你有什么建议?
  • 社区对此有何看法?您如何处理此类情况?

感谢您提供的任何见解!

最佳答案

  1. 我不确定这是否是内置的,但是,您可以很容易地 在您打开的页面中注入(inject)您自己的自定义脚本 InAppBrowser,至少在 Android 上(不确定其他的 目前平台。)此功能尚未记录, 但在移动规范测试套件中对其进行了测试,并且它 看起来很简单: https://github.com/apache/cordova-mobile-spec/blob/master/inappbrowser/index.html#L165 他们只是调用inAppBrowser.injectScript()。如果你看着 那个页面,你会看到他们正在操纵外部网络 通过注入(inject)以下代码可以很轻松地获取页面的 DOM:

                 var code = '(function(){\n' +
                  ' var header = document.getElementById("header");\n' +
                  ' header.innerHTML = "Script literal successfully injected";\n' +
                  ' return "abc";\n' +
                  '})()';
    

    并注入(inject)它:iab.executeScript({code:code},callback。我 假设您可以这样做将事件写入隐藏的队列中 外部页面中的 DOM 元素并将事件从该队列中拉出 从你的 inAppBrowser 来处理它们。看起来有点简陋 尽管。我尝试注入(inject)您可以访问的全局变量 来自任一 JavaScript 页面,但运气不太好......有 可能有某种方法可以做到这一点,如果我想出任何办法,我会 请务必编辑这篇文章。

  2. 第一种方法几乎就是我上面建议的。我将使用隐藏在外部页面中的内容并将事件/命令写入其中,然后您可以在 Cordova 代码中读取和解释这些事件/命令。对于第二种方法,我不明白您的建议是什么,也不明白为什么您必须为不同的平台编写不同的代码。

  3. 抱歉,我真的没有任何其他建议。我认为 Cordova/PhoneGap 是您的最佳选择,因为可以轻松地在多个平台上创建具有相同 native 功能的应用程序,在所有平台上使用相同的 Cordova API 集。

  4. 我认为您正在尝试做的事情(从 InAppBrowser 中打开的外部页面拦截 JavaScript 事件)可能是一个非常有用的概念和想法。我也看到其他人也有这样的要求。我认为,如果这还不可能(可能是,我会继续搞乱它),那么可能会有计划在进行中。您可以针对 Cordova 针对此功能创建功能请求,并查看其接收情况。

关于javascript - 使用 native 功能增强 Web 应用程序 - 将 PhoneGap 的 InAppBrowser 与 Rails Web 应用程序应用程序 javascript 桥接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317901/

相关文章:

javascript - jquery,如何检查特定 ID 是否是其他 ID 的子代?

ruby-on-rails - Rails : All examples were filtered out - 0 examples, 0 次失败

html - rails 单选按钮太远

android - Ember.js HTM5 的 UI 框架建议 => Phone Gap 应用程序(或替代堆栈)

javascript - Ajax 调用 Cordova ios SecurityError : DOM Exception 18

javascript - 在 Javascript 中从字符串生成函数

JavaScript 函数在鼠标悬停时不起作用

javascript - 计算文本字体大小以用文本填充容器

ruby-on-rails - 如何让 url_helper 在 Rails 中传递永久链接而不是 id?

ios - 找不到适用于 iOS PhoneGap 的 PushPlugin