我从某个域提供此js文件说foobar.com
at http://foobar.com/static/js/main.js:
$(document).ready(function() {
function foobar(bar){
$.ajax({
url: "/site/foo/",
data: {'foo':bar},
dataType: "jsonp",
crossdomain: !0,
success: function (data) {
alert(data);
},
error: function () {
}
})
}
});
在某个网址的barfoo.com
上,我有类似的内容:
<script src='http://foobar.com/static/js/main.js' type='text/javascript'></script>
<script type='text/javascript'>foobar('123456')</script>
当我点击该网址时:它说
Uncaught ReferenceError:foobar is not defined (anonymous function)
如何从其他域访问功能?
答案 0 :(得分:11)
您已定义&#34; foobar()&#34;在&#34;准备好&#34;处理程序。因此,它是该函数中的局部变量,在其外部是不可见的。
您可以将其添加到&#34; ready&#34;的末尾。处理程序:
window['foobar'] = foobar;
然后它在全球范围内可见。
顺便说一下,这可以咬jsfiddle,因为它(默认情况下)会将代码包装在&#34; load&#34;处理程序。因此,如果您从<head>
中包含的JavaScript文件进行复制/粘贴,那么在该上下文中将是全局的函数最终在小提琴中不是全局的。
答案 1 :(得分:0)
Pointy指出,您的功能在全球范围内不可见。但是您也在加载脚本并调用ready()
函数定义的函数。我想当你的脚本调用ready()
会产生同样的错误时,可能没有调用foobar()
。我建议你在脚本中设置一个全局值,然后在ready()
函数中使用该变量。
在脚本中设置值:
<script src='http://foobar.com/static/js/main.js' type='text/javascript'></script>
<script type='text/javascript'>var bar = '123456'</script>
然后您可以在ready()
函数中使用它。
$(document).ready(function() {
$.ajax({
url: "/site/foo/",
data: {'foo':bar},
dataType: "jsonp",
crossdomain: !0,
success: function (data) {
alert(data);
},
error: function () {
}
});
});
如果你想定义一个函数以便再次使用它,你可以在ready()
中调用它,但要确保将全局变量bar
设置为你想要的。
window.foobar = function() {
$.ajax({
url: "/site/foo/",
data: {'foo':bar},
dataType: "jsonp",
crossdomain: !0,
success: function (data) {
alert(data);
},
error: function () {
}
});
}
$(document).ready(function() {
foobar();
// other stuff
});