2015-05-14 47 views
0

我試圖得到一些元素的數據屬性的時間定義,但是在創建對象時,該元素尚未加載(據我所知)。我的問題是什麼是最好的(或任何)解決方案,因爲我需要在兩個不相互作用的獨立函數中使用這個對象?元素不會在腳本執行

function Data_Num_Array(){ 
    this.data_num_array=$("*[data-num]"); 
} 

Data_Num_Array.prototype.get_data_num_array_element=function(string_val){ 
    var data_num_of_element; 
    for(var i=0;i<this.data_num_array.length;i++){ 
     if(this.data_num_array[i].id===string_val){ 
      data_num_of_element=$(this.data_num_array[i]).attr("data-num"); 
      break; 
     } 
    } 
    return data_num_of_element; 
}; 

function call_me(){ 
    console.log(obj.get_data_num_array_element("div")); 
} 

如果在這裏有語法錯誤,這不是一個問題,這只是針對問題的情況。

var obj=new Data_Num_Array(); 

$(document).ready(function(){ 
    console.log(obj.get_data_num_array_element("div")); 
}); 

$("#click").click(function(){ 
    console.log(obj.get_data_num_array_element("click")); 
}); 

<html> 
    <head> 
    </head> 
    <body> 
     <div id="div" data-num="1"></div> 
     <button id="click" data-num="2"></button> 
    </body> 
</html> 

回答

0

如果你是新來的JavaScript,它可能是值得的作用域閱讀了:MDN: Variable Scoping

總之,需要在兩個功能obj,但我們可以利用作用域來幫助我們確保兩個$(document).ready$("#click")將不得不obj訪問。另一方面,obj需要等到文檔準備就緒。我們可以與你使用的$(document).ready回調函數實例Data_Num_Array推遲。

隨着比特重新排列的:

function Data_Num_Array(){ 
    this.data_num_array=$("*[data-num]"); 
} 

Data_Num_Array.prototype.get_data_num_array_element=function(string_val){ 
    var data_num_of_element; 
    for(var i=0;i<this.data_num_array.length;i++){ 
     if(this.data_num_array[i].id===string_val){ 
      data_num_of_element=$(this.data_num_array[i]).attr("data-num"); 
      break; 
     } 
    } 
    return data_num_of_element; 
}; 

$(document).ready(function(){ 
    var obj=new Data_Num_Array(); 

    console.log(obj.get_data_num_array_element("div")); 

    $("#click").click(function(){ 
    console.log(obj.get_data_num_array_element("click")); 
    }); 
}); 

現在,我們正在等待建立新Data_Num_Array和click事件。

此外,您的點擊處理程序中有一個小錯誤,您在此調用obj.get_data_num_array_element("button")而不是obj.get_data_num_array_element("click")。 (你給了你<button>的「咔嚓」聲。一個id)

在更加剛愎自用的一面,可以考慮使用駝峯的變量名。輸入較少的字符。 ;)

+0

一個需要的Data_Num_Array對象的功能,需要到外面的$(document)。就緒,因爲它是被從其他來源調用,所以將在函數內部的$(document)。就緒不會因爲它的工作搜索該功能時會導致錯誤。我想我沒有在我的帖子中解釋。根據你的意見,我更喜歡camelCase,但我的一位同事不喜歡它,所以我一直試圖用更多的下劃線來編寫代碼。 – Cody

+0

'call_me'是一個返回值函數嗎?如果是這樣,你必須將它的行爲包裝在'$(document).ready'中,並使用一個回調函數,當'call_me'實際上準備返回時調用它。如果'call_me'不是一個返回值函數,那麼你仍然可以將它包裝在'$(document).ready'中。 '$(document).ready'可以多次使用。那樣有用嗎? –

+0

call_me()沒有返回語句。我已經嘗試將它包裝在$(document).ready中,但是接着調用控制檯返回的該函數不存在的那一行 – Cody