views:

619

answers:

3

Hello , I'm currently working on a problem that basically involves processing all data in a form, saving it, and replacing the entire form with a text link. My primary goal is to convert a form, with some data using the POST method, and a submit button, into a standard text link that can then take the saved/serialized data and POST it to the server as if it were the original form; and when JS is disabled, the standard form and submit button is presented, i.e. a graceful degradation. I'm currently using jQuery, I know it's possible to process form data by serializing it, but I'm not sure how to go about removing or hiding (whichever one is possible) a form completely so it doesn't interfere with the layout of surrounding HTML element.

In summary:

-Is it possible to remove or hide an entire form field with jQuery?

-When jQuery serializes form data, where is it saved to?

-Can that saved data be referenced by a text link (i.e. <a href="mySavedData">Submit</a>") somehow and POSTed as if it were a standard form?

Thank you.

UPDATE: Ok, I implemented Franz's code in a separate JS file I call from my test.html page. The content of the JS file is as follows:

$(document).ready(function() {
  //Store form data before removing
    var tempStorage = $('.postLink').serialize();

  // Remove form:
    $('.postLink').remove();

    //Assign onClick event to anchor tag
    $('.submit').click(function(){
     $.ajax({
      //aspx page
      url:"doSomethingImportant/10",

      //Using POST method
      type: "POST",

      //The data object
      data: tempStorage,

      //No caching
      cache: false,

      //Alert on success
            success: function(html) {
            alert('great');
            }
     });
    });
});

The only difference here is I'm using the class attribute as an identifier for the forms I want removed as opposed to id. Again, this is what I'm tasked with, not by choice. For some reason, however, it doesn't make it to the alert message, i.e. it doesn't work. Below is the snippet of html I'm having the script act on:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml"&gt;
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<style type="text/css">
h1.intro {color:blue;}
p.important {color:green;}
h2.outro {color:DarkGreen;}
</style>

<script type="text/javascript" src="jQuery/jquery-1.3.2.js"></script>
<script type="text/javascript" src="Form2Link.js"></script>

<title>Form Remover demo</title>
</head>

<body>
<h1 class="intro">Hello World!!</h1>

<p>How's it going??</p>

<a href="">my First Link</a>
<form id = "myForm" name="myForm" action="doSomethingImportant/10" class="postLink" method="post">
<input type="submit" id="submitThis" name="submitThis" value="clickThisLink"></input>
<input type="hidden" id="antiCSRF" name="antiCSRF" value="12345"></input>
</form>
<a class="submit" href="">Submit Link</a>
<a href="">my Second Link</a>
<a href="">my Third Link</a>

<br>
<br>

<form action="doSomethingImportant/10" method="post">
<input type="submit" id="submitThis" value="clickThisLink"></input>
<input type="hidden" value="12345" name="antiCSRF"></input>
</form>

<form action="doSomethingImportant/11" method="post">
<input type="submit" value="clickThisLink"></input>
<input type="hidden" value="12345" name="antiCSRF"></input>
</form>

<h2 class="outro">That's nice, gotta go.</h2>
</body>

</html>

UPDATE 11/10/09: Ok, I've found an alternate way of going about this problem by hiding the form and adding an anchor tag immediately after the form. I then attach a click operation to the anchor that acts on the submit button in the hidden form. My problem now is that this only works with one form defined in the DOM, I want to come up with a generalization of this function so that it works with several forms. How can I traverse each form and replace it with its own unique link?

Code for my current script:

/**
 * Hide forms on page load.
 * Call submit button within a form from a link
 */
$(document).ready(function() {
    //Hide form:
    $('.postLink').hide();

    //Append a anchor tag after each form that is replaced
    $('.postLink').after("<a class=\"submitLink\" href=\"#\">Submit Link</a>");


    //Submit button in hidden form
    $('.submitLink').click(function(){
     $('#myForm').find('input#submitThis').click();
     return false;
    });
});
+3  A: 

Part 1 is easy:

$('#yourform').hide();

EDIT: (to the best of my understanding - using ScottE's step-by-step idea)

Part 2:

Save the form in a local variable:

var tempStorage = $('#yourform').serialize();

Part 3:

Assign a function to the onClick event of your link that sends the data via an AJAX request:

$('#yourbutton').click( function() {
    $.ajax({  
        // Your PHP processing script goes here  
        url: "yourfile.php",

        // You wanted to use POST, right?
        type: "POST",

        // The data object (I hope, it's accessible here)
        data: tempStorage,

        // We don't need caching
        cache: false,

        // A function that gets executed on success
        // Note that you have the response of the script in the html variable
        success: function(html) {
            alert('great');
        }
    });
});
Franz
This appears correct, but what if I have multiple forms that I want converted to text links that POST serialized data. That is, when the script is run, it'll serialize all data within forms with id = "yourform". When it comes time for a link to POST data, how does the link know what serialized data to send?? Thanks very much for the help.
kingrichard2005
Well, you can just store the serialized data in an array and then select the right element when submitting the form via the link. Or am I misunderstanding something here?
Franz
A: 

If I understand what you're looking for, you could do the following:

  1. handle the submit event of the form.
  2. store the form data in a local variable in js - look to http://docs.jquery.com/Ajax/serialize
  3. hide the form
  4. show the link that will submit the form (again), and handle it's click event, initiating an ajax call where you pass in the local variable created in step 2.

This seems like an odd request...

ScottE
Maybe a confirmation? "Do you really want to do this" etc...?
Franz
A: 

Ok all, I went the route of hiding all my forms and appending anchor tags following each form based with class="postLink", I added a conditional statement that adds a unique ID if a form doesn't already have one, the script then adds an anchor tag with the unique ID and the value of the submit button to the end of the hidden form. A separate click function the processes the submit button in the hidden form that is tied to an anchor tag by the unique ID. Code follows:

/**
 * Hide all forms with class="postLink" on page load.
 * Call submit button within a form from a anchor tag
 */
$(document).ready(function() {
    //Hide form(All forms with class="postLink" will be hidden):
 $('.postLink').hide();

 var num = 0;
 //Loop over each form with a postLink class
 $("form").each(function(){
  //Add value of submit button as name of text link
  if($(this).hasClass("postLink")){
   //Get value attribute from submit button
   var name = $(this).find('input#submitThis').val();

   //Add a uniqueID if the form has no id
   if($(this.id).length == 1){
    this.id='uniqueID'+num;
    num++;
   }

   var id = $(this).attr('id');
   //Append a anchor tag after each form that is replaced
   $(this).after("<a id="+id+" class=\"submitLink\" href=\"#\">"+name+"\</a>");
  }
 });

 //Submit button in hidden form by clicking associated anchor tag
 $('.submitLink').click(function(){
  var anchorID = $(this).attr('id');
  //Find the form id that matches the anchor id
  $("form").each(function(){
   if(this.id == anchorID){
    $(this).find('input#submitThis').click();
   } 
  });
  return false;
 });
});
kingrichard2005