对于我们的内部js框架,为了确保框架的良好使用,我想禁止在框架的某些部分使用Ajax请求。
有没有办法达到类似的目的:
function doSomething() {
instructions with ajax calls...
withAjaxForbidden(function() {
instructions using ajax calls should raise exception here
});
instructions with ajax calls...
}
是否可以实现withAjaxForbidden
?
请注意,显然我希望ajax系统在出现错误的情况下保持一致状态。
答案 0 :(得分:0)
只需创建自己的ajax函数并使其依赖于某个全局变量。之后,你可以从范围中删除常规的ajax函数,然后你就完成了:)
var ajaxEnabled = true;
function withAjaxForbidden(f){
ajaxEnabled = false;
f();
ajaxEnabled = true;
}
function ajax(...){
if(!ajaxEnabled)throw 'Ajax requests are forbidden within this block';
...
}
以下是一个小提琴:http://jsfiddle.net/u98b7bk3/1/
<div id="console">
No messages yet
</div>
<script type="text/javascript">
// Disable Ajax globally, to keep it working for your own library make
// sure you save this locally before overwriting
XMLHttpRequest = undefined;
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
// Try an ajax request with jQuery
$.ajax('/').always(function(data, status, error){
$('#console').html("data: " + data + "<br>status: " + status + "<br>error: " + error);
});
</script>
答案 1 :(得分:0)
局部变量覆盖函数范围内的全局变量。只需为每个本机和库ajax函数创建一个变量,并在受保护的函数中将其设置为undefined。将阻止它能够使用相同名称的函数和变量。只要使用&#34; var&#34;它应该只影响功能的范围而不是全局范围。
编辑:这可能不是你想要的,但据我所知,你想要实现这一目标的确切方法是不可能的,因为可变范围,但如果你不介意额外的代码您的AJAX限制代码可以使用此方法。与其他答案不同,这将异步工作并且不影响全局变量,这使得使用此代码时出现问题的可能性大大降低:
编辑2(支持jQuery):
var testFunction = (function($){
// Global to local/lexical:
var XMLHttpRequest = undefined;
var eval = undefined;
var setTimeout = undefined;
var setInterval = undefined;
var Function = undefined;
var window = undefined;
$ = (function($){ if($) {
var newjq = function(s, c) {
// Reroute main function
return $(s, c);
};
var jQueryBlacklist = {
// Initialize blacklist
"ajax": true,
"post": true,
"get": true,
"getJSON": true,
"getScript": true
};
for(i in $) // Reconstruct Object
if($.hasOwnProperty(i)
&& !jQueryBlacklist[i])
newjq[i] = $[i];
return newjq;
} }($));
// Real testFunction() below:
return function() {
// AJAX-forbidden code
// $.ajax should be undefined
}
}($));
// $.ajax should work normally here
testFunction(); // not in here
// $.ajax should work normally here
点击here查看小提琴