2014-09-04 88 views
1

我是新来的Javascript/jquery,并与我正在开发的应用程序有问题。尝试读取对象的属性时遇到Uncaught TypeError。我的最终目标是让用户在文本框中输入内容并根据该输入将输入作为名称属性创建一个对象。这是我到目前为止的代码:未捕获的类型错误无法读取undefined的属性“名称”

$(document).ready(function(){ 
    var playerArray = []; 
    var playerIndex = 0; 

    function player (name) { 
     this.name = name; 
     score = 0; 
    }; 

    var addPlayer = function(name){ 
     playerArray[playerIndex] = new player(name); 
     playerIndex++; 
    }; 

    $('#add_players').on('click', '#btn-add', function(){ 
     var toAdd = $('input[name=playerNameInput]').val(); 
     addPlayer(toAdd); 
     $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + playerArray[playerIndex].name + '</div>'); 
    }); 
}); 

...我已经寻找这样的其他问题的网站,但他们都处理的API或无关的问题我的。我将不胜感激任何帮助。

回答

1

addPlayer()是增加你的playerIndex计数器后,你已经添加了对象playerArray,你那么你click处理程序中使用。目前尚不清楚,根据你的代码,你想要什么,当你拨打playerArray[playerIndex](最后一个元素添加?),但我只想摆脱柜台和使用Array.prototype.push(),而不是检索:在

$(document).ready(function(){ 
    var playerArray = []; 

    function player (name) { 
     this.name = name; 
     score = 0; 
    } 

    var addPlayer = function(name){ 
     playerArray.push(new player(name)); 
    }; 

    $('#add_players').on('click', '#btn-add', function(){ 
     var toAdd = $('input[name=playerNameInput]').val(); 
     addPlayer(toAdd); 

     // playerArray[playerArray.length - 1] will always retrieve the last element in the array 
     // use playerArray[0] if you always want the first 
     $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + playerArray[playerArray.length - 1].name + '</div>'); 
    }); 
}); 
+2

而你刚刚从阵列中移除了播放器。在读取值时,pop()不是正确的选择。推送很好。 – epascarello 2014-09-04 16:13:53

+0

好的。更新。 – 2014-09-04 16:14:53

1

看看这段代码

var addPlayer = function(name){ 
    playerArray[playerIndex] = new player(name); //you store it at an index 
    playerIndex++; //you increment 
}; 

由于指数递增,有没有像你正在阅读的位置。

console.log(playerArray[playerIndex]); //undefined 
console.log(playerArray[playerIndex-1]); //the last entry you added 

我个人不依赖于最后一个索引。当你创建它时,我会返回新玩家。比没有必要处理索引问题。

var playerArray = []; 
var playerIndex = 0; 

function Player (name) { 
    this.name = name; 
    score = 0; //this will be a problem.... 
}; 
var addPlayer = function(name){ 
    var user = new Player(name); 
    playerArray.push(user); 
    return user; 
}; 

$('#add_players').on('click', '#btn-add', function(){ 
    var toAdd = $('input[name=playerNameInput]').val(); 
    var person = addPlayer(toAdd); 
    $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + person.name + '</div>'); 
}); 

另外score将会是一个问题。

+0

感谢downvote一个正确的答案。 – epascarello 2014-09-04 16:10:21

+0

你能帮我理解为什么有人会低估我们的答案吗?你一直在做这个比我还要长。我们同时发布了(正确的)答案。 downvotes混淆了我。无论如何,我高举你的意见来弥补你错误的倒退。 – Antiga 2014-09-04 16:12:00

+0

因为人们这样做。 lol – epascarello 2014-09-04 16:13:33

1

你第一次运行时加1,你在0

初始化到时候你到playerArray[playerIndex].name首次时间playerIndexplayerIndex为1,您正在寻找的第一个值(指数0) 。你永远只是一个索引。

相关问题