[英]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
。
另外,将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");
}
}
});
});
我认为您无法保证将触发处理程序的顺序,这意味着准备就绪的文档可能以与您期望的顺序不同的顺序触发。 您要在第二个文件中访问的变量是全局变量吗? 尝试考虑您的变量范围,因为我原以为这就是问题所在。
您不能保证将一个文件先加载。 并且您不能保证一个文件中的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.