使用img.src跨域请求

使用Img.src跨域请求

无刷新的页面请 求,被越来越多的应用。XMLHttp.Request只支持同域名的请求,Iframe支持跨域请求,但是跨域Javascript调用会被制止,使得 Iframe跨域请求没有办法做到CallBack。Script.Src的请求可以跨域,也可以写一个比较复杂的Script机制让它 CallBack( 使用Script Request解决跨域请求问题), 这几种实现方式都是比较重的。在一些场景下需要一个小巧的跨域请求。比如统计某个A Href链接被点击了几次,某个图片被点击了几次。在这种场景下发送到服务器的数据量小,客户Script不关心服务器返回结果的内容,只关心这次请求是 否成功。在这种场景下完全可以使用Img.src做异步跨域请求。

应用场景:

假设有个点击统计服务器: http://CountHits.Com 它后面有数据库统计每天某个链接被点击了几次。它对外提供的REST访问接口是:
vender=venderID&href=urlHref&text=urlText&target=urlTarget
&style=urlStyle&location=pageLocation&refere=pageRefere.

vender 表示当前统计的投放者. location链接所在的页面. refere当前页面的来源页面。如果统计成功返回200 状态码,如果统计失败返回500状态码。

根据这样的REST-URL接口,使用Img.src发送点击统计请求。

[1] 只为某个链接加统计,失败时重试3次:

function countClick(item){
// create Img
item = item!=null && item.tagName ? item : this;
var image = document.createElement("IMG");
image.src = "http://CountHits.Com/Handler.ashx?
vender=0&href="+encodeURIComponent(item.href)+"&text="+encodeURIComponent(item.innerHTML)+
"&target="+encodeURIComponent(item.target)+"&style="+encodeURIComponent(item.style.cssText)+
"&location="+encodeURIComponent(window.location.href) +"&referrer=" +
encodeURIComponent(document.referrer) + "&t="+ new Date().getTime();
image.height = 0;
image.width = 0;
item.requestTimes = item.requestTimes ? item.requestTimes ++ : 0;
image.onerror = Function.createDelegate(item, retry);
image.onload = Function.createDelegate(item, clean);

//send request.
document.body.appendChild(image);
return true;
}

function retry()
{
if(this.requestTimes < 3)
{
this.requestTimes ++;
countClick(this);
}
else
{
this.requestTimes = 0;
}
}

function clean()
{
this.requestTimes = 0;
}

Function.prototype.createDelegate = function(instance, method) {
return function() {
return method.apply(instance, arguments);
}
}


<a href="http://www.zhangsichu.com" οnclick="countClick(this)" target="_blank">Test</a>


[2] 给所有链接加统计,失败时重试3次:

function AddEventHandle(target,eventType,handler)
{
if(target.AddEventListener)
{
target.AddEventListener(eventType,handler,false);
}
else if(target.AttachEvent)
{
target.AttachEvent("on"+eventType,handler);
}
else
{
target["on"+eventType]=handler;
}
}

function RemoveEventHandle(target,eventType,handler)
{
if(target.RemoveEventListener)
{
target.RemoveEventListener(eventType,handler);
}
else if(target.DetachEvent)
{
target.DetachEvent("on"+eventType,handler)
}
else
{
target["on"+evnetType]=null;
}
}

function window_onload() {
var links = document.getElementsByTagName("A");
//debugger;
for(var i=0; i<links.length; i++)
{
AddEventHandle(links[i] , "click", Function.createDelegate(links[i], countClick));
}
}


服务器端输出代码

public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
//Your code to sum hits
//
context.Response.ContentType = "image/gif";
System.Drawing.Bitmap image = new System.Drawing.Bitmap(1,1);
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
}

public bool IsReusable {
get {
return false;
}
}
}
转自:http://zhangsichu.com/blogview.asp?Content_Id=102

转载于:https://www.cnblogs.com/johnwonder/archive/2010/11/03/1867753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值