脚本执行时未定义元素

时间:2015-05-14 19:44:15

标签: javascript jquery object attributes prototype

我试图获取某些元素的数据属性,但是在创建对象时,元素尚未加载(我理解)。我的问题是什么是最好的(或任何)解决方案,因为我需要在两个不相互交互的独立函数中使用这个对象?

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>

1 个答案:

答案 0 :(得分:0)

如果您是JavaScript的新手,可能值得阅读范围界定:MDN: Variable Scoping

简而言之,两个函数需要obj,但我们可以利用范围确保来确保$(document).ready$("#click")都可以访问obj。另一方面,obj需要等到文档准备好。我们可以暂停使用您正在使用的Data_Num_Array回调函数来实例化$(document).ready

稍微重新排列:

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和点击事件。

此外,您的点击处理程序中有一个小错误,您在其中调用了obj.get_data_num_array_element("button")而不是obj.get_data_num_array_element("click")。 (您为<button>提供了ID为#34;点击&#34;。)

在更加自以为是的方面,考虑将camelCase用于变量名称。输入的字符越少。 ;)