我想使用jQuery在iframe中操纵HTML。

我认为我可以通过将jQuery函数的上下文设置为iframe的文档来做到这一点,例如:

$(function(){ //document ready$('some selector', frames['nameOfMyIframe'].document).doStuff()
});

但是,这似乎不起作用。 一点检查显示出,除非等待iframe加载一会儿,否则frames['nameOfMyIframe']中的变量是undefined 。 但是,在iframe加载时,变量不可访问(我收到permission denied -类型错误)。

有人知道解决方法吗?


#1楼

我发现这种方式更清洁:

var $iframe = $("#iframeID").contents();
$iframe.find('selector');

#2楼

我更喜欢使用其他变体进行访问。 您可以从父级访问子级iframe中的变量。 $也是一个变量,您可以访问其刚刚调用的window.iframe_id.$

例如, window.view.$('div').hide() -隐藏ID为'view'的iframe中的所有div

但是,它在FF中不起作用。 为了获得更好的兼容性,您应该使用

$('#iframe_id')[0].contentWindow.$


#3楼

如果<iframe>来自相同的域,则可以很容易地访问元素

$("#iFrame").contents().find("#someDiv").removeClass("hidden");

参考


#4楼

您可以使用window.postMessage在页面与其iframe之间(无论是否跨域)调用函数。

文献资料

page.html

<!DOCTYPE html>
<html>
<head><title>Page with an iframe</title><meta charset="UTF-8" /><script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><script>var Page = {id:'page',variable:'This is the page.'};$(window).on('message', function(e) {var event = e.originalEvent;if(window.console) {console.log(event);}alert(event.origin + '\n' + event.data);});function iframeReady(iframe) {if(iframe.contentWindow.postMessage) {iframe.contentWindow.postMessage('Hello ' + Page.id, '*');}}</script>
</head>
<body><h1>Page with an iframe</h1><iframe src="iframe.html" onload="iframeReady(this);"></iframe>
</body>
</html>

iframe.html

<!DOCTYPE html>
<html>
<head><title>iframe</title><meta charset="UTF-8" /><script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><script>var Page = {id:'iframe',variable:'The iframe.'};$(window).on('message', function(e) {var event = e.originalEvent;if(window.console) {console.log(event);}alert(event.origin + '\n' + event.data);});$(window).on('load', function() {if(window.parent.postMessage) {window.parent.postMessage('Hello ' + Page.id, '*');}});</script>
</head>
<body><h1>iframe</h1><p>It's the iframe.</p>
</body>
</html>

#5楼

您可以使用jQuery的.contents()方法。

如果iframe与主页位于同一域中,则.contents()方法还可用于获取iframe的内容文档。

$(document).ready(function(){$('#frameID').load(function(){$('#frameID').contents().find('body').html('Hey, i`ve changed content of <body>! Yay!!!');});
});

#6楼

如果iframe src来自其他域,您仍然可以这样做。 您需要将外部页面读入PHP并从您的域中回显它。 像这样:

iframe_page.php

<?php$URL = "http://external.com";$domain = file_get_contents($URL);echo $domain;
?>

然后是这样的:

display_page.html

<html>
<head><title>Test</title></head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script><script>$(document).ready(function(){   cleanit = setInterval ( "cleaning()", 500 );
});function cleaning(){if($('#frametest').contents().find('.selector').html() == "somthing"){clearInterval(cleanit);$('#selector').contents().find('.Link').html('ideate tech');}
}</script><body>
<iframe name="frametest" id="frametest" src="http://yourdomain.com/iframe_page.php" ></iframe>
</body>
</html>

上面的示例说明了如何通过iframe编辑外部页面而不会导致访问被拒绝等。


#7楼

我创建一个示例代码。 现在,您可以轻松地从其他域中了解您无法访问iframe的内容。在同一域中,我们可以访问iframe内容

我与您共享我的代码,请运行此代码检查控制台。 我在控制台上打印图像src。 有四个iframe,两个来自同一个域,另一个来自其他域(第三方)。您可以看到两个图像src( https://www.google.com/logos/doodles/2015/googles-new-logo -5078286822539264.3-hp2x.gif

在控制台上https://www.google.com/logos/doodles/2015/arbor-day-2015-brazil-5154560611975168-hp2x.gif ),还可以看到两个权限错误(2错误:拒绝访问“文档”属性的权限'

... irstChild)},内容:function(a){返回m.nodeName(a,“ iframe”)?a.contentDocument ...

),它来自第三方iframe。

<body id="page-top" data-spy="scroll" data-target=".navbar-fixed-top">
<p>iframe from same domain</p><iframe frameborder="0" scrolling="no" width="500" height="500"src="iframe.html" name="imgbox" class="iView"></iframe>
<p>iframe from same domain</p>
<iframe frameborder="0" scrolling="no" width="500" height="500"src="iframe2.html" name="imgbox" class="iView1"></iframe>
<p>iframe from different  domain</p><iframe frameborder="0" scrolling="no" width="500" height="500"src="https://www.google.com/logos/doodles/2015/googles-new-logo-5078286822539264.3-hp2x.gif" name="imgbox" class="iView2"></iframe><p>iframe from different  domain</p><iframe frameborder="0" scrolling="no" width="500" height="500"src="http://d1rmo5dfr7fx8e.cloudfront.net/" name="imgbox" class="iView3"></iframe><script type='text/javascript'>$(document).ready(function(){setTimeout(function(){var src = $('.iView').contents().find(".shrinkToFit").attr('src');console.log(src);}, 2000);setTimeout(function(){var src = $('.iView1').contents().find(".shrinkToFit").attr('src');console.log(src);}, 3000);setTimeout(function(){var src = $('.iView2').contents().find(".shrinkToFit").attr('src');console.log(src);}, 3000);setTimeout(function(){var src = $('.iView3').contents().find("img").attr('src');console.log(src);}, 3000);})</script>
</body>

#8楼

您是否尝试过经典,等待使用jQuery的内置ready函数完成加载?

$(document).ready(function() {$('some selector', frames['nameOfMyIframe'].document).doStuff()
} );

ķ


#9楼

您需要将事件附加到iframe的onload处理程序,然后在其中执行js,以便在访问iframe之前确保iframe已完成加载。

