2010-10-02 17 views
15

Tengo una página (page 1) que acepta solicitudes de publicación, hace algunas cosas y muestra algunos datos al final.jquery - enviar publicación sincrónicamente (no ajax)

De otra página (page 2), quiero redirigir a page 1 cuando se hace clic en un botón, de enviar supuesto todos los datos pertinentes requeridos por page 1 a través de POST.

Puedo, por supuesto, usar el antiguo truco de tener un formulario invisible en la página, rellenar todos los datos que necesito usando jquery, justo después de que el usuario hizo clic en el botón, y enviarlo() automáticamente. Pero eso parece engorroso: es mucho mejor usar una sintaxis similar a $.post, en lugar de comenzar a manipular html. $.post sería perfecto, si fuera a redireccionar a la página y no realizar la solicitud de forma asíncrona (no puedo redireccionar a page 1 después de que la publicación ajaxy se haya completado desde que page 1 necesita los datos para mostrar algo).

¿Hay alguna manera de hacer lo que quiero con jquery, o son formas invisibles feos la única salida?

PS

Sé que hay otras formas complicadas de lograr lo que quiero, por ejemplo, utilizando $.post y simplemente plantar html del responden en la página que estamos actualmente, pero sólo quiero saber si hay una sencillo forma de hacerlo con jquery

Respuesta

0

Supongo que la respuesta es que no hay una manera directa. Para una función general que agrega esta capacidad, vea la respuesta de Greg W.

0

Si tiene que emitir una solicitud POST, entonces el formulario invisible es una de sus mejores opciones.

Si su aplicación funcionará con una solicitud GET, codificaré los datos en la cadena de consulta y haré una.

document.location.href =

Puede utilizar jQuery.serialize para generar la cadena de consulta.

-2

html:

<form id="myform" method="get" acction="page2"> 
    <!-- data --> 
</form> 

JS:

$('#myform').bind('submit', function(ev) { 

    ev.stopPropagation(); 

    var ok = true; 
    //manipulate html and 'ok' 

    return ok; // if ok == false, don't execute post 


}); 
15

Esto me dio una idea para una pequeña función jQuery para imitar el comportamiento $ .post como usted describió. Todavía utiliza formularios invisibles en el fondo, pero la sintaxis es relativamente limpia y directa.

$(document).ready(function(){ 
    $('#myButton').PostIt('post.php', {foo:'bar', abc:'def', life:42}); 
    $('#myOtherButton').PostIt('post.php', dataObjectFromSomewhereElse); 
}); 

$.fn.PostIt = function(url, data){ 

    $(this).click(function(event){ 

     event.preventDefault(); 

     $('body').append($('<form/>', { 
      id: 'jQueryPostItForm', 
      method: 'POST', 
      action: url 
     })); 

     for(var i in data){ 
      $('#jQueryPostItForm').append($('<input/>', { 
      type: 'hidden', 
      name: i, 
      value: data[i] 
      })); 
     } 

     $('#jQueryPostItForm').submit(); 
    }); 
} 
+0

Soy consciente de que es sólo un ejemplo, pero de acuerdo a la especificación, las llaves en su objeto JSON debería ser cadenas y como tal rodeado de comillas. Ese tipo de cosas me causaron muchos dolores de cabeza cuando me encontré con JSON por primera vez. ;-) – Flo

+0

Interesante. Nunca tuve que poner comillas alrededor de mis claves JSON a menos que la clave en sí fuera una palabra reservada como 'clase' o algo así. Supongo que poner citas sobre todo es una forma de garantizar que nunca tengas ese problema, pero prefiero la forma en que se ve sin comillas. –

+0

Más información sobre ese tema: http://stackoverflow.com/questions/2348867/why-are-some-object-literal-properties-quoted-and-others-not –

9

Adapté código de Greg W a una función lineal que puede llamar en el código:

function postIt(url, data){ 

    $('body').append($('<form/>', { 
     id: 'jQueryPostItForm', 
     method: 'POST', 
     action: url 
    })); 

    for(var i in data){ 
     $('#jQueryPostItForm').append($('<input/>', { 
     type: 'hidden', 
     name: i, 
     value: data[i] 
     })); 
    } 

    $('#jQueryPostItForm').submit(); 
} 
+1

Debe eliminar la línea event.preventDefault(); –

+0

Hecho, gracias lulhuh. – crizCraig

Cuestiones relacionadas