我正在使用cakephp框架,我创建了2个单独的javascript文件,并将它们放入我的webroot / js文件夹中。第一个javascript文件包含模式对话框变量,其中包含对话框的设置。第二个javascript文件包含其他单击事件处理程序,它们将数据发布到操作,然后打开对话框。
我遇到的问题是第二个文件使用第一个文件调用变量 $ 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()函数中,但这没有任何区别。
任何帮助都会很棒。 感谢
答案 0 :(得分:2)
您正在处理范围问题。在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"
}
您必须在需要访问它的两个函数的公共父级中定义您的变量。不幸的是,既然你没有使用任何建模约定或框架,那就是窗口对象(why are global variables bad?)。
因此,您必须在之前定义var $whateveryouneed
,在之外定义两个$(document).ready
。
另外,请保持declaration
和definition
分开。您的定义实例化了一个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");
}
}
});
});
答案 1 :(得分:1)
我认为您无法保证处理程序将被触发的顺序,这意味着文档就绪可能会以不同于您预期的顺序触发。您尝试在第二个文件中访问的变量是全局变量吗?尝试考虑你的变量范围,因为我认为这是问题。
答案 2 :(得分:1)
您无法保证在另一个文件之前加载一个文件。而且你不能保证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
对象来公开您的变量。如果你为它们使用了一个通用命名空间会更好。