$().ready(function () {$("#iframeID").ready(function () { //The function below executes once the iframe has finished loading$('some selector', frames['nameOfMyIframe'].document).doStuff();});
};

上面的方法可以解决“尚未加载”的问题,但是在权限方面,如果您要在iframe中加载来自其他域的页面,则由于安全限制,您将无法访问该页面。


#10楼

我认为您在做的事情要遵循相同的原产地政策 。 这应该是您收到权限拒绝类型错误的原因。


#11楼

采用

iframe.contentWindow.document

代替

iframe.contentDocument

#12楼

为了更强大:

function getIframeWindow(iframe_object) {var doc;if (iframe_object.contentWindow) {return iframe_object.contentWindow;}if (iframe_object.window) {return iframe_object.window;} if (!doc && iframe_object.contentDocument) {doc = iframe_object.contentDocument;} if (!doc && iframe_object.document) {doc = iframe_object.document;}if (doc && doc.defaultView) {return doc.defaultView;}if (doc && doc.parentWindow) {return doc.parentWindow;}return undefined;
}

...
var frame_win = getIframeWindow( frames['nameOfMyIframe'] );if (frame_win) {$(frame_win.contentDocument || frame_win.document).find('some selector').doStuff();...
}
...

#13楼

我最终在这里寻找了没有jquery的iframe内容,因此对于其他正在寻找的人来说,就是这样:

document.querySelector('iframe[name=iframename]').contentDocument

#14楼

此解决方案与iFrame相同。 我创建了一个PHP脚本,可以从其他网站获取所有内容,而最重要的部分是您可以轻松地将自定义jQuery应用于该外部内容。 请参考以下脚本,该脚本可以从其他网站获取所有内容,然后您也可以应用自定义jQuery / JS。 此内容可以在任何元素或任何页面内的任何位置使用。

<div id='myframe'><?php /* Use below function to display final HTML inside this div*///Display Frameecho displayFrame(); ?></div><?php/* Function to display frame from another domain
*/function displayFrame()
{$webUrl = 'http://[external-web-domain.com]/';//Get HTML from the URL$content = file_get_contents($webUrl);//Add custom JS to returned HTML content$customJS = "<script>/* Here I am writing a sample jQuery to hide the navigation menuYou can write your own jQuery for this content*///Hide Navigation barjQuery(\".navbar.navbar-default\").hide();</script>";//Append Custom JS with HTML$html = $content . $customJS;//Return customized HTMLreturn $html;
}

jQuery / JavaScript:访问iframe的内容相关推荐

  1. jquery库实现iframe自适应内容高度和宽度

    javascript原生和jquery库实现iframe自适应内容高度和宽度---推荐使用jQuery的代码! ‍<iframe src="index.php" id=&qu ...

  2. jQuery简单实现iframe的高度根据页面内容自适应的方法(转)

    本文实例讲述了jQuery简单实现iframe的高度根据页面内容自适应的方法.分享给大家供大家参考,具体如下:方式1://注意:下面的代码是放在和iframe同一个页面中调用 $("#ifr ...

  3. 【JavaScript总结】JavaScript发展与学习内容

    发展: 最初浏览器是为大学里浏览文档用,从地址栏输入文档地址,找到文档显示. 后来各种需求(购物网站,个人博客)出现,已有功能不能满足需求. 可人们依旧在努力满足这种需求,但实现后的效果很不尽人意. ...

  4. jquery 控制frameset frame节点内容(在子窗口中把该窗口中的焦点处的text内容填

    2019独角兽企业重金招聘Python工程师标准>>> 现在做这个项目中,有一项把:在子窗口中把该窗口中的焦点处的text内容填入其它子窗口的input内,也就是改写input的va ...

  5. jQuery JavaScript库达到新的里程碑

    一.什么是JQuery? Jquery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Saf ...

  6. linux访问网页元素,Linux_DOM和JAVASCRIPT访问页面上的元素,访问方法:getElementById() - phpStudy...

    DOM和JAVASCRIPT访问页面上的元素 访问方法: getElementById():返回拥用传递给该方法的指定id的第一个对象的引用. getElementsByName():返回拥用传递该方 ...

  7. C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?

    C#与Javascript变量.函数之间的相互调用 2008年11月28日 星期五 05:28 P.M. 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3 ...

  8. 用JS访问iframe中的元素

    用JS访问iframe中的元素 1.首先,如何访问iframe中的元素?见如下代码: (1)1.htm源码: <input  type=button value="test" ...

  9. [JavaScript]JavaScript处理iframe的动作

    随着W3C一声令下,几年前使用非常频繁的frameset + frame已完成使命,光荣退伍.作为frameset的替代方案(姑且这么称吧),iframe的使用也多了起来.较frameset方案,if ...

最新文章

  1. qpsk 锁相环_本科毕业设计课题—QPSK相干解调的MATLAB仿真(4)
  2. mysql创建多实例,mysql 单服务器创建多实例
  3. 根据端口不同来切换站点_根据不同高温气体对窑炉的侵蚀,来选用相应的耐火材料...
  4. 互联网日报 | 4月20日 星期二 | 华为正式宣布卖车;携程在港交所挂牌上市;广州期货交易所正式揭牌...
  5. 脏牛Linux本地提权漏洞复现(CVE-2016-5195、Linux、Android、提权)
  6. ubuntu14.04如何更换阿里云源
  7. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
  8. SQLServer中批量插入数据方式的性能对比
  9. array(numpy) 的size 和Image(PIL) 的shape比较
  10. matlab 图像分割-自定义函数T_SGM
  11. 2019年上半年软件设计师上午试题及答案
  12. 串口ISP方式下载单片机程序设计
  13. 未来五年,保险平权的最大机会来了
  14. linux实用技巧:通过命令行安装deb软件包
  15. php的COM组件调用相关(包括com_event_sink的用法)
  16. CC2530基础实验:(2)外部中断控制LED亮灭
  17. 新入职了一个卷王,天天加班到凌晨,各种技术张口就来,太让人崩溃......
  18. 深入浅出聊聊Java函数式编程思想
  19. Linux内核如何替换内核函数并调用原始函数
  20. Cerebral Cortex:额顶控制网络的网络间作用可以很好地预测记忆抑制能力

热门文章

  1. android debug database 源码解析
  2. Android 布局开发之百分比布局、弹性布局
  3. Java、Android静态代理与动态代理
  4. 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍
  5. 【网络基础】URI 和 URL 的纠缠
  6. RoboGuice 解析
  7. swift_004(Storyboard进行界面跳转及传值)
  8. ftrace跟踪内核_ftrace、kpatch、systemtap的基本原理、联系和区别
  9. linux下应用程序性能剖分神器gprofiler-tools-安装和使用
  10. 【Python算法】哈希存储、哈希表、散列表原理