包裹eBay API请求代码至jQuery事件后出现_cb_findItemsByKeywords未定义错误
解决eBay API回调函数在jQuery事件内失效的问题
嘿,我来帮你搞定这个问题!你遇到的Uncaught ReferenceError: _cb_findItemsByKeywords is not defined报错,其实是JSONP跨域请求的典型坑——咱们来拆解下原因,再给你两个可行的解决方案:
为什么会报错?
eBay的Finding Service用的是JSONP实现跨域请求,原理是动态创建一个<script>标签,服务器返回的内容是回调函数调用(比如_cb_findItemsByKeywords(返回的数据))。这个回调函数必须在全局作用域里,因为浏览器执行这个script标签时,是在全局上下文里找这个函数的。
而你把_cb_findItemsByKeywords函数放进了$(document).ready()的button点击回调里,这时候函数是局部作用域(属于点击事件的回调函数内部),全局上下文根本找不到它,自然就报错了。
方案1:把回调函数放到全局作用域(最简单)
直接把回调函数定义在全局,这样JSONP返回的script就能轻松找到它:
// 全局定义回调函数,让JSONP能找到它 function _cb_findItemsByKeywords(data) { // 这里放你原来eBay示例里的处理逻辑 console.log('获取到eBay数据:', data); // 比如解析商品列表、渲染到页面等操作 } $(document).ready(function(){ $('button').click(function(){ // 这里放eBay的API请求代码(动态创建script标签的部分) var scriptTag = document.createElement('script'); scriptTag.src = 'http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=你的APPID&keywords=iphone&callback=_cb_findItemsByKeywords'; document.body.appendChild(scriptTag); }); });
方案2:临时挂载到全局(避免全局污染)
如果不想把函数暴露在全局,也可以在点击事件里临时把函数挂载到window对象上,请求完成后再删掉它:
$(document).ready(function(){ $('button').click(function(){ // 定义回调函数 function handleEbayResponse(data) { // 处理返回的数据 console.log('获取到eBay数据:', data); // 请求完成后移除全局的函数,避免污染全局作用域 delete window._cb_findItemsByKeywords; } // 临时把函数挂载到全局window上,用eBay要求的回调函数名 window._cb_findItemsByKeywords = handleEbayResponse; // 发起API请求 var scriptTag = document.createElement('script'); scriptTag.src = 'http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=你的APPID&keywords=iphone&callback=_cb_findItemsByKeywords'; document.body.appendChild(scriptTag); }); });
补充:为什么原示例能直接运行?
因为eBay给的示例代码里,_cb_findItemsByKeywords是直接定义在全局作用域的(没有嵌套在任何函数里),所以JSONP返回的script执行时能直接找到这个函数。你把它放进jQuery的事件回调后,函数变成了局部变量,就找不到啦。
内容的提问来源于stack exchange,提问作者user9494275
相关产品推荐
相关产品推荐

