谷歌浏览器“应用程序快捷方式”:如何自动加载JavaScript?

34

介绍
谷歌浏览器有一个功能,允许您创建网页快捷方式并使它们显示为传统的桌面应用程序。

例如,Twitter移动版的快捷方式可能是:

C:\Users\<username>\AppData\Local\Google\Chrome\Application\chrome.exe  --app=https://mobile.twitter.com/

这个应用的文件图标存储在

C:\Users\<username>\AppData\Local\Google\Chrome\User Data\Default\Web Applications\mobile.twitter.com\https_80

我的问题
我已经有一段时间没有使用这个功能了,我记得你可以将自己的JavaScript文件添加到应用程序文件夹中,在应用程序加载时包含它们。然而,我找不到任何讨论此功能的文档,但我有99%的把握说它存在。

如果有人知道此功能是否可用以及需要创建哪些文件,请提供详细信息。

澄清

我基本上是使用Chrome的“应用程序快捷方式”打开一个网页,并希望该网页每x秒刷新一次。但是,我无法控制此网页。

我确信在早期版本的Chrome中,这是可能的...除非我疯了。


你能澄清一下你想用你的JavaScript文件做什么吗?当你说“在应用程序加载时包含”时,你确切地是什么意思?由于我假设你想要一个指向网站的链接,那么JavaScript文件的目的是什么? - agarcian
@GGG,我不明白为什么问这个有问题。可能有其他方法来实现他想要做的事情。了解最终目的可能会帮助人们更好地回答问题,而不是猜测。有些人可能会这样回答:“我不确定这是否正是你想要的”,表明他们不确定原始问题的确切目的。 - agarcian
@agarcian 好的,我理解他想要完整的用户脚本功能,我甚至没有考虑到这种情况。 - Dagg Nabbit
仅供参考,我写了一个回答建议将其设置为托管应用程序,并包含内容脚本,但是我刚刚尝试了一下,显然Chrome不允许在托管应用程序中使用内容脚本,所以我删除了这个回答。 - Dagg Nabbit
2个回答

103

Chrome扩展和它们的内容脚本也会在应用模式下启动 Chrome 时被加载。

因此,您可以创建一个简单的扩展程序,通过以下方式向页面注入JavaScript代码:

1. 创建一个manifest.json文件

{
  "name": "Run code on twitter mobile",
  "version": "1.0",
  "manifest_version": 2,
  "content_scripts": [
    {
      "js": [
        "contentscript.js"
      ],
      "matches": [
        "https://mobile.twitter.com/*"
      ]
    }
  ],
  "web_accessible_resources": [
    {
      "resources": [
        "script.js"
      ],
      "matches": [
        "https://mobile.twitter.com/*"
      ]
    }
  ]
}

2. 内容脚本

接着,创建一个名为contentscript.js的文件,并添加所需的JavaScript代码。
该脚本将在每次加载匹配页面时被包含。所有的DOM方法都可以通过document对象直接访问。然而,windowdocument.defaultView不指向页面中的window对象 [源]

如果你想要访问全局方法或属性,必须动态创建一个<script>元素,并将其注入到页面中(详见Building a Chrome Extension - Inject code in a page using a Content script)。

contentscript.js

var s = document.createElement('script');
s.src = chrome.extension.getURL('script.js');
(document.head||document.documentElement).appendChild(s);
s.onload = function() {
    s.parentNode.removeChild(s);
};

3. 将被注入的脚本

然后,创建一个名为script.js的文件,并将其放置在与manifest.jsoncontentscript.js相同的文件夹中。在script.js中的代码会像页面的真正部分一样执行。

内容脚本参考

Web可访问资源参考


4
要加载一个扩展程序,首先访问 chrome://extensions/,激活“开发者模式”,然后点击“加载已解压的扩展程序”按钮。选择包含你的 manifest.json(以及 contentscript.js, script.js)文件的目录,然后进行确认。如果你想在隐私浏览模式下测试该扩展程序,请展开描述并勾选相应选项。当你更新脚本后,必须 点击“重新加载扩展程序”按钮以查看更改。 - Rob W
2
@GateKiller,你最好使用 setInterval(function(){location.reload(true);}, 30000);。不建议将字符串作为 setTimeout 的参数。我用 setInterval 替换了 setTimeout,以处理意外的导航取消(这可能会破坏你的脚本)。如果你真的喜欢这个功能,请使用 setTimeout(function(){location.reload(true);},3000); - Rob W
1
@Sudarshan 这不是复制(那将会很昂贵),而是通过代理访问。为了清楚起见,windowparenttopframesdocument.defaultView等都指向内容脚本中的全局对象,这与页面的全局对象完全不同。 - Rob W
@Dave,“tabs” 权限只在一些情况下才需要(https://developer.chrome.com/extensions/tabs.html#manifest),程序化脚本执行不是其中之一。此外,主机权限也不需要,因为它们被清单文件中内容脚本声明的“匹配”键所隐含。 - Rob W
1
我在使用这个时遇到了一个错误,因为“web_accessible_resources”的格式已经改变,请参见https://developer.chrome.com/docs/extensions/mv3/manifest/web_accessible_resources/。应该像这样做:```"web_accessible_resources": [ {"matches": ["http://mobile.twitter.com/*"], "resources":["script.js"] } ]``` - Maarten Derickx
显示剩余8条评论

-5

我猜你想要包含一些JavaScript来执行一些“启动”应用程序的操作,也许是在加载目标URL时调整窗口大小?

这里有一些你可以做的事情,就像this post中建议的那样:

本地创建一个包含所需运行的JavaScript的HTML页面。

将这个: C:\Users\<username>\AppData\Local\Google\Chrome\Application\chrome.exe --app=https://mobile.twitter.com/

改为这个:

C:\Documents and Settings\<username>\Local Settings\Application Data\Google\Chrome\Application\chrome.exe” –app=file:///C:/Documents%20and%20Settings/<username>/My%20Documents/My %20Custom%20Shortcuts/twitter_mobile_launcher.html

你的twitter_mobile_launcher.html文件将如下所示:

<html>  
 <head>  
  <script type="text/javascript">  
   // Do what you need with your javascript, for example, resizing your window...
   window.resizeTo(300,400);  
   window.moveTo(300,0);  
   window.location = "https://mobile.twitter.com/";  
  </script>  
 </head>  
 <body>  
  <h1>If you see this, the redirect did not work properly.</h1>  
 </body>  
</html>  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接