繁体   English   中英

jQuery无法从单独的javascript文件中找到变量

[英]JQuery can't find variable from separate javascript file

我正在使用cakephp框架,我创建了2个单独的javascript文件,并将它们放入我的webroot / js文件夹中。 第一个javascript文件包含模态对话框变量,该变量包含对话框的设置。 第二个javascript文件包含其他click事件处理程序,这些处理程序将数据发布到操作中,然后打开对话框。

我遇到的问题是第二个文件使用$ variablename从第一个文件调用了一个变量,并且出现一条错误消息,提示未定义varaibleName。

下面的一些代码向您展示了我的意思。 从第一个文件:

var $editSel = $("#editSel_dialog").dialog(
{
    autoOpen: false,
    height: 530,
    width: 800,
    resizable: true,
    modal: true,
    buttons:
    {
        "Cancel": function()
        {
            $(this).dialog("close");
        }
    }
});

从第二个文件:

$('.neweditSel_dialog').live('click', function()
{
    $.ajaxSetup({ async: false });

    var selected = [];

    $("#[id*=LocalClocks]").each(function()
    {
        if(false != $(this).is(':checked'))
        {
            var string = $(this).attr('id').replace('LocalClocks', '');
            string = string.substring(10);
            selected.push(string);
        }
    });

    if(0 === selected.length)
    {
        $selError.dialog('open');
        $selError.text('No Local Clocks Were Selected')
    }
    else
    {
        $.post('/LocalClocks/editSelected', { "data[Session][selected]": selected }, function(data)
        {
        });
        $editSel.load($(this).attr('href'), function ()
        {
            $editSel.dialog('open');
        });
    }
    return false;
});

当我使用jquery-1.4.2.min.js时,此方法有效,但现在使用jquery1.7。 我还最终将第一个文件和所有变量放入$(document).ready(function(){}); 我尝试将第二个文件放在document.ready()函数中,但这没什么区别。

任何帮助都会很棒。 谢谢

您正在处理范围问题。 在javascript中:

function foo() {
    var greet = "hi";
}

function bar() {
    console.log(greet); // will throw error
}

然而:

var greet;
function foo() {
    greet = "hi";
}

function bar() {
    console.log(greet); // will log "hi"
}

您必须在需要访问它的两个函数的公共父级中定义变量。 不幸的是,由于您没有使用任何建模约定或框架,所以这就是window对象( 为什么全局变量不好? )。

因此,必须在$(document).ready 之前之外定义var $whateveryouneed

另外,将declarationdefinition分开。 您的定义实例化了一个jQuery对象,因此必须将其封装在$(document).ready() (改用$(function() {}) ):

var $editSel;
$(function () {
    $editSel = $("#editSel_dialog").dialog(
    {
        autoOpen: false,
        height: 530,
        width: 800,
        resizable: true,
        modal: true,
        buttons:
        {
            "Cancel": function()
            {
                $(this).dialog("close");
            }
        }
    });
});

我认为您无法保证将触发处理程序的顺序,这意味着准备就绪的文档可能以与您期望的顺序不同的顺序触发。 您要在第二个文件中访问的变量是全局变量吗? 尝试考虑您的变量范围,因为我原以为这就是问题所在。

您不能保证将一个文件先加载。 并且您不能保证一个文件中的document.ready会在另一个文件之前启动。

因此,建议您将代码包装在函数中,并按需要的顺序在单个document.ready处理程序中调用它们。

例如:

function initVariables(){
    window.$editSel = ... // your code from the first file here
}

function initHandlers(){
    // your code from the second file here
}

接着:

$(document).ready(function() {
    initVariables();
    initHandlers();
});

您会注意到,我使用了全局window对象来公开您的变量。 如果为它们使用公共命名空间,那就更好了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM