禁止在代码的某些部分调用ajax

时间:2014-11-18 17:29:11

标签: javascript ajax

对于我们的内部js框架,为了确保框架的良好使用,我想禁止在框架的某些部分使用Ajax请求。

有没有办法达到类似的目的:

function doSomething() {

  instructions with ajax calls...

  withAjaxForbidden(function() {
     instructions using ajax calls should raise exception here
  });

  instructions with ajax calls...

}

是否可以实现withAjaxForbidden

之类的内容

请注意,显然我希望ajax系统在出现错误的情况下保持一致状态。

2 个答案:

答案 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查看小提琴