2016-04-10 14 views
0

Konsol tabanlı metin oyunu yapmak istiyorum. Kullanıcı ismini yazdığında, yaş girişi ile bir işlevi çağırmalı ve yaş girdikten sonra seks girdisini çağırmalıdır. Ama yaşımı yazdığımda, tekrar + bir sonraki fonksiyona tekrar bağlanmayı çağırır. Sonraki işlevden sonra getAge + sonraki işlev + sonraki işlevi çağırır. Umarım biliyorsun, ne demek istedim. Bunu nasıl düzeltebilirim? Bir geri arama denedim, ama yardımcı olmadı.Neden başka bir şey tamamlandıktan sonra işlev çağırdığımda, önceki tüm çağrıları çağırır?

$(document).ready(function(){ 
 
    var Player = { 
 
     username : "", 
 
     age : null, 
 
     sex : "", 
 
     
 
    }; 
 
    
 
    function textArea($text){ 
 
     return $('#textArea').val($('#textArea').val() + $text); 
 
    }; 
 
    
 
    function clearInput(){ 
 
     return $('#inputs').val(''); 
 
    } 
 
    
 
    var functions = { 
 
     start : function start(){ 
 
      functions.getUsername(); 
 
     }, 
 
     //START GET USERNAME 
 
     getUsername : function getUserName(callback){ 
 

 
      //Hello! Tell me your username! 
 
      textArea("Vítej! Zadej svou přezdívku!"); 
 
    
 
      $('#inputs').keypress(function (e){ 
 
       if (e.which == 13){ 
 
        Player.username = $('#inputs').val(); 
 
        textArea("\n" + Player.username + "\n"); 
 
        clearInput(); 
 
        functions.getAge(); 
 
       } 
 
      }); 
 
     }, 
 
     //END GET USERNAME 
 
    
 
     //START GET AGE 
 
     getAge : function getAge(){ 
 

 
      //Tell me your age! 
 
      textArea("Zadej svůj věk!"); 
 
      
 
      $('#inputs').keypress(function (e){ 
 
       if (e.which == 13){ 
 
        Player.age = $("#inputs").val(); 
 
        textArea("\n" + Player.age + "\n"); 
 
        clearInput(); 
 
        functions.getSex(); 
 
       } 
 
      }); 
 
     }, 
 
     //END GET AGE 
 
     
 
     getSex : function getSex(){ 
 
    
 
      //Tell me your sex: male/female 
 
      textArea("Zadej pohlaví: muž/žena"); 
 
      
 
      $('#inputs').keypress(function (e){ 
 
       if (e.which == 13){ 
 
        Player.sex = $('#inputs').val(); 
 
        textArea("\n" + Player.sex + "\n"); 
 
        clearInput(); 
 
        //Another function 
 
       } 
 
      }); 
 
     } 
 
    }; 
 
    
 
    functions.start(); 
 
});
#content>*{ 
 
    display: block; 
 
    margin: 0 auto ; 
 
} 
 
#textArea{ 
 
    box-shadow: 2px 2px 2px grey; 
 
    background: black; 
 
    color: white; 
 
} 
 
#inputs{ 
 
    width: 61%; 
 
    margin-top: 10px; 
 
    background: black; 
 
    color: white; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Document</title> 
 
    <link rel="stylesheet" type="text/css" href="style.css"> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 
 
    <script src="script.js"></script> 
 
</head> 
 
<body> 
 
    <div id="content"> 
 
     <textarea id="textArea" rows="30" cols="100"></textarea>  
 
     <input type="text" id="inputs"> 
 
    </div> 
 
</body> 
 
</html>

+2

Kodunuz '.keypress()' olarak her çağrıldığında, ** eklenmiş olan olay işleyicilerinden kurtulacak ** bir olay işleyicisi ekleniyor **. Bir "onkeypress" özelliğine bir işlev atamakla aynı şey değildir. – Pointy

cevap

1

Her işlev çağrısı da textarea bir keypress işleyicisi ekler. getAge() aramanızdan sonra 2 dinleyiciniz var. Bu nedenle, bir sonraki tuşa basma, getAge AND getSex'u arayacaktır. Yani, yeni bir tane ayarlamadan önce bir dinleyici önceki dinleyiciyi kaldırmak olacaktır.

+0

Tamam, ne demek istediğini biliyorum, ama fikrin yok, nasıl yapılacağını. –

+0

JQuery off yöntemine bakın. – jlowcs