怎么跨域获取网页内容,不想使用js iframe 跨域,也不能让远程服务器配合,也就是使用不了jsonp,该怎么办

高手请进!十万火急!iframe跨域提交表单后获取iframe的内容(访问拒绝)已经几天了-Web开发/JavaScript-javascript-电脑编程网高手请进!十万火急!iframe跨域提交表单后获取iframe的内容(访问拒绝)已经几天了-Web开发/JavaScript作者:default7 和相关&&文件,网页:表单所在页面 : /a.htm表单处理页面 : /b.----------------------------------------------------a.htm中有表单,表单的action的值是/b.,target是a.htm中的一个iframe,提交后,处理页面(另外一个网站的b.php)处理该表单,并且b.php完成后会有内容显示,内容如下:HTML code
{“response”:”error”,”message”:”errorParam”}
a.htm中表单提交后,a.htm中的JavaScript需要获取b.php文件中的内容,但是立即获取的话,显示的内容是空的,需要延迟一段时间。但是两个网页不在同一个域下面,IE就提示“访问拒绝”了。如何才可以获得到b.php中显示的内容?----------------------------------------------------------b.php的网址可以带参数,比如action的值是b.php?jsoncallback=alert,那么b.php页面的内容便是HTML code
alert({“response”:”error”,”message”:”errorParam”})
--------------------------------------------------用什么方法才可以将a.htm中的表单发给b.php,并且获得b.php中的输出内容呢?另外,b.php中的接受表单的方式必须是POST,不能用GET.高人帮帮我啊,我不想就这样失败啊。。。。。。。。。。。。。另外获取iframe中的内容如何兼容Firefox?(document.getElementById(&ifm1&).document.body.innerHTML) 在Firefox中没有反应,报错)------回答---------------其他回答(5分)---------我没学过php,仅提供一些建议js不支持跨域操作,要想从一个页面中直接得到另一个页面的内容,必须使用技术实现。我曾做过一个类似的,使用的,提交是,用语言获得请求网址的html,再返回页面。~没了。------其他回答(5分)---------所以,你在服务器使用服务器去访问页面(你得懂php的网络编程,我是不懂。。),然后使用返回该页面,懂?看我的回帖我用实现的------其他回答(10分)---------这个就是跨域,跨服务器的问题。用 js(包括ajax) 来处理不容易, 如果 a 服务器上能写代码问题就能解决了:a 页面向 a 服务器提交内容, 然后 a 服务器上的php 用http方式向 b 服务器提交,a 服务器接收 b 的返回,最后处理返回的结果。pear 里面有个 http 包,建议去看看,------其他回答(5分)---------没做过跨域访问,传值的问题。但感觉楼上的方法可行。------其他回答(5分)---------有多种解决方案。最简单的是做过server side codes proxy代理。绕过跨域。------其他回答(5分)---------没做过跨域访问 友情帮顶------其他回答(5分)---------document.getElementById('iframe1').contentWindow.document.body.innerHTML;这个和支付宝接口有什么区别?------其他回答(5分)---------你的问题我也碰到过,最后得出的结论是JS跨域的话,AJAX行不通,通过iframe的方法也不行,这是浏览器决定的,无解最佳的解决方案就是,可以用php做一个动态的JS,比如js.php 它的内空就是一段JS代码,那么就可以这样达到跨域访问的目的了,比如通过Script标签 &script src=&js.php?id=1234& type=&text/script&&&/script&。或者JS动态创建script标签来访问都可以------其他回答(5分)---------You should post to your own web server, do what you want at server side and pass back the information.相关资料:|||||||高手请进!十万火急!iframe跨域提交表单后获取iframe的内容(访问拒绝)已经几天了-Web开发/JavaScript来源网络,如有侵权请告知,即处理!编程Tags:                &                    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
第一章 ASP.NET 教程 (基础)
第二章 ASP.NET 教程(高级)javascript跨域的4种方法和原理详解
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何
下表给出了相对/dir/page.html同源检测的结果:
要解决跨域的问题,我们可以使用以下几种方法:
一、通过jsonp跨域
在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。
比如,有个a.html页面,它里面的代码需要利用ajax获取一个不同域上的json数据,假设这个json数据地址是/data.php,那么a.html中的代码就可以这样:
我们看到获取数据的地址后面还有一个callback参数,按惯例是用这个参数名,但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的,就得按照提供数据的那一方的规定格式来操作了。
因为是当做一个js文件来引入的,所以/data.php返回的必须是一个能执行的js文件,所以这个页面的php代码可能是这样的:
最终那个页面输出的结果是:
所以通过/data.php?callback=dosomething得到的js文件,就是我们之前定义的dosomething函数,并且它的参数就是我们需要的json数据,这样我们就跨域获得了我们需要的数据。
这样jsonp的原理就很清楚了,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。
知道jsonp跨域的原理后我们就可以用js动态生成script标签来进行跨域操作了,而不用特意的手动的书写那些script标签。如果你的页面使用jquery,那么通过它封装的方法就能很方便的来进行jsonp操作了。
原理是一样的,只不过我们不需要手动的插入script标签以及定义回掉函数。jquery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。&&
2、通过修改document.domain来跨子域
浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点需要说明,不同的框架之间(父子或同辈),是能够获取到彼此的window对象的,但蛋疼的是你却不能使用获取到的window对象的属性和方法(html5中的postMessage方法是一个例外,还有些浏览器比如ie6也可以使用top、parent等少数几个属性),总之,你可以当做是只能获取到一个几乎无用的window对象。比如,有一个页面,它的地址是/a.html& , 在这个页面里面有一个iframe,它的src是/b.html, 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:
这个时候,document.domain就可以派上用场了,我们只要把/a.html 和 /b.html这两个页面的document.domain都设成相同的域名就可以了。但要注意的是,document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a. 中某个文档的document.domain 可以设成a.、 、中的任意一个,但是不可以设成 c.a.,因为这是当前域的子域,也不可以设成,因为主域已经不相同了。
在页面 /a.html 中设置document.domain:
在页面 /b.html 中也设置document.domain,而且这也是必须的,虽然这个文档的domain就是,但是还是必须显示的设置document.domain的值:
这样我们就可以通过js访问到iframe中的各种属性和对象了。
不过如果你想在/a.html 页面中通过ajax直接请求/b.html 页面,即使你设置了相同的document.domain也还是不行的,所以修改document.domain的方法只适用于不同子域的框架间的交互。如果你想通过ajax的方法去与不同子域的页面交互,除了使用jsonp的方法外,还可以用一个隐藏的iframe来做一个代理。原理就是让这个iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面,所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的,然后就是通过我们刚刚讲得修改document.domain的方法,让我们能通过js完全控制这个iframe,这样我们就可以让iframe去发送ajax请求,然后收到的数据我们也可以获得了。&&
3、使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。
比如:有一个页面a.html,它里面有这样的代码:
再看看b.html页面的代码:
a.html页面载入后3秒,跳转到了b.html页面,结果为:
我们看到在b.html页面上成功获取到了它的上一个页面a.html给window.name设置的值。如果在之后所有载入的页面都没对window.name进行修改的话,那么所有这些页面获取到的window.name的值都是a.html页面设置的那个值。当然,如果有需要,其中的任何一个页面都可以对window.name的值进行修改。注意,window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,但一般是够用了。
上面的例子中,我们用到的页面a.html和b.html是处于同一个域的,但是即使a.html与b.html处于不同的域中,上述结论同样是适用的,这也正是利用window.name进行跨域的原理。
下面就来看一看具体是怎么样通过window.name来跨域获取数据的。还是举例说明。
比如有一个/a.html页面,需要通过a.html页面里的js来获取另一个位于不同域上的页面/data.html里的数据。
data.html页面里的代码很简单,就是给当前的window.name设置一个a.html页面想要得到的数据值。data.html里的代码:
那么在a.html页面中,我们怎么把data.html页面载入进来呢?显然我们不能直接在a.html页面中通过改变window.location来载入data.html页面,因为我们想要即使a.html页面不跳转也能得到data.html里的数据。答案就是在a.html页面中使用一个隐藏的iframe来充当一个中间人角色,由iframe去获取data.html的数据,然后a.html再去得到iframe获取到的数据。
充当中间人的iframe想要获取到data.html的通过window.name设置的数据,只需要把这个iframe的src设为/data.html就行了。然后a.html想要得到iframe所获取到的数据,也就是想要得到iframe的window.name的值,还必须把这个iframe的src设成跟a.html页面同一个域才行,不然根据前面讲的同源策略,a.html是不能访问到iframe里的window.name属性的。这就是整个跨域过程。
看下a.html页面的代码:
上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe。网上也有很多类似的现成代码,有兴趣的可以去找一下。
通过window.name来进行跨域,就是这样子的。&&
4、使用HTML5中新引进的window.postMessage方法来跨域传送数据
window.postMessage(message,targetOrigin)& 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。
调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 *& 。
需要接收消息的window对象,可是通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。
上面所说的向其他window对象发送消息,其实就是指一个页面有几个框架的那种情况,因为每一个框架都有一个window对象。在讨论第二种方法的时候,我们说过,不同域的框架间是可以获取到对方的window对象的,而且也可以使用window.postMessage这个方法。下面看一个简单的示例,有两个页面
我们运行a页面后得到的结果:
我们看到b页面成功的收到了消息。
使用postMessage来跨域传送数据还是比较直观和方便的,但是缺点是IE6、IE7不支持,所以用不用还得根据实际需要来决定。
jQuery的ready方法详解
赞助商链接
@CopyRight , , Inc. All Rights Reserved QQ:评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
第一章 ASP.NET 教程 (基础)
第二章 ASP.NET 教程(高级)}

我要回帖

更多关于 iframe 跨域调用js 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信