- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建我自己类型的 Chrome 开发工具(检查元素),它也将采用使用 JavaScript 的 Chrome 扩展程序的形式。我希望它具有与 Chrome 开发工具类似的功能,其中之一我发现很难揭穿他们是如何做到的。
基本上,当您右键单击任何元素并单击“检查元素”时,它会打开开发工具(如果尚未打开)并将鼠标悬停在您右键单击所针对的 HTML 元素上。
我想复制的一点是,当您刷新页面时,您仍然在开发工具中选择了元素,它将重新加载所有 HTML 并直接转到您在重新加载之前在开发工具中选择的元素。
如果有点不清楚,我的意思是:
HTML:
<div class="1">
<div class="2">
<div class="3"></div>
</div>
</div>
如果我将鼠标悬停在类为“3”的 div 上并刷新页面,Chrome 开发工具知道重新加载开发工具并突出显示该确切的 div。即使有多个具有该类或类似结构的 div,它也始终会悬停在正确的那个上。
谁知道这里最好的方法是否是有一个大的 if 语句来寻找元素的某些特征,例如理想情况下的 id,但如果元素没有 id,例如 surrounding,还有很多回退元素或与该元素关联的唯一类/属性?
我尝试搜索“Chrome 扩展节点选择器”或类似的变体,但未能找到任何信息。
最佳答案
您可以找到一个非常好的“检查元素”扩展 here .但是,它不支持保存检查的元素。但由于这是一个赏金问题,我可以给你一些提示,以改进它以成为一个可行的解决方案。
我在这里看到的主要问题是“序列化”元素。可以找到关于这个主题的一个很好的答案 here . (另见 fiddle)它基本上总结为“找到最近的具有 ID 的祖先并向下跟踪路径到被检查的元素”。在您的情况下,这可能是:
tracePath: function (element, result) {
if (element.id !== '') {
result.push({
id: element.id
});
return;
}
if (element === document.body) {
result.push({
tag: element.tagName
});
return;
}
var siblings = element.parentNode.childNodes;
for (var i = 0; i < siblings.length; ++i) {
var sibling = siblings[i];
if (sibling === element) {
result.push({
index: i,
tag: element.tagName
});
return this.tracePath(element.parentNode, result);
}
}
},
上面只是存储了反序列化过程中要遵循的节点数组:
find: function (path) {
var element;
while (path.length) {
var current = path.pop();
if (!current) return element;
if (current.id) element = document.getElementById(current.id);
else if (element) {
if (current.index < element.childNodes.length && current.tag === element.childNodes[current.index].tagName)
element = element.childNodes[current.index];
else
return;
} else {
var matches = document.getElementsByTagName(current.tag);
if (matches.length)
element = matches[0];
}
}
return element;
},
一旦我们这两个,我们只需要存储/加载选择的方法:
store: function (path) {
var selection = Object.create({});
selection[window.location.href] = path;
chrome.storage.local.set(selection, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError)
}
})
},
并加载:
load: function () {
var self = this, key = window.location.href;
chrome.storage.local.get(key, function (found) {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError)
} else if (found && found[key]) {
var path = found[key],
element = Util.find(path);
if (element) {
// zoom into inspected element
element.scrollIntoView();
// add selection to Inspector instance
self.$selection = element;
// function similar to layout() - highlights inspected element
self.select();
}
}
})
}
然后您可以编写一个突出显示功能,比如 select
来突出显示被检查的元素,类似于现有的 layout
突出显示标尺。
单击元素时可以保存元素:
registerEvents: function() {
...
document.addEventListener('click', function () {
var path = [];
Util.tracePath(this.$target, path);
this.$selection = this.$target;
this.select(true);
this.storeSelection(path);
}.bind(this));
...
},
有一个包含上述修改的分支,您可以找到 here .您可以通过 downloading 试用一下它并将 app
文件夹作为解压扩展加载到 chrome://extensions/
下的新选项卡中。享受吧!
关于javascript - Chrome Dev Tools - 通过页面重新加载记住选择的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45104795/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
i=5 expr $i + 6 1>/dev/null 将标准输出重定向到/dev/null。怎么样 expr $i + 6 >/dev/null expr $i + 6 1>/dev/null 和
在 R 中,可以握住设备,绘制图片,然后刷新设备来渲染图形。这对于具有数千个数据点、颜色渐变等的非常复杂的绘图非常有用,因为如果不保持,设备将在每次绘图操作后刷新。效果非常好。 但是,一旦绘图就位,任
我想通过串口dev文件执行IPC管道。这是要求首先我尝试使用 sudo socat /dev/ttyS0,raw,echo=0,crnl /dev/ttyS1,raw,echo=0,crnl 报错如下
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我正在尝试使用 mpg123 播放随机歌曲命令行。但不知道我的默认音频设备是什么。或者如果我需要使用“-a”选项指定任何其他音频设备。/dev/audio 和/dev/dsp 都是音频设备。如何知道哪
我可以看到/dev/uinput 和/dev/input 都存在于我的 Ubuntu 中并且它们很相似。它们可用于检测/模拟按键/鼠标/触摸事件。所以我对它们之间的区别感到困惑?谢谢! 新增:是的,我
cat/dev/urandom 总是一种在显示器上创建滚动字符的有趣方式,但会产生太多不可打印的字符。 有没有一种简单的方法可以在命令行上对其进行编码,使其所有输出都是可读字符,例如 base64 或
是否可以在没有 bit.dev 帐户的情况下将 bit 设置为本地服务器以进行内部处理? 我知道您可能没有相同的功能 -- bit's FAQ page说“与 Bit CLI 不同,bit.dev 服
我试图在 Ubuntu 的启动过程中尽早采样一些随机性。我想知道是否有人建议如何做到这一点。我目前的想法是寻找/dev/random 和/dev/urandom 在引导序列中创建的位置,并在那里添加我
我正在尝试使用'dotnet dev-certs'工具导出https证书以包含在Docker镜像中。现在我正在使用: dotnet dev-certs https -v -ep $(HOME)\.as
我发现非常方便的 dev.copy2pdf 命令可以将我正在查看的窗口复制到 pdf 文件中,如下所示: plot(rnorm(1000)) dev.copy2pdf(file="myfile.pdf
谁能告诉我为什么从硬盘驱动器上清除数据时出于安全性考虑首选/dev/random? 最佳答案 简单的答案,/dev/random不是首选。两者同样安全。使用/dev/zero可以更轻松地进行验证。还可
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有一个从 initramfs 镜像启动的嵌入式 Linux(vanilla、3.3.8、i486、Vortex86dx)系统。 我有一个 IDE 闪存盘,在/dev/hda1 和/dev/hda2
在Linux中,/dev/ttyS0和/dev/ttys0有什么区别? 我知道第一个是串行端口,但第二个是什么,带有小的 s? 最佳答案 see this For a pseudo terminal
我有一些命名空间的测试被自动加载到包 A 中使用 "autoload-dev": { "psr-4": { "Vendor\\PackageA\\PhpUnit\\": "te
我意识到/dev/stdout 和/dev/stderr 文件在没有根目录的 Android 设备上不存在。我同意这一点——但我需要一些方法来在我的 shell 脚本中重定向输入/输出——包括将输出重
我想对使用 composer 安装的软件包的最低支持版本运行测试,但理想情况下我想要最新版本的开发软件包。 具体来说,我想运行它来安装最低版本的软件包以进行测试: composer update --
我必须将开发分支从 testing 重命名为 tom 。重命名后,我必须创建一个具有相同名称的开发分支,它是 testing 并且它应该指向 master 的特定提交。 我已将分支重命名为: git
我是一名优秀的程序员,十分优秀!