2011-10-07 82 views
4

我知道它的工作原理。我已成功实施它。你能解释为什么这个jQuery代码有效吗?

$("#vehicle_application_product_id").autocomplete({ 
     minLength: 2, 
     source: function(request, response) { 
      var term = request.term; 
      if (term in cache) { 
       response(cache[term]); 
       return; 
      } 

      lastXhr = $.getJSON("/products/get_json_list", request, function(data, status, xhr) { 
       cache[term] = data; 
       if (xhr === lastXhr) { 
        response(data); 
       } 
      }); 
     } 
    }); 

我很喜欢用一些这方面的东西的脚本小子。我将永远无法编写匿名函数自己,因为以下原因:

1)这个人是怎么知道把参数“请求”,并在规范“反应”?

2)开头的行 “lastXhr =” 真的是神秘。最后还有另一个匿名函数。我意识到这可能是一个回调,这是在请求发送到指定的URL后执行的。

3)在匿名函数最后条件:

if (xhr === lastXhr) {                      
    response(data); 
} 

到底是什么呢?如果那么来自这个匿名块的第三个参数xhr等于由.getJSON调用ENCOMPASSING这个匿名块返回的值,返回响应中的数据?

这真的是最困难的部分,以绕到我的头。我注意到这是3个等号。这看起来像非常高级的代码概念,我只是明白这背后的理由是为了让我可以成为一个更好的编码器。

回答

4
  1. 参数requestresponse将被传递到分配给source选项为documented here的功能。从本质上讲,插件承诺将这两个参数传递给回调函数,这就是你表明你想要获得它们的信号。

  2. 该函数是一个回调计划在请求完成时调用,而不是简单发送之后调用。此外,在调用时getJSON,代码分配所得到的对象到lastXhr变量,以便它记住哪些是它的最后一次请求。

  3. 在回调中,您引用了以参数xhr的形式完成的请求。所以if等于写作:

    if (the request that completed is the last request made) { 
        // ... 
    } 
    

    为什么这样做?为确保您不会对请求的结果采取行动,如果由于响应时间过长而导致用户输入速度过快,您有多个未完成的请求。在这种情况下,除了最后一个的结果之外,你真的不感兴趣。

    回调如何从外部范围访问变量lastXhr?这是由于closure

  4. 这三个等号是什么?这是identity operator

3

1)他们阅读了jQuery UI自动完成插件这里的文档: http://jqueryui.com/demos/autocomplete/#option-source

2)lastXhr看到的用法类似于针对的getJSON所示jQuery的文档页面的那些:http://api.jquery.com/jQuery.getJSON/

3)编写代码的人可能希望jQuery自动完成,以仅显示最近$.getJSON()请求自动完成数据的结果。例如,假设我输入“abc”和自动完成的消息,但是之后输入“d”,所以它现在是“abcd” - 然后另一个自动完成消息被激发。我们只关心“abcd”的结果,对吧?所以这个检查lastXhr匹配目前的xhr那样做!

注意===在JavaScript正在测试的这些对象是同一类型的,并且是相等的。在JS中,1 == '1'为真,但1 === '1'不是。我强烈推荐“JavaScript:好的部分”,它涉及了关闭语言和其他有趣方面的概念。

+0

我会接受你的建议,在该书Cymen。 – AKWF

相关问题