Search code examples
javascripthtmlperlmason

Get the return value of a HTML Form Post method


I have a HTML form in a Mason component(A.m) that uses the post method to call another Mason component(B.m). I want this Mason component(B.m) to return a value to the HTML form in the Mason component(A.m). Then I want to pass this returned value to a Javascript function.

How can I do this? I'm new to web development.


Solution

  • You need to make an AJAX request. Although not strictly necessary, I would suggest you to use jQuery, it will make things a lot easier. Please also have a look at this question: jQuery AJAX submit form

    Here's a little example in Mason, it's very simplified of course, you should add some error checking and some escaping also, but I think it could be a good start. Your A.mc component could look like this:

    <html>
    <head>
      <title>This is A</title>
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
      <script>
      $(document).ready(function() {
    
        $("#myform").submit(function() { // intercepts the submit event
          $.ajax({ // make an AJAX request
            type: "POST",
            url: "B", // it's the URL of your component B
            data: $("#myform").serialize(), // serializes the form's elements
            success: function(data)
            {
              // show the data you got from B in result div
              $("#result").html(data);
            }
          });
          e.preventDefault(); // avoid to execute the actual submit of the form
        });
    
      });
      </script>
    </head>
    <body>
      <form id="myform">
      <input type="text" name="mytext" />
      <input type="submit" />
      </form>
    
      <div id="result"></div>
    </body>
    </html>
    

    it's just an HTML page that loads jQuery library and that contains your form, and that contains some code to instruct the form to make an AJAX request to B component when the user clicks the Submit button and then to show the contents returned by B component in your result div.

    And this could be your B.mc component:

    <%class>
      has 'mytext';
    </%class>
    I got this text <strong><% $.mytext %></strong> from your form,
    and its length is <strong><% length($.mytext) %></strong>.
    

    Result will be like this:

    enter image description here