34

I'm using the jQuery validate plugin, and would like to return a random value on success.

Right now I'm trying to use:

     var success_message = new Array ();
     success_message[0] = "Good!";
     success_message[1] = "Ok!";
     success_message[2] = "Great!";
     success_message[3] = "Perfect!";
     success_message[4] = "Nice!";
     success_message[5] = "Awesome"; 
     var i = Math.floor(5 * Math.random())

Then where I need to output the value I use:

 $(document).ready(function(){
     var validator = $(".contactform").validate({
        success: function(label) {
           label.addClass("valid").text(success_message[i])
        }
     }); //end form validate code
 });

This selects a random value but uses the same value for each success message instead of selecting a different one for each field.

3
  • @Brandon - You should refrain from drastically changing the question once it's asked. The answers will now make much less sense to anyone finding this later since the question no longer matches the answers. Commented Aug 5, 2010 at 23:41
  • You're right I thought about that after I edited it. At the time I edited it it had no answers. Commented Aug 6, 2010 at 0:05
  • This has nothing to do with jQuery validation. Commented Dec 8, 2011 at 12:40

4 Answers 4

91

You can store the messages array and calculate the message to show as you go, like this:

var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"];
function getMessage() {
   return messages[Math.floor(Math.random() * messages.length)];
}

Give it a try here, then just call getMessage in your .text() call, like this:

label.addClass("valid").text(getMessage());
Sign up to request clarification or add additional context in comments.

8 Comments

This almost works but returns the same message for each field element.
@BandonRandon - I was under the impression you had just one, just a moment :)
@BandonRandon - Updated to be random per-element, I would suggest that you may want to go a step further and remove the used message as well, so it can't be repeated.
Sorry, I should had made that clear there is one for each form element.
Great that works! Thank you, A few more questions, If I did want to make it not repeat how would I do that? Also because it's initializing on keyup It's regenerating with each keypress or mouse click. Can I use stop() or something to stop that?
|
7

We can add Method to Array.

Array.prototype.getRandomVal = function(){
    return this[Math.floor(Math.random()*this.length)];
};

messages.getRandomVal();

Comments

5
function sucess() {
 message = ["Good!","Awesome!","Super!","Nice!","Great!"];
 return message[Math.floor(Math.random() * message.length)];
}

 $(document).ready(function(){
     var validator = $(".contactform").validate({ ...
              success: function(label) {
    label.addClass("valid").text(success());
 }
      }); //end form validate code
         });

Comments

1

A concise way of choosing a random element of the array is to use bitwise OR instead of Math.floor(). This works because bitwise operations will cause the fractional part of the number to be discarded, which achieves exactly the same result as Math.floor(). Operator precedence means that the bitwise operation happens after the multiplication. Doing bitwise OR with zero leaves the original number unaffected, except that now the fractional part is gone.

const arr = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"]

const randomElement = arr[Math.random() * arr.length | 0]

console.log(randomElement)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.