`

Ajax,防止重复请求,跨域,本地存贮

阅读更多
原帖地址:http://www.cnblogs.com/bgcolor/archive/2013/05/31/Ajax_localStorage_jsonp.html

Ajax请求,一般都在点击事件下发生的


问题:如果用户点击频率过快,一瞬间点个n次,那就会向服务器要发送n次请求,如何解决!


从前端方面来看,既然是点击发送Ajax请求,那就设置个等待时间,进行第二次请求发送,即setTimeout(),方法,还需要有个标致位,可以是全局变量,隐藏欲表单值,禁用Button按钮,解除绑定点击事件,(这几个方法个其实是一样)


后端脚本b.php



<?php
$arr=array('title'=>'1','content'=>'内容');
echo json_encode($arr);


前端脚本a.html



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>A</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8">
$(
function(){
//设置全局变量
var a=true;
$(
'a').click(function(){
if(a==true){//判断是否为真,为真就继续执行
a=false;//点击后,设置为假
$.getJSON('b.php',function(d){
$(
"#name").append(d.title+"<br />");
//过500毫秒设置为真
setTimeout(function(){
a
=true;
},
500);
});
}
});
})
</script>
</head>
<body>
<a href="b.php" onclick="return false;">example</a>
<br>
<br>
<br>
<br>
<br>
<div id="name" style="width:100px;height:50px;border:1px solid gray;"></div>
</body>
</html>


通过禁用按钮来控制提交频率



<input type="button" id="bt" value="提交">
<div id="name" style="width:200px;height:500px;border:1px solid gray;"></div>
<script type="text/javascript" charset="utf-8">
$(
'#bt').click(function(){
//点击后就设置按钮为禁止状态
$('#bt').attr('disabled','disabled');
$(
'#bt').val('提交中...');
$.getJSON(
'b.php',function(d){
$(
'#name').append(d.content);
//设置500毫秒,将按钮恢复
setTimeout(function(){
$(
'#bt').removeAttr('disabled');
},
500);
});
});
</script>

通过隐藏域值来控制提交频率
<input type="hidden" id='hid' value=1 />
<a href="javascript:void(0);">点击</a>
<div id="name" style="width:200px;height:500px;border:1px solid gray;"></div>
<script type="text/javascript" charset="utf-8">
$(
'a').click(function(){
if($('#hid').val()==1){
$(
'#hid').val(0);
$.getJSON(
'b.php',function(d){
$(
'#name').append(d.content);
//设置500毫秒,将将隐藏域值改为1
setTimeout(function(){
$(
'#hid').val(1);
},
1000);
});
}
});
</script>


网上看了JQuery的abort()方法,虽然取消中断了,但还是会去访问服务器,


还有就是把Ajax异步改成同步$.ajaxSettings.async = false;
后端方面考虑过cookie,session,MySQL,比较两次时间差,来控制请求频率,但没弄出来,网上看了,大多是在Apache/Nginx等Web服务器修改配置文件即可


HTML5有本地存贮功能,主流浏览器都支持,可以将服务器返回的数据,存在本地,下去请求直接在本地找,和后台Memcache,操作一样



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Local</title>
</head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<body>
<p><input type="button" name="some_name" id="bt" value="点击"></p>
<div id="name" style="width:200px;height:320px;border:1px solid gray"></div>
<script type="text/javascript" charset="utf-8">
$(
'#bt').click(function(){
var local=window.localStorage;//初始化本地存储
var key='t9';//设置键
var url='data.php';//请求数据地址
var val=local.getItem(key);//得到数据
if (!val) {
$.ajaxSettings.async
= false;//必须Ajax设置同步,因为异步回调函数返回值无法return
$.get(url,function(d){
val
=d;
local.setItem(key,val);
});
}
j
=eval("("+val+")");//解析json字串
$("#name").append(j.title+"|"+j.content+"<br>");
});
</script>
</body>
</html>


data.php



<?php
echo json_encode(array('title'=>'标题','content'=>'内容'));


 


打开Chrome,F12查看


一:页面初始状态


   


二:第一次点击,页面请求了data.php



三:本地存贮



四:已经不请求data.php了



Ajax跨域,能不能跨域还得看服务器是否把数据返回在回调函数内


server.php



<?php
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
$result=json_encode($arr);
//动态执行回调函数
$callback=$_GET['call'];
//将结果放在?( )返回
echo $callback."($result)";


f.html



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>xxx</title>
<style type="text/css">

</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js "></script>
<script type="text/javascript">
$(
function(){
$(
'a').click(function(){
$
.getJSON("server.php?call=?",
function(result) {
for(var i in result) {
alert(i
+":"+result[i]);//循环输出a:1,b:2,
}
});
});
});
</script>
</head>
<body>
<a href="javascript:void(0)">example</a>
</body>
</html>


 

本文链接

分享到:
评论

相关推荐

    九种跨域方式实现原理

    同源策略限制内容有:Cookie、LocalStorage、IndexedDB等存储性内容DOM节点AJAX请求发送后,结果被浏览器拦截了但是有三个标签是允许跨域加载资源&lt;imgsrc&gt;&lt;linkhref&gt;[removed]当协议、子域名、主域名、端口号中任意...

    iframe跨域与session失效问题的解决办法

    何为跨域跨域session/cookie? 也就是第三方session/cookie。第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion /cookie, 会被存储在访客的计算机上。第三方session/cookie指的是当前访问的...

    corsify:一个微小的透明代理。 好处:它增加了CORS标头! 为什么? 它可以防止跨域错误

    它可以防止跨域错误。 试试看: : 没有CORS标头: : 使用又名“ corsyfied”的CORS标头: ://corsify.me/http://shaky-library.surge.shCORS-i-fy? 这是怎么回事? 跨域资源共享(CORS)是一种机制,它允许从资源...

    AJAX-Study:AJAX学习的笔记

    通过Ajax可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据 AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式 1.2 XML简介 XML:可扩展标记语言 XML:被设计用来传输和存储数据 ...

    第四章 第二节:后端服务开发.pdf

    • 应用系统开发 • 存储数据库设计 • 配置服务端订阅 • 应用系统与iot平台连接 • 调用阿里云物联网接口 • 接口编写 • 跨域请求 • 应用调试与部署 • 项目打包 • 项目部署 了解后端基础概念 • 后端的基本...

    前端开发面试题.html

    内存泄漏、跨域、异步请求、模板引擎、模块化、Flux、同构、算法、ECMAScript6、Nodejs、HTTP、 其他: 主流MVVM框架(React\Vue\Angular)、Hybrid App\React Native\Weex、TypeScript、RESTFul、WEB安全、前端...

    handlebar.js-experiment:前端模板引擎的实验-handlebar.js

    handlebar.js-实验前端模板引擎的实验-handlebar.js供应商: jQuery,handlebar.js,Bootstrap和LESS注意 : 由于跨域AJAX请求,此实验存储库仅在服务器上有效

    potroshnik:使用 Elasticsearch 存储价格并生成购物清单

    检查您为跨域ajax请求配置了elasticsearch的天气: script.groovy.sandbox.enabled: false script.disable_dynamic: false http.cors.enabled: true 签出项目并在浏览器中打开 index.html git clone ...

    php-transparent-proxy:PHP透明代理脚本

    我需要从jQuery前端到另一个域上PHP后端进行跨域AJAX调用,并且找不到可以桥接两端的完整功能代理脚本...所以我创建了自己的脚本。 由于两个服务器都具有PHP(但是后端需要前端服务器上没有的其他东西),因此,...

    15个前端攻城狮必备的学习网站 | 你知道几个?(附视频介绍)

    前端开发所需掌握知识点概要 ...对Web标准的理解(结构、表现、行为)、浏览器内核、渲染原理、依赖管理、兼容性、CSS语法、层次关系,常用属性、布局、选择器、权重、...内存泄漏、跨域、异步请求、模板引擎、模块化、Fl

    ASP.NET4高级程序设计(第4版) 3/3

    此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软的ASP.NETAJAX平台。另外,还专门介绍了ASP.NET4 新增的功能,如MVC 和动态数据等。  ...

    JavaScript权威指南(第六版) 清晰-完整

    19.6 jQuery中的Ajax 19.7 工具函数 19.8 jQuery选择器和选取方法 19.9 jQuery的插件扩展 19.10 jQuery UI类库 第20章 客户端存储 20.1 localStorage和sessionStorage 20.2 cookie 20.3 利用IE userData持久化数据 ...

    JavaScript权威指南(第6版)(中文版)

    19.6 jQuery中的Ajax 19.7 工具函数 19.8 jQuery选择器和选取方法 19.9 jQuery的插件扩展 19.10 jQuery UI类库 第20章 客户端存储 20.1 localStorage和sessionStorage 20.2 cookie 20.3 利用IE userData持久化数据 ...

    JavaScript权威指南(第6版)

    19.6 jQuery中的Ajax 19.7 工具函数 19.8 jQuery选择器和选取方法 19.9 jQuery的插件扩展 19.10 jQuery UI类库 第20章 客户端存储 20.1 localStorage和sessionStorage 20.2 cookie 20.3 利用IE userData持久化数据 ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软的ASP.NETAJAX平台。另外,还专门介绍了ASP.NET4 新增的功能,如MVC 和动态数据等。  ...

    JavaScript权威指南(第6版) 中文版

    19.6 jquery中的ajax 550 19.7 工具函数 563 19.8 jquery选择器和选取方法 566 19.9 jquery的插件扩展 574 19.10 jquery ui类库 577 第20章 客户端存储 579 20.1 localstorage和sessionstorage 581 20.2 cookie 586 ...

    JavaScript权威指南(第6版)

    19.6 jquery中的ajax 550 19.7 工具函数 563 19.8 jquery选择器和选取方法 566 19.9 jquery的插件扩展 574 19.10 jquery ui类库 577 第20章 客户端存储 579 20.1 localstorage和sessionstorage 581 20.2 cookie 586 ...

Global site tag (gtag.js) - Google Analytics