blank_kuma
blank_kuma

Reputation: 337

Unable to call function within jQuery

I am trying to call a function in this javascript code. My code needs to check for whether the user selects var num, var letters and var symbols to be true or false. In the code, I preset the values but I still search the object choices for the variables that are true and push it into the array choices_made. However, since I need to randomly choose the order in which the num, letters and symbols appear, I randomly choose the class based on the Math.random(). However, it doesn't show me the alert(jumbled_result) afterwards.

http://jsfiddle.net/bdaxtv2g/1/

HTML

<input id="num" type="text" placeholder="Enter desired length">
<br/><br/>
<input id="press" type="button" value="jumble it up">

JS

$(document).ready(function(){
var fns={};

$('#press').click(function(){
    var length = parseInt($('#num').val());
    var num = true;
    var letters = true;
    var symbols = false;

    gen(length, num, letters, symbols);
});

function gen(len, num, letters, sym){
    var choices = {
            1:num,
            2:letters,
            3:sym
        };
    var choice_made = ['0'];
    var choice = 0;
    var jumbled_result = '';

    for(x in choices){
        if(choices[x]==true){
            choice_made.push(x);
        }
    }

    for(i=0;i<len;i++){
        var funName = 'choice';
        choice = Math.round(Math.random() * (choice_made.length-1));

        funName += choice_made[choice];
        jumbled_result = fns[funName](jumbled_result);
    }

    alert(jumbled_result);
}

fns.choice0 = function choice0(jumbled_result){
    var numbers = '0123456789';
    return jumbled_result += numbers.charAt(Math.round(Math.random() * numbers.length));
}

fns.choice1 = function choice1(jumbled_result) {
    var alpha = 'abcdefghijklmnopqrstuvwxyz';
    return jumbled_result += alpha.charAt(Math.round(Math.random() * alpha.length));
}

});

Upvotes: 0

Views: 637

Answers (2)

Ramanathan Muthuraman
Ramanathan Muthuraman

Reputation: 752

Its because of the way the object choices have been intitialized.. Try this..

       var choices = {
            0:num,
            1:letters,
            2:sym
        };

And also

 var choice_made = [];

JS fiddle link : http://jsfiddle.net/8dw7nvr7/2/

Upvotes: 1

Arcanyx
Arcanyx

Reputation: 870

You never declare functions within document.ready of jQuery. The functions should be declared during the first run(unless in special cases).

Here is a working code made out of your code. What I have done is just removed your functions out of document.ready event.

$(document).ready(function() {
  $('#press').click(function() {
    var length = parseInt($('#num').val());
    var num = true;
    var letters = true;
    var symbols = false;

    gen(length, num, letters, symbols);
  });
});

var fns = {};

function gen(len, num, letters, sym) {
  var choices = {
    1: num,
    2: letters,
    3: sym
  };
  var choice_made = ['0'];
  var choice = 0;
  var jumbled_result = '';

  for (x in choices) {
    if (choices[x] == true) {
      choice_made.push(x);
    }
  }

  for (i = 0; i < len; i++) {
    var funName = 'choice';
    choice = Math.round(Math.random() * (choice_made.length - 1));

    funName += choice_made[choice];
    jumbled_result = fns[funName](jumbled_result);
  }

  alert(jumbled_result);
}
fns.choice0 = function choice0(jumbled_result) {
  var numbers = '0123456789';
  return jumbled_result += numbers.charAt(Math.round(Math.random() * numbers.length));
}

fns.choice1 = function choice1(jumbled_result) {
  var alpha = 'abcdefghijklmnopqrstuvwxyz';
  return jumbled_result += alpha.charAt(Math.round(Math.random() * alpha.length));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="num" type="text" placeholder="Enter desired length">
<br/>
<br/>
<input id="press" type="button" value="jumble it up">

Upvotes: 2

Related Questions