Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在DOM中搜索iframe中出现的关键字并重新加载页面,直到它';找到了什么?_Javascript_Jquery_Html_Iframe - Fatal编程技术网

Javascript 是否可以在DOM中搜索iframe中出现的关键字并重新加载页面,直到它';找到了什么?

Javascript 是否可以在DOM中搜索iframe中出现的关键字并重新加载页面,直到它';找到了什么?,javascript,jquery,html,iframe,Javascript,Jquery,Html,Iframe,我有一个广告,在一个给定的发布者网站上的iframe中显示,大约每1000次加载。我无法控制主机站点,但我需要一种方式,让用户能够看到该广告。我正试图找到一个javascript解决方案来加载页面,搜索我公司的名称,看看是否加载了我的广告(公司名称是加载iframe的div标记的id),然后如果找到它就停在那里,否则就重新加载页面 我在控制台中运行一个脚本,获取文档主体的innerHTML,搜索关键字,然后在没有找到关键字的情况下重新加载页面 但有两个问题 它只能在iframe之外找到关键字

我有一个广告,在一个给定的发布者网站上的iframe中显示,大约每1000次加载。我无法控制主机站点,但我需要一种方式,让用户能够看到该广告。我正试图找到一个javascript解决方案来加载页面,搜索我公司的名称,看看是否加载了我的广告(公司名称是加载iframe的div标记的id),然后如果找到它就停在那里,否则就重新加载页面

我在控制台中运行一个脚本,获取文档主体的innerHTML,搜索关键字,然后在没有找到关键字的情况下重新加载页面

但有两个问题

  • 它只能在iframe之外找到关键字
  • 即使我设置了延迟或进行了onload,它也不会搜索iframe的内容(实际的关键字将标识我的特定广告)
其次,对于每一次页面刷新,脚本都将从控制台中清除

我知道这是初学者的东西,但我会喜欢任何正确的方法来解决这个问题的指针


非常感谢到目前为止对我的帮助(同时,我对每个人都投了更高的票,但我认为我没有必要让它公开露面)

这就是我得到的。我使用以下manifest.json创建了一个chrome插件:

{
  "manifest_version": 2,
  "name": "Ad Refresh",
  "version": "1.0",

  "permissions": [
    "activeTab",
    "tabs"
  ],

  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "js": ["jquery.min.js", "contentscript.js"],
      "all_frames": true
    }
  ]  
}
我不担心重新加载页面,我只是在iframe中获取访问权限

我无法使用jquery$或getElementById等直接获取iframe实际内容中的任何元素。但是,如果我在iframe本身和console.log上运行getElementId,它将包括iframe中的所有HTML:

我尝试获取iframe元素的innerHTML,以便将其作为字符串进行搜索,但它返回的只是iframe元素标记,没有任何内部内容。我不知道这些是否有意义,但我现在似乎有些不知所措


好的,最后添加。我的广告运行一个脚本,我可以在inspector中的“源”下看到它。所以我想“为什么不跑呢
var scripts=document.getElementsByTagName('script');
获取页面上加载的所有脚本的数组?然后我可以搜索数组,看看我的脚本和广告是否已加载,我们将是金色的。”但不幸的是,数组中不包含我的脚本,即使它已加载并且在中可见“源代码”,并准确地包括一个随机条带脚本,该脚本也从iframe.Bummer中加载

使用
jQuery的
.load
事件了解是否加载了
iFrame
,然后读取
iFrame主体的
innerHTML

试试这个:

$('IFRAME'的'ID')。加载(函数(){
var iFrameContent=$('body',this.contentWindow.document).html();
console.log(iFrameContent);
});

JS:


这听起来像是包含广告的
iframe
是从不同于主页的域加载的,对吗?这就解释了为什么JavaScript代码在主页(或控制台,同样的东西)中运行无法访问iframe内部的DOM元素。浏览器跨域安全性阻止了这种访问:
iframe
被视为单独的浏览器窗口或选项卡

如果主页和
iframe
都是从同一个域加载的,那么您可以使用
contentWindow
,正如几个答案所描述的那样。但这不会跨域工作

那么,你能做什么

你正在构建一个供自己或同事使用的工具,而不是你需要在网站上发布供世界其他地方使用的工具,对吗

这为您提供了两个其他选项。首先,您可以简单地禁用跨域浏览器安全。在Chrome中,您可以按照以下说明执行此操作:

小心:不要在以该模式运行的Chrome会话中进行任何“正常”浏览,只需进行特殊测试。但是,如果您在该模式下运行Chrome,则可以通过
contentWindow
contentWindow访问
iframe
DOM元素。文档
,如其他答案中所述

如果这不起作用,或者如果您不想为此启动特殊的Chrome会话,另一种方法是编写Chrome扩展。这将允许您编写代码来访问
iframe
和主窗口中的DOM元素,方法如下:


或者,如果您愿意,也可以编写Firefox扩展-两者都有类似的功能。

感谢大家的帮助!您的假设是正确的,这是一个个人使用的工具,iframe正在从另一个域加载内容。我编写了一个chrome扩展,并将内容脚本与所有框架一起使用:true meth但仍然无法访问iframe的全部内容。当我记录innerHTML时,它会给我iframe元素本身,但其中的任何内容都不会继续尝试。
setTimeout(function(){

    $("[title='3rd party ad content']").attr("id", "dfp"); // "3rd party ad content" is the title of all iframes that could potentially contain my ad and is the only identifying attribute across all iframe instances.  I stick an id on there so it's easier to grab with getElementById.  It only gets the first instance though, need to figure out how to loop through all.

    var company = document.getElementById('dfp');

    if (company == null) {
      console.log("no hit");
    } else {
      console.log(company);
    }
}, 5000);
    var company = document.getElementById('myframe1').contentWindow.document.getElementById('company');
if (company == null) {
  //reload
  console.log("reload");
} else {
  //continue
  console.log(company);
}