收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 2565|回复: 36

[技术相关] 怎么解决跨域脚本让非主流浏览器加载不完的问题

  [复制链接]
发表于 2012-3-12 11:05:13 | 显示全部楼层 |阅读模式
问题描述:
一动态脚本与一网站交互,因为跨域所以不能用ajax,问题出现在opera和firefox上,当服务器没有及时响应时,这两个浏览器的状态栏就在那里转啊转啊,一直转啊...
严重影响用户心情,请问有什么方法解决么,已经搜索引擎了好久,还没寻得解决方法,如果有达人知道,希指教一二三,真是太郁闷了.
 楼主| 发表于 2012-3-12 13:33:37 | 显示全部楼层
难道又是一个暂时无解的问题.
回复 支持 反对

使用道具 举报

发表于 2012-3-12 13:38:48 | 显示全部楼层
先采集再ajax,so easy。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 14:00:57 | 显示全部楼层
#3,你这个虽然是一个很笨的办法,但是完全行不通,完全不easy.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 14:10:10 | 显示全部楼层
现在要解决的就是跨域脚本与服务器交互时,在服务器比较长时候没响应时,如何解决opera和firefox状态栏一直转的问题,不要企图绕开,不要去找变通的方法。如果是另外的变通方法,,虽然看起来是达到效果了,但就不是解决这个问题的方法了.
限制就是,只能运行js脚本,不能运行什么其它代理程序之类的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 14:15:33 | 显示全部楼层
哦,有一个很好的比喻,就像第三方的流量统计系统,那段代码是需要放在形形色色的网站上面的,现在就是这种限制级别.
回复 支持 反对

使用道具 举报

发表于 2012-3-12 14:22:07 | 显示全部楼层
不是太懂哦。。。。
回复 支持 反对

使用道具 举报

发表于 2012-3-12 14:24:21 | 显示全部楼层
用  document.write 可以解决opera的进度条及图标“忙”状态。

回复 支持 反对

使用道具 举报

发表于 2012-3-12 14:34:28 | 显示全部楼层
qwind 发表于 2012-3-12 14:15
哦,有一个很好的比喻,就像第三方的流量统计系统,那段代码是需要放在形形色色的网站上面的,现在就是这种 ...

需求不明。“像第三方的流量统计系统,那段代码是需要放在形形色色的网站上面的”

然后你又要和网站进行交互,进行什么交互。你怎么知道不能绕过去?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 14:35:59 | 显示全部楼层
#8的回答,我还没想明白是什么意思,你是说用document.write 来输出动态脚本语句还是...?
这样吧:
www.a.com上的一个网页加载www.b.com上的一段脚本
这段脚本向www.c.com(服务器)提交一个查询:?p=hi
现在www.c.com在收到p参数后,延迟10秒返回,最后输出alert('hello').
在等待的这10秒内,要求opera和firefox不出现一直在加载的情况,就是图标不一直转啊转的.

补充内容 (2012-3-12 15:06):
alert('hello'),最后在要在www.a.com上显示出来的.
最终的ui界面是www.a.com上的一个引用了www.b.com脚本的一个页面.
回复 支持 反对

使用道具 举报

发表于 2012-3-12 14:42:44 | 显示全部楼层
延迟是服务器的问题,如果你网页c打开直接显示完成,过10秒再弹出个消息,这用户体验只会更差。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 15:03:54 | 显示全部楼层
#11,你说的那个 document.write ,我没整明白是什么意思,是怎么用,这样document.write("<scr"+"ipt language='javascript' charset='gb2312' src='xxx.js'><\/script>");,还是怎样...
还有,不是网页c打开,这个消息是要在a页面上出现的,c是服务器,它延迟返回数据自有它的原因,比如数据量太大,查询慢,或者当前没有消息,需要等待等等,关键是在延迟的这段时间里,也就是客户的浏览器界面上,opera和firfox会出现网页没加载完成,进度条图标一直转的情况,非常影响用户浏览。
不知道这个问题俺有木有描述清楚,晕菜鸟.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 15:18:17 | 显示全部楼层
我再精简下吧
用动态脚本(一定要是动态脚本,不能用ajax)向服务器随便提交一个请求,服务器10秒后返回数据,在等待的这10秒内,让opera和firefox不出现加载没有完成的情况,请问有解决的方法吗?
这下应该说滴很清楚明白了吧.
回复 支持 反对

使用道具 举报

发表于 2012-3-12 15:25:45 | 显示全部楼层
www.a.com 上的一个网页加载 www.b.com 上的一段脚本
这段脚本向www.c.com(服务器)提交一个查询:?p=hi
现在www.c.com在收到p参数后,延迟10秒返回,最后输出alert('hello').

