2011-05-03 128 views
1

我正在处理一些JavaScript/jQuery代码,这些代码根据通过JSON请求检索的指定用户代理列表检测到用户代理。

只要发现匹配,我希望函数返回false并跳出循环,只有在没有找到JSON文档中的用户代理时才继续返回true。

我有这样的代码......

function checkUserAgent() { 
    $.getJSON('noapplet-useragents.json', function(data) { 
     $.each(data, function(key, val) { 
      if(navigator.userAgent.search(new RegExp(val)) != -1) { 
       console.log("False!"); 
       return false; 
      } 
     }); 
     console.log("True!"); 
     return true; 
    }); 
} 

// ... call to checkUserAgent() function 

然而,当返回false;也返回true。 如何根据需要使第一次返回停止功能。

console.log()声明只是它们的暂时的Firebug。

编辑:感谢所有的反馈意见。由于某些原因,我无法添加评论。

+2

无法从Ajax调用返回值。阅读:[jQuery:ajax调用成功后返回数据](http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success)另请阅读[关于'$ .each'的文档](http://api.jquery.com/jQuery.each/)返回false将停止迭代,但不能从回调中返回值。 – 2011-05-03 19:24:31

+0

似乎''.each'的'}'缺失。 – morgar 2011-05-03 19:26:04

+0

@morgar:不,这只是不好的缩进。 – 2011-05-03 19:27:42

回答

2

正如我在我的评论中说的you cannot return a value from an Ajax call。你必须通过一个回调:

function checkUserAgent(callback) { 
    $.getJSON('noapplet-useragents.json', function(data) { 
     var result = true; 
     $.each(data, function(key, val) { 
      if(navigator.userAgent.search(new RegExp(val)) != -1) { 
       console.log("False!"); 
       result = false; 
       return false; 
      } 
     }); 
     callback(result); 
    }); 
} 

,并称之为:

checkUserAgent(function(result) { 
    // so something with the result 
}); 
+0

+1,一个回调位置而不是两个 – 2011-05-03 19:43:23

0

一个选项是你的checkUserAgent函数来处理回调。此代码将工作:

var checkUserAgent = function(callback){ //callback is the function 
     $.getJSON('noapplet-useragents.json', function(data) {   
      $.each(data, function(key, val) {    
       if(navigator.userAgent.search(new RegExp(val)) != -1) {     
        console.log("False!");     
        callback(true);   
       } 
      }); 

      callback(false); 

}