Page 79 - JavaScript修炼之道
P. 79

任务30 使用JSON-P         69


                   通过极简单的代码实现JSON-P
                   最简单的实现大致是这样的:

                    server/jsonp/jsonp.js

                   document.documentElement.firstChild.appendChild(
                     new Element('script', { type: 'text/javascript',
                   src: this.href + '&r=' + Math.random() }));
                   上面的代码在一个链接单击事件处理器的上下文中执行,因此this引用的是被单击的那个
               <a>元素。

                                                                 ①
                   这里使用的随机参数是为了避免浏览器缓存而添加的 。为了保证代码的质量,最好先检查
               一下URI,以决定是用 & 还是 ? 作为前缀 。
                                                    ②
                                                                  ③
                   一种更高级的方式是为这种脚本提供动态的 id= 属性 ,然后在浏览器载入之后将其删除,
               以免DOM变得过大。这个动态的 id= 属性可以兼作随机参数。

                    server/jsonp/jsonp.js

                   var script = new Element('script', { type: 'text/javascript',
                     src: this.href });
                   script.src += ('&r=' + script.identify());
                   script.observe('load', Element.remove.curry(script));
                   document.documentElement.firstChild.appendChild(script);

                   使用框架中的JSON-P机制
                   有几个框架为JSON-P提供了专门的函数,这迟早会派得上用场。

                   // jQuery
                   $.getJSON(url[, data][, callback])
                   // Mootools
                   new Request.JSONP({ url: ..., onComplete: function(data) {...} })
                   // Dojo
                   dojo.io.script.get({ url: ..., jsonp: function(data) {...} })

               相关任务

                     任务29
                     任务32
               ——————————
                  ①  浏览器会缓存一个url的响应数据,如果url完全相同,下一次JSON-P就会自动用之前的数据而不是真的做新的
                    请求。*
                  ②  根据这个参数是否是第一个参数。*
                  ③  即Prototype的Element.identify(),如果Element当前没有id,调用identify() 会为之自动生成一个,形
                    如anonymous_element_x,x从1开始递增。*
   74   75   76   77   78   79   80   81   82   83   84