Javascript UILayout的可变范围
我正在尝试这个:Javascript UILayout的可变范围,javascript,jquery,Javascript,Jquery,我正在尝试这个: $(document).ready( function() { var myLayout = $('#layoutContainer').layout({ west__size: 450 , east__size: 250 }); function toggleFullView() { myLayout.toggle('west'); } $('#mapFo
$(document).ready( function() {
var myLayout = $('#layoutContainer').layout({
west__size: 450
, east__size: 250
});
function toggleFullView() {
myLayout.toggle('west');
}
$('#mapFooter').prepend('<a href="#" onClick="toggleFullView();" title="Toggle full view of map">Full View</a>');
}); // end document.ready
$(文档).ready(函数(){
var myLayout=$(“#layoutContainer”).layout({
西区面积:450
,东ÈÈ尺寸:250
});
函数toggleFullView(){
myLayout.toggle('west');
}
$('#mapFooter')。前置('');
}); // 结束文件.ready
单击由.prepend()创建的链接时,我不断收到一个错误“toggleFullView未定义”。我试过各种各样的胡闹。如果我将toggleFullView函数中的行放在onClick中,我会得到错误-“myLayout is not defined”
怎么办?感谢您的帮助。这是因为toggleFullView存在于
.ready()
回调的作用域中,而不是脚本的全局作用域中
var MyModule = (function($) {
// $ is now jQuery
// This is only accessible from within MyModule
var privateRyan = 'fubar';
// Globally accessible with MyModule.toggleFullView
this.toggleFullView = function() {
myLayout.toggle('west');
}
$(document).ready( function() {
// Do init stuff here
var myLayout = $('#layoutContainer').layout({
west__size: 450,
east__size: 250});
$('#mapFooter').prepend('<a href="#" onclick="MyModule.toggleFullView();" title="Toggle full view of map">Full View</a>');
}); // end document.ready
})(jQuery); // () will execute this function immediately
var MyModule=(函数($){
//$现在是jQuery
//这只能从MyModule中访问
var privateRyan=‘fubar’;
//可通过MyModule.toggleFullView全局访问
this.toggleFullView=函数(){
myLayout.toggle('west');
}
$(文档).ready(函数(){
//在这里做一些事情
var myLayout=$(“#layoutContainer”).layout({
西区面积:450,
东部(面积:250});
$('#mapFooter')。前置('');
});//结束文档。准备好了吗
})(jQuery);//()将立即执行此函数
您还可以创建链接,然后附加事件处理程序并提供回调。正如Aram所说,这是一个范围问题。以“function funcName(){…”格式声明的函数被视为其声明范围的本地函数 要绕过此问题,请执行以下操作之一: 1) 使函数成为全局函数(不理想-全局函数是邪恶的) 2) 使用命名空间模式,需要全局可访问(与全局不同)的属性或方法可以在其上生存,例如
var my_ns = {};
$(function() {
my_ns.my_func = function() { alert('hello!'); };
$('body').append("<a href='javascript:my_ns.my_func();'>click me</a>");
});
var my_ns={};
$(函数(){
my_ns.my_func=function(){alert('hello!');};
$('body')。追加(“”);
});
3) 绑定一个点击事件,而不是使用链接的HREF-这样可以存储对func的引用,即使它是在现在不可访问的范围内声明的,例如
$(function() {
var my_func = function() { alert('hello!'); };
$('body').append($('<a />', {text: 'click me', href: '#'})).click(my_func);
});
$(函数(){
var my_func=function(){alert('hello!');};
$('body')。追加($('',{text:'click me',href:'#'}))。单击(my_func);
});
Aram比我抢先一步——但这基本上是相同的想法,即通过全局对象访问函数——在他的例子中,“MyModule”,在我的“my_ns”中。谢谢Aram和Andrew,你们都是对的。我在docready之外声明了myLayout,这就成功了。