Javascript 如何操作Google任务添加的节点?

Javascript 如何操作Google任务添加的节点?,javascript,google-chrome,google-chrome-extension,content-script,google-tasks,Javascript,Google Chrome,Google Chrome Extension,Content Script,Google Tasks,我目前正在尝试更改此Google tasks小工具的样式元素: https://mail.google.com/tasks/ig 使用chrome内容脚本 在本例中,我将删除底部的工具栏。因为Google正在用javascript生成HTML,并将其放入iframe中。我需要使用以下代码: document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById(':1.ft').style.display

我目前正在尝试更改此Google tasks小工具的样式元素:

https://mail.google.com/tasks/ig
使用chrome内容脚本

在本例中,我将删除底部的工具栏。因为Google正在用javascript生成HTML,并将其放入iframe中。我需要使用以下代码:

document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById(':1.ft').style.display = 'none'
当您从开发人员控制台运行此代码时,它会隐藏工具栏。但它不能作为内容脚本工作

我认为这是因为代码是在页面准备好之前运行的。因此,我尝试使用事件侦听器:

document.addEventListener("DOMContentLoaded", function () {
document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById(':1.ft').style.display = 'none'
}, false);
但这也不起作用。还尝试了事件侦听器“domready”和“load”。但没有一个成功


如何获取该元素?

在这种情况下,您只需确保将此样式规则应用于适当的iframe,而不必担心何时加载它:

:1.ft{显示:无!重要;}
(^u^)
但是,对于带有
src=“javascript:…
的iFrame,这可能是不可能的


在更一般的情况下。如果该节点(或其包含的iframe)是由AJAX加载的,那么它无疑会在“domready”甚至“load”之后很久出现。
行之有效的解决方案是轮询元素:

var waitforelementntrvl=setInterval(checkForElement,333);
函数checkForElement(){
var firstIframe=document.querySelector(“iframe”);
如果(第一帧){
var targetelement=firstIframe.contentWindow.document.getElementById(':1.ft');
如果(目标元素){
targetElement.style.display='none';
clearInterval(WaitForelementTrvl);
}
}
}

然而: Google Chrome内容脚本仍然无法与iframed DOM配合使用。因此,为了使该代码正常工作,必须将其注入目标页面。最终的内容脚本代码为:

函数userscriptMain(){
var waitforelementntrvl=setInterval(checkForElement,333);
函数checkForElement(){
var firstIframe=document.querySelector(“iframe”);
如果(第一帧){
var targetelement=firstIframe.contentWindow.document.getElementById(':1.ft');
如果(目标元素){
targetElement.style.display='none';
clearInterval(WaitForelementTrvl);
}
}
}
}
addJS_节点(null,null,userscriptMain);
函数addJS_节点(文本、s_URL、函数run、runOnLoad){
var D=文件;
var scriptNode=D.createElement('script');
如果(runOnLoad){
scriptNode.addEventListener(“加载”,runOnLoad,false);
}
scriptNode.type=“text/javascript”;
如果(text)scriptNode.textContent=text;
如果(s_URL)scriptNode.src=s_URL;
if(funcToRun)scriptNode.textContent='('+funcToRun.toString()+')()';
var targ=D.getElementsByTagName('head')[0]| | D.body | | D.documentElement;
target.appendChild(脚本节点);
}

在这种情况下,您只需确保将此样式规则应用于适当的iframe,而不必担心何时加载它:

:1.ft{显示:无!重要;}
(^u^)
但是,对于带有
src=“javascript:…
的iFrame,这可能是不可能的


在更一般的情况下。如果该节点(或其包含的iframe)是由AJAX加载的,那么它无疑会在“domready”甚至“load”之后很久出现。
行之有效的解决方案是轮询元素:

var waitforelementntrvl=setInterval(checkForElement,333);
函数checkForElement(){
var firstIframe=document.querySelector(“iframe”);
如果(第一帧){
var targetelement=firstIframe.contentWindow.document.getElementById(':1.ft');
如果(目标元素){
targetElement.style.display='none';
clearInterval(WaitForelementTrvl);
}
}
}

然而: Google Chrome内容脚本仍然不能很好地处理iframed DOM。因此,为了使代码正常工作,必须将其注入目标页面。最终的内容脚本代码为:

函数userscriptMain(){
var waitforelementntrvl=setInterval(checkForElement,333);
函数checkForElement(){
var firstIframe=document.querySelector(“iframe”);
如果(第一帧){
var targetelement=firstIframe.contentWindow.document.getElementById(':1.ft');
如果(目标元素){
targetElement.style.display='none';
clearInterval(WaitForelementTrvl);
}
}
}
}
addJS_节点(null,null,userscriptMain);
函数addJS_节点(文本、s_URL、函数run、runOnLoad){
var D=文件;
var scriptNode=D.createElement('script');
如果(runOnLoad){
scriptNode.addEventListener(“加载”,runOnLoad,false);
}
scriptNode.type=“text/javascript”;
如果(text)scriptNode.textContent=text;
如果(s_URL)scriptNode.src=s_URL;
if(funcToRun)scriptNode.textContent='('+funcToRun.toString()+')()';
var targ=D.getElementsByTagName('head')[0]| | D.body | | D.documentElement;
target.appendChild(脚本节点);
}

很抱歉。我忘了提到必须注入代码。请参阅更新的答案。不客气。很乐意帮忙。如果这对你有用的话,请原谅。我忘了提到必须注入代码。请参阅更新的答案。不客气。很乐意帮忙。如果这对你有用的话,请。