【问题标题】:Load any website in PhoneGap app with custom toolbar, Android使用自定义工具栏,Android 在 PhoneGap 应用程序中加载任何网站
【发布时间】:2016-05-18 14:54:58
【问题描述】:

这是我无法使用的移动应用程序的一部分。这个想法是,当用户点击特定元素(比如链接)时,我需要一个外部 url 加载并显示在屏幕上,顶部和底部都有特定的栏。并且用户应该能够浏览此网页上的链接。所以这是我尝试过的:

  1. iFrame
    我尝试使用 iFrame 加载网站。工作,但其中一些不允许加载到 iFrame 中。例如 google.com、youtube.com、theguardian.co.uk。即使我的 config.xml 中有
    <access origin="*" />

  2. .load();
    jQuery .load() 函数工作得更好一些。例如,它可以加载 google.com。但是网页中会缺少一些图像。并且搜索不会在那里工作。可能它可以通过相对路径以某种方式解决,但我没有运气尝试让它工作。

  3. inAppBrowser 插件
    它确实可以加载页面。但我需要的是网页视图顶部和底部的顶部和底部栏。我需要它才能快速访问我的应用程序的某些特定功能。并且在设计方面。在这里没有找到解决方法。也尝试过 childBrowser,但似乎不再支持它。

由于我已经有点绝望了,我会考虑您可以提出的任何解决方案。如果可以通过一些插件和一些JS代码来解决,那就太好了,但我已经明白我无法要求:\

因此,例如,这是我的 html 代码:

<div id="main-screen">
  <div id="links">
    <a href="http://google.com" class="link">
      Google
    </a>
    <a href="http://youtube.com" class="link">
      YouTube
    </a>
  </div>
</div>

<div id="web-container">
  <div id="top-bar">
  </div>

  <div id="web-content">
  </div>

  <div id="bottom-bar">
  </div>
</div>

这是我正在尝试做的一个例子:

$(document).on('click','a',function(e) {
  $('#main-screen').hide();
  $('#web-container').show();
  $('#web-content').load($(this).attr('href'));
});

预期结果是在 div 中完全加载页面,并在顶部和底部由基于自定义 html 的条形框框。

不要犹豫,询问任何进一步的信息,我很确定您会特别感兴趣。

提前谢谢你。

【问题讨论】:

  • 您希望工具栏具有什么样的行为?它们可以是 javascript - html 工具栏,还是必须是原生的?
  • 我希望它们有 Html/Js。因为他们启动了我用 JS 编写的应用程序的其他一些功能,并获取了一些信息(页面标题和它的 url)。但如果最后一句话没有问题,那么它可以是任何东西。
  • 然后您应该制作 iframe,在其中加载网页,在 javascript 中制作工具栏,并解决无法加载的页面的问题,因为一切都应该正常工作。在 SO 中查找白名单插件通配符
  • @Del,最后一个问题。您是否 100% 确定一切正常?因为我在我的 config.xml 中使用了&lt;gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" /&gt; 并且或多或少地所有网站都可以工作,但不是最大的网站,这是有道理的。谷歌不加载 iframe 的其他原因可能是什么?
  • 白名单插件包含在最新版本的cordova中,所以你不必这样做,我会用正确的配置写一个响应

标签: android jquery cordova phonegap-plugins childbrowser


【解决方案1】:

如果您使用的是cordova 5 或更高版本,您应该使用whitelist plugin,它应该是之前包含的。在添加之前做cordova plugin list

您还应该将其添加到您的 config.xml:

<allow-navigation href="*" />
<allow-intent href="*" />
<access origin="*" />

如果你愿意,你可以更具体。

并将此元数据添加到您的 index.html 或主页

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

【讨论】:

  • 嗨@Del,感谢您帮助我。我实际上已经尝试过这些解决方案。白名单插件就在那里,确实,我使用 Adob​​e builder。但它仍然不起作用。例如,如果您尝试加载 YouTube,它会出现:“拒绝在框架中显示 'youtube.com',因为它将 'X-Frame-Options' 设置为 'SAMEORIGIN'”
  • 谢谢@Del。但不幸的是,它并不能解决问题。我并不是专门为 youtube 寻找一种解决方法(而且这个方法实际上不适用于 youtube 主页面,仅适用于视频),如果可能的话,我需要一些适用于所有实例的解决方案。
【解决方案2】:

@Del 是正确的,因为那些 &lt;access-*&gt; 标记将允许所有内容正确加载,但 @Denis 仍然面临创建这些自定义工具栏的问题。我建议使用这些标签,同时对您尝试显示的站点进行 AJAX 调用,以在后台获取 HTML 内容。在该 AJAX 调用的成功回调中,使用这些自定义工具栏创建所需的新页面。

$("a").click(function(){
    $('#main-screen').hide();
    $('#web-container').show();
    $.ajax({
        url: $(this).attr('href'), 
        success: function(result){
            $("#web-content").html(result);
        }
    });
});

【讨论】:

  • 我对 .load()、ajax 或 iFrame 的主要问题实际上是它们不允许正确加载内容。因此,如果我将您的代码应用于youtube.com,例如,它不起作用(尝试控制台.log(结果),在您的示例中没有成功)。而 Ripple(我用于调试的工具)什么也没说 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多