javascript - 列出未附加的文档元素
问题描述
我正在尝试为 Chrome 创建一个扩展,以使用全局热键控制播放。我遇到过这样的问题:某处<audio/>
元素未附加到 DOM。这些元素是听得见的,但我听不到它们document.querySelector('audio')
(因为它只迭代附加的 DOM 元素)。
使用 DevTools 我可以看到这些元素:
> queryObjects(HTMLAudioElement)
< undefined
(3) [audio, audio, audio]
但是在 DevTools 之外使用这个函数是不可能的(它甚至不返回结果——这个函数只是将结果打印到控制台)。
我正在寻找一种方法来从我的扩展的 content_script(或背景)中获取未附加的音频元素。
我试过了:
document.getElementsByTagName('audio')
document.querySelectorAll('audio')
document.evaluate('//audio', ...
document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, ...
HTMLAudioElement
重新定义and的构造函数document.createElement
(失败:扩展有自己的window
和链接的document
)- 听
'play'
和'pause'
事件——它们不会冒泡
还有其他想法吗?也许有一些特定于扩展的功能?
解决方案
感谢@wOxxOm
我遵循了我的想法#5:重新定义and的构造函数HTMLAudioElement
Audio
document.createElement
注入.js:
var instances = [];
document.createElement = (function () {
var _createElement = document.createElement;
return function createElement() {
var result = _createElement.apply(document, Array.prototype.slice.call(arguments, 0));
if (result.tagName === 'AUDIO') {
instances.push(result);
}
return result;
};
})();
window.Audio = (function () {
var _Audio = window.Audio;
function Audio() {
var result = new _Audio();
instances.push(result);
return result;
};
Audio.prototype = Object.create(_Audio);
Audio.prototype.constructor = Audio;
return Audio;
})();
// further code (dom-event-based communication, misc functions etc)...
内容.js:
var injected = document.createElement('script');
injected.src = chrome.extension.getURL('inject.js');
(document.head || document.documentElement).appendChild(injected);
清单.json:
{
"manifest_version": 2
, "content_scripts": [{
"matches": ["<all_urls>"]
, "js": ["content.js"]
, "run_at": "document_start" // <-- important
, "all_frames": true
}]
, "web_accessible_resources": [
"inject.js"
]
// ...
}
将所有实例存储在数组中是有害的,但这是我看到的唯一方法:WeakSet
不可迭代。
推荐阅读
- php - 如何使用 PDO 绑定参数方法将多行文本插入 mysql?
- r - 数据框中的最大滚动和
- scala - 如何创建模拟元素的 Spark RDD?
- javascript - 用 JavaScript 舍入数字
- python - 如何删除 Django 模板中字符周围的空格?
- json - Firebase 无效的键名,尽管我使用了正确的 ASCII 符号
- php - 某些类别存档页面显示空白页面 - Wordpress
- ios - 如何从数组中移动单个 SKspritenode
- java - 具有多个参数的 Java 8 的 Function.Function
- webpack - Webpack4:<%= htmlWebpackPlugin.options.title %> 没有获取值