Javascript JSONP回调不';行不通
我编写了一个Javascript JSONP回调不';行不通,javascript,jsonp,Javascript,Jsonp,我编写了一个Foo构造函数,它有一个load函数用于上传JSONPscript.src有一个回调,但我有一个错误:uncaughtreferenceerror:bar未定义。我怎么能修好它 function Foo(params) { function bar(response) { console.log(response); } function load() { var script = document.createElemen
Foo
构造函数,它有一个load
函数用于上传JSONPscript.src
有一个回调,但我有一个错误:uncaughtreferenceerror:bar未定义
。我怎么能修好它
function Foo(params) {
function bar(response) {
console.log(response);
}
function load() {
var script = document.createElement('script');
script.src = Config.apiUrl + '&callback=bar';
document.getElementsByTagName('head')[0].appendChild(script);
}
document.getElementById('button').addEventListener('click', load, false);
}
用法:
var foo=新foo(参数)代码>
页面中可能有很多内容。假设您的JSONP响应是正确的,如下所示:
bar(/*some argument*/);
问题:bar
必须是全局可访问的,但目前它不是(它仅在Foo
中可见)
可能的解决办法:
将bar
定义为Foo
的一种方法,然后您就可以执行它(只要实例Foo
是全局可访问的)。在这种情况下,callback
-参数必须设置为foo.bar
:
function Foo(params) {
this.bar=function(response) {
console.log(response);
}
this.load=function(){
var script = document.createElement('script');
script.src = Config.apiUrl + '&callback=foo.bar';
document.getElementsByTagName('head')[0].appendChild(script);
}
document.getElementById('button').addEventListener('click', this.load, false);
}
//assuming you create the instance in global scope
var foo = new Foo(params);
函数Foo(params){
this.bar=函数(响应){
控制台日志(响应);
}
this.load=function(){
var script=document.createElement('script');
script.src=Config.apiUrl+'&callback=foo.bar;
document.getElementsByTagName('head')[0].appendChild(脚本);
}
document.getElementById('button').addEventListener('click',this.load,false);
}
//假设您在全局范围内创建实例
var foo=新foo(参数);
假设您的JSONP响应是正确的,如下所示:
bar(/*some argument*/);
问题:bar
必须是全局可访问的,但目前它不是(它仅在Foo
中可见)
可能的解决办法:
将bar
定义为Foo
的一种方法,然后您就可以执行它(只要实例Foo
是全局可访问的)。在这种情况下,callback
-参数必须设置为foo.bar
:
function Foo(params) {
this.bar=function(response) {
console.log(response);
}
this.load=function(){
var script = document.createElement('script');
script.src = Config.apiUrl + '&callback=foo.bar';
document.getElementsByTagName('head')[0].appendChild(script);
}
document.getElementById('button').addEventListener('click', this.load, false);
}
//assuming you create the instance in global scope
var foo = new Foo(params);
函数Foo(params){
this.bar=函数(响应){
控制台日志(响应);
}
this.load=function(){
var script=document.createElement('script');
script.src=Config.apiUrl+'&callback=foo.bar;
document.getElementsByTagName('head')[0].appendChild(脚本);
}
document.getElementById('button').addEventListener('click',this.load,false);
}
//假设您在全局范围内创建实例
var foo=新foo(参数);
简短答复:
您应该使bar
函数全局可用,或者使其成为Foo
实例的公共方法,该实例应该全局可用
由于存在该错误,您知道您需要一个返回有效javascript代码字符串的服务器,如:
alert('JSONP in action'); bar('result');
根据您的/?callback=bar
请求
因此,由于JSONP
只是页面上的一个普通脚本加载,它与html头部加载的任何其他.js文件具有相同的可变可访问性规则,显然,您无法从不同的.js文件访问“私有函数”
但“保存条形函数参考以备日后使用”功能又如何呢
(关闭)
- 你可以问
这里不适用,因为bar函数调用的范围是从Foo构造函数外部创建的——bar函数是从“不同的文件”调用的,所以这里没有闭包
更好的解决方案:
假设您需要进行跨源请求(CORS
),并且您可以在服务器端应用程序中进行更改,最好在您尝试从不同域名应用程序访问的服务器上设置Access Control Allow Origin
规则。这将允许您使用常规的XHR
请求,并有更多关于http状态码的信息,或发送自定义的不同请求。简短回答:
您应该使bar
函数全局可用,或者使其成为Foo
实例的公共方法,该实例应该全局可用
由于存在该错误,您知道您需要一个返回有效javascript代码字符串的服务器,如:
alert('JSONP in action'); bar('result');
根据您的/?callback=bar
请求
因此,由于JSONP
只是页面上的一个普通脚本加载,它与html头部加载的任何其他.js文件具有相同的可变可访问性规则,显然,您无法从不同的.js文件访问“私有函数”
但“保存条形函数参考以备日后使用”功能又如何呢
(关闭)
- 你可以问
这里不适用,因为bar函数调用的范围是从Foo构造函数外部创建的——bar函数是从“不同的文件”调用的,所以这里没有闭包
更好的解决方案:
假设您需要进行跨源请求(CORS
),并且您可以在服务器端应用程序中进行更改,最好在您尝试从不同域名应用程序访问的服务器上设置Access Control Allow Origin
规则。这将允许您使用常规的XHR
请求,并有更多关于http状态码的信息或发送自定义的不同请求。如何调用构造函数,JSONP看起来如何?您好!用法var foo=新foo(参数)代码>,看起来像json。如何调用构造函数,JSONP看起来像什么?嗨!用法var foo=新foo(参数)代码>,看起来像json。嗨!谢谢您的回答,但它在页面中可能不止一个。请将实例的名称(foo、bar等)作为参数提供给构造函数,然后您可以根据实例名称hi动态创建回调参数!谢谢您的回答,但它在页面中可能不止一个。请将实例的名称(foo、bar等)作为参数提供给构造函数,然后您可以根据实例名称动态创建回调参数