【问题标题】:Call back on window object initialization (dynamic inclusion of iframes in page)回调窗口对象初始化(页面中动态包含 iframe)
【发布时间】:2015-12-24 06:46:42
【问题描述】:

我需要什么: 我的要求是将脚本注入网页中显示的所有窗口。

我知道我们可以使用 window.frames 属性找到所有窗口,但在我的情况下这还不够,因为稍后可以通过 iframe 将新窗口添加到页面(将 iframe 包含到 DOM 中)

所以我需要一种机制来跟踪页面中的窗口,比如新窗口初始化时的回调。

我尝试了什么: 我使用 Object.observe API 来跟踪 window.frames 对象的变化。但我知道 Object.observe API 将根据此链接 (https://esdiscuss.org/topic/an-update-on-object-observe) 被删除。

那么,使用这个 API 好不好。或者如果有其他方法请告诉我

【问题讨论】:

  • 你知道跨域框架吗?还是所有 iframe 都与您的顶级文档具有相同的来源?
  • 你是如何创建新窗口的?一定有一些像addFrame 这样的事件。正确的?也不确定,但您可以尝试为所有 iFrames 使用委托进行加载功能
  • @udidu,我可以在那里访问的任何窗口只有我需要注入脚本。所以需要担心跨源框架。
  • 你需要知道,如果你在不同来源的 iframe 中有一个窗口,你将无法注入任何东西
  • @Rajesh 如果我们将 iframe 附加到现有页面,将创建新窗口。事件委托将在特定文档的上下文中工作(每个窗口)。

标签: javascript jquery


【解决方案1】:

这是一种使用 MutationObserver API 的方法,您可以使用该 api 检测注入目标元素的任何元素,即使文本发生更改或元素被附加到目标树中的某处

function createIframeOnDemand(wait) {
  var iframe = document.createElement('iframe')
  iframe.src = 'about:blank';
    
  setTimeout(function() {
    document.body.appendChild(iframe)
  }, wait || 2000);
}


var body = document.body;

var observer = new MutationObserver(function(mutations) {
  for(mutationIdx in mutations) {
     var mutation = mutations[mutationIdx];
     for(childIndex in mutation.addedNodes) {
       var child = mutation.addedNodes[childIndex];
       
       if(child.tagName && child.tagName.toLowerCase() == 'iframe') {
         console.log(child);
         //child is your iframe element
         //inject your script to `child` here
       }
     }
  }
});

var config = { attributes: false, childList: true, characterData: false };
 
observer.observe(body, config);


createIframeOnDemand();

【讨论】:

  • 感谢您分享代码。根据文档,回调函数将在每个 DOM 突变上调用。它会导致任何性能问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多