【问题标题】:What is the best way to show a sidebar/popup window on a context menu item click?在上下文菜单项单击时显示侧边栏/弹出窗口的最佳方式是什么?
【发布时间】:2016-08-23 21:40:56
【问题描述】:

问题

当用户单击上下文菜单项(我通过扩展程序背景页面创建)或用户单击浏览器操作图标时,我想在网页上显示弹出窗口或侧边栏窗口。这个侧边栏窗口将显示一些 HTML 标记,我将在我的扩展目录中的一个单独的文件(sidebar.html)中拥有这些标记,并且这个 sidebar.html 将由 sidebar.js 管理(也是我目录中的一个文件)我的问题是什么显示此 sidebar.html 的最佳方式是什么?

我不希望它成为模式或灯箱,以便为我的用户提供更好的用户体验,我也知道不希望它成为浏览器操作弹出窗口,无论如何都无法以编程方式打开。

这是我正在寻找的确切内容的 gif,

http://recordit.co/y2QdGrdzGa


目前的尝试

据我了解(我可能是错的),从我读到的很多答案中,我几乎没有选择。

选项 1 - 注入 HTML 使用内容脚本注入 sidebar.html,该脚本中有一个侦听器,用于侦听来自后台脚本的消息以进行上下文菜单单击或浏览器操作单击。收到消息后,将运行以下内容脚本(contentscript.js),

  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) 
  {
   if ( request.action == "openSideBar" ) {
     $.get(chrome.extension.getURL('../sidebar.html'),
     function(data) {
       $(data).appendTo('body');
     });
   }});

这是我的 sidebar.html

<!DOCTYPE html>
<html><head>
    <title>I am Sidebar</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <link href="sidebar.css" rel="stylesheet" type="text/css">

    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="sidebar.js"></script>

</head><body>
<p>Hello World!</p>
</body></html>

选项 1a - 在页面中注入 sidebar.js 作为注入脚本(不推荐) 选项 1b - 使用 Sidebar.js 作为内容脚本与 sidebar.html 进行通信。因为我在 sidebar.js 中使用 Angular,所以我在这里遇到了一些复杂性,但如果这是我采取的路线,我可以解决这个问题。

选项 2 - 使用 iframe -

从那里阅读了很多答案,听起来大多数人都想在页面上显示一个窗口,使用 iframe 之类的东西

var iFrame  = document.createElement ("iframe");
iFrame.src  = chrome.extension.getURL ("sidebar.html");

document.body.insertBefore (iFrame, document.body.firstChild);

选项 3 - Shadow DOM

我什至不知道该怎么做。我什么也找不到。我确实找到的几个答案听起来与选项 1 相似。


到目前为止阅读的答案

Injecting chrome extension UI using shadow DOM

Injecting content script in dynamically created iframe

Chrome Extension - Injected Iframe not accessing Chrome browserAction or chrome.tabs or AngularJS

How to show a modal popup from the context menu?

Chrome extension inject sidebar into page


我一直在从一个问题跳到另一个问题,试图找到一种可靠的方法,但所有答案都指向其他问题。希望有人可以给出一个非常简单的答案,例如“Iframe 是最好的解决方法,因为某某”

【问题讨论】:

    标签: javascript angularjs google-chrome google-chrome-extension


    【解决方案1】:

    默认弹出窗口仅在用户单击浏览器操作图标后显示。

    如果您喜欢使用上下文菜单项,则不能使用 Chrome 的默认弹出窗口 (https://bugs.chromium.org/p/chromium/issues/detail?id=30491)。这意味着您必须想出另一种解决方案来为当前网页中的用户界面注入 HTML 代码。一种合理的方法是注入 iframe。通过使用 iframe,您可以重新创建一个类似于您在 gif 中显示的界面。

    【讨论】:

      【解决方案2】:

      您可以使用选项 1b(将 sidebar.js 用作 content script)或选项 2(使用 iframe)。

      但我更喜欢选项 2,因为:

      1. 如果您使用的是 angularjs,则每次注入框架时都不必引导您的 Angular 应用程序。
      2. 您在 iframe 中的 css 文件不会与页面 UI 冲突。请参阅我的问题: Using bootstrap.css as content script distorts gmail UI?
      3. 您可以将整个应用程序代码放在 iframe 中,并使用内容脚本注入框架并仅侦听消息。您的代码将易于维护和调试。

      【讨论】:

      • 谢谢。刚刚选择了你的答案。在同一行上,您是否知道某些站点是否会在注入此 iframe 时出现问题(不会显示此 iframe)..... 就像使用 HTTPS 加载的站点一样,因为我的 iframe 正在与后端通信。
      • @ManUnitedFan 一些网站可能会将 iframe 注入视为恶意活动。我已成功在 mail.google.com 中注入 iframe。虽然我认为它值得提出一个新问题。
      • 刚刚添加到这里。 stackoverflow.com/questions/36988752/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多