- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 setter 中的代码从内容脚本定义 window
对象上的属性 jQuery
。这样,当定义了实际的 jQuery 对象时,我可以立即使用它。不过,我似乎无法做到正确。
目标网站是 Outlook.com。这是 Outlook 的网络邮件版本。
我试图将代码直接放在内容脚本中,但即使我将 "all_frames": true
放在 list 的 content_scripts
部分(所以代码被注入(inject)每一帧),它不起作用。
function afterInit(){
var _jQuery;
console.log('This gets logged');
Object.defineProperty(window, 'jQuery', {
get: function() { return _jQuery; },
set: function(newValue) {
_jQuery = $ = newValue;
console.log('This is never logged!');
$(document.body).append($('<span>I want to use jQuery here</span>'));
}
});
}
afterInit();
我验证了 window.jQuery
之后由实际的 jQuery
函数/对象正确定义,但我的 setter 代码从未执行过。
我还通过消息传递尝试了它:我将带有代码的消息作为字符串发送到后台脚本,并使用 executeScript
在正确的选项卡上执行它,但这也不起作用。
chrome.runtime.sendMessage(
{action:'jQueryPreInit', value: '('+afterInit.toString()+')();'});
在我的后台脚本中:
chrome.runtime.onMessage.addListener(function(message, sender, callback) {
switch (message.action){
case "jQueryPreInit": chrome.tabs.executeScript(sender.tab.id, {code: message.value});
}
});
如果我在 executeScript
代码中放置 Object.defineProperty
代码之外的其他代码,则可以正常工作。我只是在定义属性时遇到问题。
最佳答案
(引自评论)
I want to use the jQuery provided by the page itself. I could try inserting the same jQuery file as Outlook does and hope it gets loaded from cache, but I'd rather just keep my extension as clean as possible, and use what is already available.
您优化扩展的尝试不可行/不推荐。
首先,由于 the isolation between content script and webpage code ,您将无法使用该页面的代码。您无法获得对页面自己的 jQuery
/$
的引用。
但让我们暂时假设您可以。然后该站点将 jQuery 更新到另一个版本,重命名 jQuery
对象或完全停止使用它,这是您无法控制的。结果:您的分机坏了。这首先是隔离背后的部分原因。
作为上下文隔离的结果,您可以保证您的 jQuery 副本与站点上运行的任何内容之间没有冲突。所以您无需担心:使用您的副本,并使用标准的 $
访问它。
将 <100 KB 的文件与您的扩展捆绑在一起作为一次性下载,确保代码在 100% 的时间内可用,并且在最坏的情况下磁盘访问延迟不会降低它的“干净度”,恰恰相反。这是一种常见的做法,并且是 enshrined in the docs 。
查看您的实际代码,它在内容脚本上下文中执行(无论是通过 manifest 还是 executeScript
),而不是在页面上下文中。因此,无论页面做什么,都不会在那里定义 $
。
I verified that window.jQuery is properly defined afterwards by the actual jQuery function/object [...]
我假设您尝试在控制台中执行 window.jQuery
;默认情况下,executes it in the page context, not in your content script context(因此,不反射(reflect)内容脚本上下文的状态并且不调用您的 getter/setter)。如果您想测试您的内容脚本,您需要将控制台上方上下文下拉列表中的 top
更改为您的扩展程序的上下文。
尽管如此,
When all is said and done, I want to use jQuery's ajaxSuccess function to execute code every time an e-mail is opened in the read pane.
这里我们遇到了一个问题。由于内容脚本代码和网页代码是隔离的,您的代码永远不会知道在页面副本中执行的 AJAX(无论如何都不会通过 ajaxSuccess
)。
可能的行动方案:
<script>
标记注入(inject)页面。在那里,您可以访问该页面的 jQuery 副本,在发生某些事情时附加您的监听器和 message your content script。webRequest
API 的事件。这可能会拦截 AJAX 调用,但不会给您回复内容。最后说明:这可能不像 AJAX 调用那么简单;也许该页面维护一个 WebSocket 连接以获取实时推送更新。 Tapping into this 比较棘手。
关于javascript - 如何在选项卡的主窗口对象上定义属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37318513/
https://github.com/mattdiamond/Recorderjs/blob/master/recorder.js中的代码 我不明白 JavaScript 语法,比如 (functio
在 iOS 7 及更早版本中,如果我们想在应用程序中找到 topMostWindow,我们通常使用以下代码行 [[[UIApplication sharedApplication] windows]
我已经尝试解决这个问题很长一段时间了:我无法访问窗口的 url,因为它位于另一个域上..有一些解决方案吗? function login() { var cb = window.ope
是否可以将 FFMPEG 视频流传递到 C# 窗口?现在它在新窗口中作为新进程打开,我只是想将它传递给我自己的 SessionWindow。 此时我像这样执行ffplay: public void E
我有一个名为 x 的矩阵看起来像这样: pTime Close 1 1275087600 1.2268 2 1275264000 1.2264 3 1275264300 1.2
在编译时,发生搜索,grep搜索等,Emacs会在单独的窗口中创建一个新的缓冲区来显示结果,有没有自动跳转到那个窗口的方法?这很有用,因为我可以使用 n 和 p 而不是 M-g n 和 M-g p 移
我有一个启动 PowerShell 脚本的批处理文件。 批处理文件: START Powershell -executionpolicy RemoteSigned -noexit -file "MyS
我有一个基于菜单栏的应用程序,单击图标时会显示一个窗口。在 Mac OS X Lion 上一切正常,但由于某种原因,在 Snow Leopard 和早期版本的 Mac OS X 上会出现错误。任何时候
在 macOS 中,如何在 Xcode 和/或 Interface Builder 中创建带有“集成标题栏和工具栏”的窗口? 这是“宽标题栏”类型的窗口,已添加到 OS X 10.10 Yosemit
在浏览器 (Chrome) 中 JavaScript: var DataModler = { Data: { Something: 'value' }, Process: functi
我有 3 个 html 页面。第 1 页链接到第 2 页,第 2 页链接到第 3 页(为了简单起见)。 我希望页面 2 中的链接打开页面 3 并关闭页面 1(选项卡 1)。 据我了解,您无法使用 Ja
当点击“创建节点”按钮时,如何打开一个新的框架或窗口?我希望新框架包含一个文本字段和下拉菜单,以便用户可以选择一个选项。 Create node Search node
我有一个用户控件,用于编辑应用程序中的某些对象。 我最近遇到一个实例,我想弹出一个新的对话框(窗口)来托管此用户控件。 如何实例化新窗口并将需要设置的任何属性从窗口传递到用户控件? 感谢您的宝贵时间。
我有一个Observable,它发出许多对象,我想使用window或buffer操作对这些对象进行分组。但是,我不想指定count参数来确定窗口中应包含多少个对象,而是希望能够使用自定义条件。 例如,
我有以下代码,它打开一个新的 JavaFX 阶段(我们称之为窗口)。 openAlertBox.setOnAction(e -> { AlertBox alert = AlertBox
我要添加一个“在新窗口中打开”上下文菜单项,该菜单项将以新的UIScene打开我的应用程序文档之一。当然,我只想在实际上支持多个场景的设备上显示该菜单项。 目前,我只是在检查设备是否是使用旧设备的iP
我正在尝试创建一个 AIR 应用程序来记录应用程序的使用情况,使用 AIR 从系统获取信息的唯一简单方法是使用命令行工具和抓取 标准输出 . 我知道像 这样的工具顶部 和 ps 对于 OS X,但它们
所以我有这个简单的 turtle 螺旋制作器,我想知道是否有一种方法可以打印出由该程序创建的我的设计副本。 代码: import turtle x= float(input("Angle: ")) y
我正在编写一个 C# WPF 程序,它将文本消息发送到另一个程序的窗口。我有一个宏程序作为我的键盘驱动程序 (Logitech g15) 的一部分,它已经这样做了,尽管它不会将击键直接发送到进程,而是
我尝试使用以下代码通过 UDP 发送,但得到了奇怪的结果。 if((sendto(newSocket, sendBuf, totalLength, 0, (SOCKADDR *)&sendAd
我是一名优秀的程序员,十分优秀!