我的代码可以使用,但是如果我用html调用它不起作用,我就不明白了。 如果我用html调用它会给我错误
未捕获的TypeError:Request.call Post不是函数
为什么呢?
<button onclick="Request.callPost('/Api/Page/start/','mypost')" >My button</button>
<br> <br><br>
(function($){
$(document).ready(function(){
var Request={
init:function(){
this.callPost('/Api/Page/all','data'); //ok it work
},
callPost:function(link,data){
$.ajax({
url:link,
type:'POST',
data:data,
dataType:'json',
success:function(response){
console.log(response);
return response;
}
});
},
callGet:function(link,data){
$.ajax({
url:link,
type:'GET',
data:data,
dataType:'json',
success:function(response){
return response;
}
});
},
}
Request.init();
})
})(jQuery);
答案 0 :(得分:0)
为简化起见,您的代码结构如下:
(function($){
$(document).ready(function(){
var Request = 'something';
});
})(jQuery);
// trying to use 'Request' here
您不能在全局范围内使用Request
,因为它在全局范围内不存在。它仅存在于您传递给function
函数的ready()
内,该函数也发生在另一个匿名函数中。这些函数之外的任何内容都无法看到该变量。
如果您需要您的变量存在于全局范围内,您可以在那里声明:
var Request;
(function($){
$(document).ready(function(){
Request = 'something';
});
})(jQuery);
// you can use 'Request' here
请小心这种方法,因为您通常不希望在遇到错误时只将所有内容移动到全局范围。这是不您想要习惯使用的金锤。如果您需要 Request
处于全局范围内,那么这就行了。
作为替代方案,请考虑将点击处理程序附加到Request
可用的范围。像这样:
(function($){
$(document).ready(function(){
var Request = /.../;
$('#yourButton').click(Request.callPost('/Api/Page/start/','mypost'));
});
})(jQuery);
// no need to use 'Request' here
根据您在此问题中提出的问题之外的代码结构,可能您必须做出一些更改,但在这种情况下原则应该使感。而不是在全局范围内使用代码(在您的情况下为HTML内联处理程序)尝试访问狭窄范围内的代码,翻转并使窄范围内的代码访问全局范围内的对象(在您的情况下为HTML元素)
随着代码复杂性的增加和可测试性变得越来越重要,您将需要完全抽象全局对象并将提供给窄带代码,而不是从窄范围内寻找它码。但我们可能花费数小时进入这类事情,我认为这远远超出了这里的要求。
基本上你要做的是访问狭窄范围内的东西。而直接的解决方案是将这些内容放在更大的范围内,或者改变您构建代码的方式,这样您就不需要首先访问它。前者是一种更快速的方法,只需要显示的代码,后者更清晰。