`
xw_qixia
  • 浏览: 21162 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ajax 跨域取数据

阅读更多

第一次分享。。。 有啥不对的地方。。还望指出! 若有更好的解决方案,呵呵。。 也希望能得到分享!。

     背景: 项目中要显示股票指数数据,由于咱们当前系统中没有这些数据,所以只能通过跨域去取数据。由于指数数据是实时数据,初定方案是通过ajax每隔3秒去指定的地址去拿数据。


var requestObject = {
    url : "地址",
    vars : "参数",
    callBack : 回调函数,
    method : "post",
  };
  var ajax = new TFL.ajax2(); //对XmlHttpRequest 做了封装
  ajax.ajaxRequest(requestObject);

本地测试通过。。。 上测试环境(正式环境)发现不行!。。 才发现ajax无法跨域取数据。(呵呵,web新手。。见笑了)

 第二中方案:

     利用js创建dom的原理,去动态创建一个<script></script>  在指定 scr的值 。

 function c(){
  var date = new Date();
  var hours = date.getHours();
  
  if(hours>=9 && hours <=15){//开盘时间
  a();  }
 }

 

 function a(){
  var head= document.getElementsByTagName('head')[0];
     var script= document.createElement('script');
     script.type= 'text/javascript';
     // 回调只对firefox有效
     script.onreadystatechange= function () {
        if (this.readyState == 'complete') {
            b();

        };
     }
     script.onload= 回调函数;
     // 回调只对firefox有效
     script.src= b;
     head.appendChild(script);

 }

 function b(){//回调函数

 }

 setInterval("c()"3000);

 

上面遗留了一个问题,就是在ie下无法执行回调函数,只能直接去调用函数,但也许会出现这样一种情况,就是数据还在加载,js直接调用回调函数的代码就已经执行了,导致无法取到数据。

 我的解决方案是 :  先判断浏览器,然后在通过定时器去定时执行回调函数。(说白了就是ie下推迟执行回调函数)

// 判断是否ie
  var is_opera = /opera/i.test(navigator.userAgent); 
  var is_ie = (/msie/i.test(navigator.userAgent) && !is_opera)
  if(is_ie){
      setInterval("c()",4000);
  }
     
   以上是我的总结。 。 呵呵   。热烈欢迎踊跃提意见啊。!

分享到:
评论
19 楼 gongji 2010-05-16  
xw_qixia 写道
gongji 写道
xw_qixia 写道
呵呵。。  感谢大家关注。  是这样的。!   我们的服务器不能向外发请求,所以无法通过java后台来进行代理。所以只能是在前端做处理

你丫的,跟你说w3c access control 所以的新版本浏览器都支持的

    。。。  呵呵。。!  我搜了。。 网上说。。。
IE的开发者今天公布了一段小视频:
http://ieblog.members.winisp.net/images/XdomainRequest-small.wmv


目前,支持这种跨域实现的要求

Firefox 3.1 Beta2

IE 8 Beta2

等到普及还有一段时间。


摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/Article/200901/31421.html

    呵呵。。 嗯能否提供点资料呢。?  谢谢啊。。。。



资料网上多的是了,我这边只有delphi版本的实现
18 楼 xw_qixia 2010-05-14  
gongji 写道
xw_qixia 写道
呵呵。。  感谢大家关注。  是这样的。!   我们的服务器不能向外发请求,所以无法通过java后台来进行代理。所以只能是在前端做处理

你丫的,跟你说w3c access control 所以的新版本浏览器都支持的

    。。。  呵呵。。!  我搜了。。 网上说。。。
IE的开发者今天公布了一段小视频:
http://ieblog.members.winisp.net/images/XdomainRequest-small.wmv


目前,支持这种跨域实现的要求

Firefox 3.1 Beta2

IE 8 Beta2

等到普及还有一段时间。


摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/Article/200901/31421.html

    呵呵。。 嗯能否提供点资料呢。?  谢谢啊。。。。
17 楼 gongji 2010-05-14  
xw_qixia 写道
呵呵。。  感谢大家关注。  是这样的。!   我们的服务器不能向外发请求,所以无法通过java后台来进行代理。所以只能是在前端做处理

你丫的,跟你说w3c access control 所以的新版本浏览器都支持的
16 楼 xw_qixia 2010-05-13  
呵呵。。  感谢大家关注。  是这样的。!   我们的服务器不能向外发请求,所以无法通过java后台来进行代理。所以只能是在前端做处理
15 楼 vb2005xu 2010-05-13  
使用RPC方式,不走后台么?多此一举啊
14 楼 andot 2010-05-12  
linkerlin 写道
andot 写道
使用Hprose跨域更方便,不需要任何特殊写法,直接使用RPC方式,想怎么跨就怎么跨。支持所有浏览器,甚至在手机上都可以让您轻松实现Ajax跨域访问。

强烈推荐。
我用Hprose的开源版本PHPRPC很多年了。
非常非常的爽!!!

Hprose也是开源的 商业开源~
13 楼 linkerlin 2010-05-12  
andot 写道
使用Hprose跨域更方便,不需要任何特殊写法,直接使用RPC方式,想怎么跨就怎么跨。支持所有浏览器,甚至在手机上都可以让您轻松实现Ajax跨域访问。

强烈推荐。
我用Hprose的开源版本PHPRPC很多年了。
非常非常的爽!!!
12 楼 伊苏 2010-05-11  
<div class="quote_title">xiebaolong 写道</div>
<div class="quote_div">
<p>现在已经有flash和Ajax实现的跨越访问的框架了,又何苦自己写,又不兼容呢?<br>而且jquery 1.2以后就有对jsonp的支持啦!</p>
<pre name="code" class="js">$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=?", function(data){
  $.each(data.items, function(i,item){
    $("&lt;img/&gt;").attr("src", item.media.m).appendTo("#images");
    if ( i == 3 ) return false;
  });
});</pre>
 
<pre name="code" class="js">jQuery.getScript("http://dev.jquery.com/view/trunk/plugins/color/jquery.color.js", function(){
  $("#go").click(function(){
    $(".block").animate( { backgroundColor: 'pink' }, 1000)
      .animate( { backgroundColor: 'blue' }, 1000);
  });
});</pre>
 </div>
<p> </p>
<p> </p>
<p>这样怎么实现post提交form参数? </p>
<p> </p>
<p>不是所有ws都支持get和post的</p>
<p> </p>
<p>还是在服务器端做个代理比较合理</p>
<p> </p>
<p>现好这2天也在折腾这个</p>
<p> </p>
<p>尝试成功通过</p>
<p>apache的httpclient实现post提交</p>
<p>urlconnection.open实现soap提交</p>
<p>都是基于http的</p>
<p> </p>
<p>基于rpc的连接还没试过, 还有tcpip跟rpc, http之间的联系都还在估摸ing</p>
<p> </p>
<p> </p>
<p> </p>
11 楼 gongji 2010-05-11  
w3c access control 你搜索一下,新浏览器标准,跨域访问控制
10 楼 giginet 2010-05-11  
一共三种吧。
1.动态创建script
2.jsonp
3.设置document.domain
9 楼 andot 2010-05-11  
yin_bp 写道
andot 写道
使用Hprose跨域更方便,不需要任何特殊写法,直接使用RPC方式,想怎么跨就怎么跨。支持所有浏览器,甚至在手机上都可以让您轻松实现Ajax跨域访问。


安全性怎么保证呢?

可以通过设置身份认证,访问权限等多种方式来保证。
8 楼 yin_bp 2010-05-10  
andot 写道
使用Hprose跨域更方便,不需要任何特殊写法,直接使用RPC方式,想怎么跨就怎么跨。支持所有浏览器,甚至在手机上都可以让您轻松实现Ajax跨域访问。


安全性怎么保证呢?
7 楼 andot 2010-05-10  
使用Hprose跨域更方便,不需要任何特殊写法,直接使用RPC方式,想怎么跨就怎么跨。支持所有浏览器,甚至在手机上都可以让您轻松实现Ajax跨域访问。
6 楼 danielking 2010-05-10  
还可以用jsonp
用jquery很方便能做到
je里能搜到相关文章
5 楼 eason007 2010-05-10  
jquery取跨域数据也是用script标签实现的。
4 楼 xiebaolong 2010-05-10  
<p>现在已经有flash和Ajax实现的跨越访问的框架了,又何苦自己写,又不兼容呢?<br>而且jquery 1.2以后就有对jsonp的支持啦!</p>
<pre name="code" class="js">$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=?", function(data){
  $.each(data.items, function(i,item){
    $("&lt;img/&gt;").attr("src", item.media.m).appendTo("#images");
    if ( i == 3 ) return false;
  });
});</pre>
 
<pre name="code" class="js">jQuery.getScript("http://dev.jquery.com/view/trunk/plugins/color/jquery.color.js", function(){
  $("#go").click(function(){
    $(".block").animate( { backgroundColor: 'pink' }, 1000)
      .animate( { backgroundColor: 'blue' }, 1000);
  });
});</pre>
 
3 楼 rainsilence 2010-05-09  
package org.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		URL url = new URL("http://www.iteye.com");
		InputStream is = url.openStream();
		byte[] b = new byte[is.available()];
		is.read(b);
		
		response.getOutputStream().write(b);
		is.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


在Servlet或者其他地方返回你要取得的文本流,就像这里的Javaeye一样。写入response流中,ajax就能取到了。
另外回答你的附加问题
ajax和webservice在本质上是完全不一样的东西。但是他们在不同语言的交互这点上,都用了文本流。这点是相同的
2 楼 longhua828 2010-05-08  
是啊,服务器转发下就行了
1 楼 rainsilence 2010-05-08  
呵呵,其实还有第三种方案
ajax->自己的服务器->URL.openStream(Java),得到数据->写入outputstream->ajax.responseText

过一次服务器,就不怕跨域了。而且没有不同浏览器的障碍。

相关推荐

    Ajax跨域访问解决方案

    总结来说,解决Ajax跨域访问问题有多种途径,选择哪种方式取决于具体需求、服务器支持以及安全性考虑。理解并掌握这些方法,能帮助开发者更好地应对实际项目中的跨域挑战。在开发过程中,确保遵循最佳实践,既能保障...

    Ajax跨域问题及其解决方案.docx

    ### Ajax跨域问题及其解决方案 #### 一、Ajax跨域问题概述 在现代Web开发中,前后端分离架构越来越流行。这种模式下,前端页面与后端服务通常部署在不同的服务器上,甚至可能位于不同的域名下。当浏览器发起对不同...

    ajax跨域问题的解决办法.rar

    总结,解决Ajax跨域问题有多种方法,选择哪种取决于项目需求和安全考虑。JSONP适用于简单请求,CORS更灵活但需要服务器配合,代理服务器则可以完全绕过同源策略,而`document.domain`适用于同一顶级域名下的跨子域...

    web前端跨域取JSON

    而HTML5的新特性如离线存储、Web Storage(localStorage和sessionStorage)、Web Workers等,也有助于优化跨域取JSON的数据处理和用户体验。 对于初学者来说,可以从以下几个步骤入手: 1. 学习HTML5和CSS3的基础...

    ajax跨域访问

    综上所述,实现Ajax跨域访问有多种策略,具体选择取决于项目需求和所支持的浏览器。在实际开发中,通常结合使用CORS和JSONP,以兼顾兼容性和安全性。通过下载并运行提供的“ajax跨域访问”项目,开发者可以更直观地...

    Ajax跨域实现代码(后台jsp).docx

    总的来说,Ajax跨域有多种解决方案,选择哪种取决于实际需求和目标服务器的兼容性。JSONP适用于简单请求,CORS提供更灵活的控制,而代理服务器和IFrame则适用于更复杂的情况。在实际开发中,需要结合使用和测试,...

    ajax跨域访问遇到的问题及解决方案

    总的来说,解决Ajax跨域访问的方法多种多样,选择哪种取决于具体的应用场景和兼容性需求。在现代开发中,CORS通常是最推荐的解决方案,因为它提供了更安全、可控的跨域访问机制。然而,对于旧版浏览器或特定需求,...

    jquery中ajax处理跨域的三大方式

    然而,随着互联网应用的发展,跨域请求的需求日益增加,比如从一个网站获取另一个网站的数据。jQuery作为一款广泛使用的JavaScript库,提供了多种方式来处理跨域问题。以下是jQuery中处理跨域的三种主要方法: 1. *...

    ajax说明 事件 绑定 数据

    尽管Ajax存在跨域限制和其他兼容性问题,但其带来的用户体验提升使其在Web开发中占据了重要地位。随着Fetch API和Promise等现代Web技术的发展,Ajax的使用变得更加简洁和高效。然而,理解并掌握Ajax的基本原理仍然是...

    完美解决iframe跨域问题

    - `window.name`的长度限制取决于浏览器,一般可存储几MB的数据,但过大的数据可能会影响性能。 - 这种方法的安全性相对较低,因为任何页面都可以读取到`window.name`,所以敏感信息不宜通过这种方式传递。 总结...

    ajax 弹出信息框(取数据库资源)及登陆

    2. **安全与隐私**:Ajax请求应遵循同源策略,避免跨域问题。同时,敏感信息如密码应加密后再发送。 3. **用户体验**:在Ajax请求期间,可以显示加载动画让用户知道后台正在处理。请求完成后,确保正确更新界面,...

    JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码

    这两个方法在执行跨域请求时有其独特的处理方式,特别是当需要从不同源(协议、域名或端口)获取 JSON 数据时,这种操作通常受限于浏览器同源策略的安全限制。 跨域是指请求的资源来自不同的域,而同源策略是浏览器...

    js跨域请求数据的3种常用的方法

    JavaScript中的跨域请求是Web开发中的一个重要话题,由于同源策略的限制,浏览器不允许JavaScript从一个源(域名、协议和端口的组合)获取另一个源的数据。为了解决这个问题,开发者通常采用以下三种常见的跨域请求...

    解决 springboot跨域请求问题

    一旦配置完成,前端的AJAX请求(如jQuery的`$.ajax`)可以保持不变,因为后端已经处理了跨域限制。 2. **使用Nginx作为反向代理**: 另一种解决方案是通过Nginx作为反向代理服务器。Nginx可以配置为将前端和后端...

    js 跨域和ajax 跨域问题小结

    ajax要跨域的话,可以用服务器去别的网站取内容,如asp.net的: 代码如下:public string GetUrlData(string url) { System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest....

    jquery AJAX 回调函数取JSON成功代码

    另外,如果你的JSON数据是在本地文件系统中,如在压缩包中的'jquery 回调函数成功代码'文件,你可能需要使用file协议来访问,但这通常只在开发环境中可行,因为浏览器的安全策略通常不允许跨域请求本地文件。...

    js跨域和ajax 跨域问题的实现思路

    ajax要跨域的话,可以用服务器去别的网站取内容,如asp.net的: 代码如下: public string GetUrlData(string url) { System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest....

    js跨域问题解决方案.

    - **Ajax请求跨域**:XMLHttpRequest或Fetch API发送请求到不同源。 - **CSS/图片/字体等资源加载跨域**:样式表、图片、字体等静态资源的跨域问题。 - **Websocket跨域**:WebSocket协议的跨域问题。 ### 3. 解决...

    PHP下ajax跨域的解决方案之window.name实例分析

    【PHP下AJAX跨域的解决方案之window.name实例分析】 在Web开发中,由于浏览器的安全策略,同源策略限制了JavaScript进行跨域访问。然而,为了实现不同域名间的通信,开发者们采用了一些策略来绕过这个限制,其中一...

    Jquery跨域请求的实现

    选择哪种方式取决于实际的需求和服务器支持。在实际开发中,我们应该优先考虑使用CORS,因为它更安全,支持更多类型的请求,并且是现代浏览器的标准。如果遇到不支持CORS的旧服务器或有特殊需求,可以考虑JSONP或...

Global site tag (gtag.js) - Google Analytics