如何用鼠标 select 页面上的元素并将其隐藏在 javascript 中

How to select an element on a page with the mouse and hide it in javascript

我正在为 chrome 进行测试扩展。 我的问题:

是否可以为 select 一个元素创建事件脚本并用鼠标隐藏它?当您按 Shift+Ctrl+C 时,类似于检查元素 selection 工具。注意:我不希望 DOM 回流。

这是我的代码:

content.js:

var elems = document.getElementsByTagName("iframe");

$(document).ready(function() {
    for (var i = 0, max = elems.length; i < max; i++) {
        elems[i].hidden = true;
    };
});

window.onload = function() {
    for (var i = 0, max = elems.length; i < max; i++) {
        elems[i].hidden = true;
    }
};

$(window).load(function() {
    for (var i = 0, max = elems.length; i < max; i++) {
        elems[i].hidden = true;
    };
});

for (var i = 0, max = elems.length; i < max; i++) {
    elems[i].hidden = true;
};

manifest.json:

{
  "manifest_version":2,
  "name":"Test",
  "description":"A Basic program",
  "version":"0.1",
  "background":{
     "scripts":[

     ]
  },
  "content_scripts":[
     {
        "matches":[
           "<all_urls>"
        ],
        "js":[
          "jquery-3.2.1.min.js",
          "content.js"
        ]
     }
  ],

  "browser_action":{
     "default_title":"Test"
   }
 }

select 一个元素有多种不同的方式,隐藏它的方式也有多种。

首先,您可以使用 chrome.contextMenus.create 添加上下文菜单项。

要处理调和弦(如 SHFT+CTRL+C),您需要在页面中添加背景脚本。

在这种情况下,您可以操纵 DOM 来隐藏该元素。使用 element.style.display = 'none' 折叠其周围的内容,或使用 element.style.opacity = '0' 隐藏它同时保持页面的其余部分不变。

查看您的源代码:

var elems = document.getElementsByTagName("iframe");

好的,这应该会获取页面中的所有 <iframe> 标签,假设它们已经加载。默认情况下 content scripts fire after the DOM is complete but can be before or after the onload event.

接下来...

$(document).ready(function() { ...
window.onload = function() { ...
$(window).load(function() { ...

这些似乎是将其与已完成加载的文档挂钩的不同尝试。问题是 window.onload 可能(或可能没有)已经解雇。您可以强制内容脚本在 window.onload 之前 运行,在 manifest.json 中使用 "run_at": "document_end",但我认为这不是您想要的。

请注意,所有这些都在使用您从 DOM 获得的 elems 变量和内联脚本,因此如果 <iframe> 在事件触发之前不存在那么它就不会在数组中。

最后,所有这些似乎都在尝试循环 <iframe>s:

for (var i = 0, max = elems.length; i < max; i++) {
    elems[i].hidden = true;
};

这很好,但使用 elems[i].style.visibility = 'hidden' 可以避免回流 DOM。所以(使用 Chrome 扩展支持的 ES6 语法):

function hideIframes() {
    const elems = document.getElementsByTagName('iframe');
    for (let e of elems) {
        e.style.visibility = 'hidden';
    };
}

// Don't do all of these - pick one that suits your context
hideIframes(); // Run inline on document_idle
$(hideIframes); // Run on jQuery complete
setTimeout(hideIframes, 3000); // Run again in 3s

我认为你的问题是当内容脚本 运行s 时,你要查找的 <iframe>s 还没有出现在页面中。您可能需要针对您认为正在添加它们的特定事件添加检查。