2012-07-18 53 views
0

我使用cakephp框架,並創建了2個獨立的javascript文件,並將它們放入我的webroot/js文件夾中。第一個JavaScript文件包含模態對話框變量,其中包含對話框的設置。第二個JavaScript文件包含將數據發佈到某個操作的其他單擊事件處理程序,然後打開該對話框。JQuery無法從單獨的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()函數裏面,但是沒有什麼區別。

任何幫助將是偉大的。 謝謝

+1

它是哪個變量? – 2012-07-18 12:21:13

+0

它是else子句中的$ editSel變量,無法找到。 – RXC 2012-07-18 12:24:49

+1

'$ editSel'。因爲它是第一個文件中定義的唯一變量。 – techfoobar 2012-07-18 12:25:28

回答

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秒。

此外,保持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"); 
      } 
     } 
    }); 
}); 
+0

我正在使用cakephp框架。我不認爲有一個共同的父母,因爲這兩個文件只是從我的視圖文件中提取javascript。但爲了測試這一點,我將結合這兩個文件,而不是從那裏開展工作。 – RXC 2012-07-18 12:35:46

+1

_Javascript_框架。像更新後的答案那樣定義一個全局變量應該可以解決您的問題,而無需組合文件。 – Austin 2012-07-18 12:38:23

+0

嘿,你是對的,將對話框設置改爲函數,然後將全局變量調用'var $ editSel'放在document.ready()調用上方。謝謝 – RXC 2012-07-18 12:44:11

1

我不認爲你可以保證處理程序將被解僱的順序,這意味着準備好的文件可能會以不同的順序被解僱。您想要在第二個文件中訪問的變量是否是全局變量?試着想想你的變量範圍,因爲我會認爲這是問題。

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對象暴露你的變量。如果你爲它們使用了一個通用的命名空間,那將會更好。

相關問題