Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript UILayout的可变范围_Javascript_Jquery - Fatal编程技术网

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,这就成功了。