我说的吧,为什么不能b的服务器上直接采集c的结果。然后b的脚本直接访问就行了。然后b的脚本延时10秒alert
还是so easy
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 15:57:46 | 显示全部楼层
#14,对,那怎么让opera和firefox在等待数据返回的时候,让状态栏显示完成状态,不要转啊转的,记住不要用ajax哦.
大概就是下面的意思:
用户页面http://xxx.com?p=1,但是这个页面要等10多秒服务器才能返回信息,怎么让状态栏图样不转啊转的呢?
回复 支持 反对

使用道具 举报

发表于 2012-3-12 16:11:01 | 显示全部楼层
不明白为什么要纠结在“状态栏图样不转啊转的”这个问题上,你的本意是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 16:25:26 | 显示全部楼层
#16,用户会觉得你网页有问题,会很不爽...,
js加载数据应该异步加载,所以不应该显示界面冻结。但浏览器有它的道理,也许它认为数据本来就没有到手,所以应该显示加载状态.....
回复 支持 反对

使用道具 举报

发表于 2012-3-12 16:30:26 | 显示全部楼层
qwind 发表于 2012-3-12 15:57
#14,对,那怎么让opera和firefox在等待数据返回的时候,让状态栏显示完成状态,不要转啊转的,记住不要用aj ...


a先发出一个请求查询,b直接返回个标识,告知a:我现在开始工作
a第一个请求查询发出后10秒,再发出一个请求。b返回结果
so easy

请求是由插入的脚本发出
回复 支持 反对

使用道具 举报

发表于 2012-3-12 16:30:26 | 显示全部楼层
有没有你所说的此页面加载速度的数据?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 16:50:06 | 显示全部楼层
#18,不要再变通了,已经说过不要回避问题的本质.
a.html请求服务器,服务器查询数据也许延迟,也许不延迟,延迟多少也未知。
问题的关键是:对于异步请求,ui界面不应该冻结,当然或许opera,firefox不是这么认为动态脚本也算异步请求.
不知道是以前的什么时候,当初我骂google浏览器的某一版本在ajax请求时会出现界面冻结时,结果一大帮人讥笑我。现在google浏览器连动态脚本都不冻结界面了,只有opera和firefox还存在这个问题...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 16:52:51 | 显示全部楼层
我说的10秒延迟只是一个比方,你只要做到在opera和firefox等待动态脚本数据的时候,让界面不冻结,就是加载是完成(状态图标不转动的情况)状态就ok了,这下应该是说清楚了的吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 16:57:43 | 显示全部楼层
#19,不明白你说的是什么意思,跟速度没有关系。
回复 支持 反对

使用道具 举报

发表于 2012-3-12 17:16:36 | 显示全部楼层
我说的方法100%可以解决,你懒的改我也没办法。你有办法就去改变浏览器。
再说,人家也不是冻结。人家只是检测到页面有隐藏的异步加载,给个加载提示很正常
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 17:26:01 | 显示全部楼层
#23,你是对滴,但是我是不会采用滴
回复 支持 反对

使用道具 举报

发表于 2012-3-12 18:47:00 | 显示全部楼层
本帖最后由 icedblog 于 2012-3-12 18:50 编辑

这就是一个是否显示示忙器的问题吧?(busy indicator)
跨域加载JS,显忙器不显示,就是Script DOM Element 方法 (创建script标签并把它的src属性指向你的脚本地址)

=====================

补充一下,“问题出现在opera和firefox上”,除了XHR(你说跨域无法使用),那单纯JS好像无解了。:)
回复 支持 反对

使用道具 举报

发表于 2012-3-12 18:47:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 18:58:11 | 显示全部楼层
#25,你说到要点了,之所以不能采用ajax,就是因为要跨域的问题,只能采用动态脚本(就是动态地创建script)
不知道是不是真的没有解决方法了,多谢各位兄台的热烈讨论,要是能找到什么hack之类的方法就好了,opera,firefox虽然用的人少,但是这毕竟也是一个问题呀.
回复 支持 反对

使用道具 举报

发表于 2012-3-12 19:00:56 | 显示全部楼层
跨域不是用 iframe 很爽吗?

百度,淘宝都这么用
回复 支持 反对

使用道具 举报

发表于 2012-3-12 19:13:24 | 显示全部楼层
因为具体的情况不清楚,所以不敢给建议。

但是对于跨域的数据交互,有一个古老的办法,是通过URL HASH去进行通信,但因为所有的信息是通过URL去传递,因此传输的数据有限,而且不能传递大的HTML代码段。

在支持HTML5中利用postMessage()的方法,不支持此方法的使用URL HASH。

另外,这个东东还能支持POST跨域提交,而且示忙器不“转圈”,看看能否有帮助。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-12 19:14:40 | 显示全部楼层
#28,现在要解决的问题是如#25楼所说的"显示示忙器的问题",跨域用什么方法(只讨论js脚本实现,不讨论flash之类的)都可以,只要能解决opera和firefox的这两个问题就行,iframe我也试过了,不能解决这个问题,不知有没有达人能写一个可以解决问题的hello word代码出来.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-10-27 23:59 , Processed in 0.109098 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表