2015-05-14 46 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