【问题标题】:chrome extension -- appending div to body not working with facebook like buttonchrome 扩展 - 将 div 附加到 body 不能与 facebook 按钮一起使用
【发布时间】:2012-10-18 03:28:46
【问题描述】:

我正在创建一个 chrome 扩展程序,到目前为止我已经成功了。作为最后一个功能,当用户单击我的扩展程序面板中的“关于”部分时,我正在尝试将一个 div(显示关于我的个人网站的小型、无刺激性的广告)附加到当前打开的选项卡/页面的正文中。我也让它工作了。

但问题是,如果该页面包含 facebook like 或 twitter follow 小部件,则此 div 不会附加到主页的 body 标记。相反,它会附加到上述小部件的 iframe 中的 body 标签上。

当我检查此类页面的 dom 结构时,这些小部件会在 iframe 中创建自己的 html>body 结构。这就是导致此问题的原因。

我尝试将此 div 附加到第一个 body 元素,如下所示:

var mainbody = document.getElementsByTagName('body');
mainbody[0].appendChild(adDiv);  --> adDiv = new element I created above this code with its own properties

通过上面的第二条语句,我希望它附加到第一个标签而不是内部标签。

不幸的是,这也不起作用。我可以看到它连接到 facebook/twitter 小部件而不是 main 。我在做什么有什么问题吗?


编辑

根据@stan 的评论,我能够在带有 facebook/twitter 小部件(即带有 iframe 的小部件)的页面中解决问题。现在我的代码如下所示:

document.body.appendChild(adDiv);

-- 谢谢斯坦。

但现在我面临另一个问题。在某些网站(如http://www.glassdoor.com/index.htm)中,div 没有出现在页面中。实际发生的是,div 正在连接到身体,但同时它也被移除。只能借助 html 检查器(本例中为 chrome 的检查器)才能看到。

div(adDiv) 在标记中附加到正文并消失。 它好像无法将自己与身体绑定。结果:页面中没有出现任何内容。

知道为什么会这样吗?它只发生在像上述那样的少数网站。


background.js

chrome.browserAction.onClicked.addListener(function(tab){
    chrome.tabs.sendMessage(tab.id,{clicked:1});
});

content.js

chrome.extension.onMessage.addListener(function(request,sender,sendResponse){
    if(request.clicked==1){
        /* Create adDiv and apply style to it using JS */
        document.body.appendChild(adDiv);
    }
}

【问题讨论】:

  • 您需要提供一些无法正常工作的网站示例,因为我无法复制它。我试过thisthis 但没有运气。在每一页上只能找到一个<body>。我还尝试等待页面完全加载(以便我确定所有社交小部件都已加载),但我仍然从document.getElementsByTagName('body') 中得到一个<body>
  • 你可以试试document.body.appendChild?
  • @Stan 成功了。谢谢!但是在某些站点(例如glassdoor.com/index.htm)中,我可以看到 div 被附加并在同一时刻被删除。我使用 chrome 的 html 检查器注意到了这一点。我可以看到 div 在标记中附加到正文,但同时它被删除了。结果:页面中没有出现任何内容。知道为什么吗?
  • 如果这仅发生在特定网站上(并且适用于所有其他网站),我认为您应该分析他们的 javascripts。或许,如果您将您的孩子推迟到网站脚本完成工作的那一刻,您可能会成功。如果脚本确实监视 DOM 更改,您应该以某种方式阻止它们进入您的扩展程序,但这当然会破坏网站的正常行为。
  • 但是我们扩展的 JS 代码不是在完全隔离的环境中工作吗?如果是这样,我该如何阻止或处理站点的JS?

标签: javascript google-chrome dom google-chrome-extension


【解决方案1】:

对于问题的第一部分,您可能应该尝试document.body.appendChild。 【原来效果不错。】

对于问题的第二部分,我用你的代码做了一个测试扩展(只是添加了一些东西来定义 div),它在http://www.glassdoor.com/index.htm 上完美运行,也就是说我在底部看到了 div单击操作按钮后的页面。请确保您的浏览器中没有任何其他扩展 - 禁用所有其他扩展。这是我定义 div 的方式(这也可能很重要):

var adDiv = document.createElement('div'); 
adDiv.id = "idadv"; 
adDiv.style.width = "200px"; 
adDiv.style.height = "100px"; 
adDiv.style.display = "block"; 
adDiv.style.backgroundColor = "blue";

正如你所说,问题是偶尔出现的(我也无法重现它),我想很难拦截它。作为一种解决方法,您可以尝试查看 DOM 并在每次 div 似乎丢失时重新创建它,如下所示:

setInterval(createDivIfDoesNotExist, 1000);

您还应该考虑为您的自广告设置另一个展示位置,例如只显示一个通过清单绑定到浏览器操作的弹出窗口,并且不要通过 browserAction 的事件侦听器更改外部页面。

【讨论】:

  • 我无法解决您的补丁的第二个问题。该问题仅在该页面上随机发生。该页面中唯一发生变化的是 Ad iframe。所以我猜它是由那些广告小部件引起的。您对这种随机行为有何看法?
  • @goose,在答案中添加了一些想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2020-02-27
  • 2023-03-08
相关资源
最近更新 更多