2009-07-19 31 views
33

Jest to jedna z tych sytuacji, gdzie czuję się jakbym brakuje kluczową słowo kluczowe, aby znaleźć odpowiedź na Google ...Non-ajax GET/POST jQuery (wtyczka?)

mam torbę parametry i chcę, aby przeglądarka przechodziła do adresu URL GET z parametrami. Będąc użytkownikiem jQuery, wiem, że gdybym chciał, aby żądania AJAX, chciałbym po prostu zrobić:

$.getJSON(url, params, fn_handle_result); 

Ale czasami nie chcesz używać AJAX. Chcę tylko przesłać parametry i odzyskać stronę.

Teraz wiem, że mogę zapętlić parametry i ręcznie skonstruować URL GET. W przypadku POST mogę dynamicznie tworzyć formularze, wypełniać je polami i przesyłać. Ale jestem pewien, że ktoś napisał wtyczkę, która już to robi. A może coś przeoczyłem i możesz to zrobić z rdzeniem jQuery.

Czy ktoś wie o takiej wtyczce?

EDIT: W zasadzie, co chcę napisać:

$.goTo(url, params); 

i ewentualnie

$.goTo(url, params, "POST"); 

Odpowiedz

49

jQuery Plugin wydawało się doskonale aż Próbowałem go na IE8. Musiałem wprowadzić tę drobną modyfikację, aby uruchomić ją na IE:

(function($) { 
    $.extend({ 
     getGo: function(url, params) { 
      document.location = url + '?' + $.param(params); 
     }, 
     postGo: function(url, params) { 
      var $form = $("<form>") 
       .attr("method", "post") 
       .attr("action", url); 
      $.each(params, function(name, value) { 
       $("<input type='hidden'>") 
        .attr("name", name) 
        .attr("value", value) 
        .appendTo($form); 
      }); 
      $form.appendTo("body"); 
      $form.submit(); 
     } 
    }); 
})(jQuery); 
+0

Dzięki za poprawkę! – itsadok

+0

Doskonały, ale byłem trochę pogrążony w ciemności, w jaki sposób używać tego do publikowania wartości wejściowych innego formularza na stronie. W końcu skorzystałem z funkcji unparam http://stackoverflow.com/questions/1131630/javascript-jquery-param-inverse-function#1131658 przez blixt jak: $ .postGo ('/ my/post/handler' , jQuery.unparam ($ ('# myform'). serialize())); –

+3

Uwaga: wtyczką jQuery, do której odsyła Dustin jest itsadok (patrz poniżej). Początkowo mnie to zdezorientowało. ;-) –

12

Nie jest jasne, z pytaniem, czy masz losowo kilka wartości, które chcesz przekazać na kwerendy lub czy jest to wartość formularza.

Dla wartości formularza wystarczy użyć funkcji .serialize do skonstruowania kwerendy.

np

var qString = $('#formid').serialize(); 
document.location = 'someUrl' + '?' + serializedForm 

Jeśli masz kilka losowych wartości można zbudować obiekt i użyć metody .param użytkową.

np

var params = { width:1680, height:1050 }; 
var str = jQuery.param(params); 
console.log(str) 
// prints width=1680&height=1050 
// document.location = 'someUrl' + '?' + str 
-5

Przyjęte rozwiązanie nie wydaje się, aby pokryć zapotrzebowanie POST, jak ustawienie document.location zawsze spowoduje żądanie GET. Oto możliwe rozwiązanie, choć nie jestem pewien zezwoleń jQuery załadowaniu całej zawartości strony tak:

$.post(url, params, function(data) { 
    $(document).html(data); 
}, "html"); 
+1

I nie był tym, który cię downvoted. Ale .post jest AJAX. Chciał, żeby nie AJAX, więc faktycznie zmieniłby stronę. – Rap

20

Oto, co skończyło się robi za pomocą końcówki z redsquare:

(function($) { 
    $.extend({ 
     doGet: function(url, params) { 
      document.location = url + '?' + $.param(params); 
     }, 
     doPost: function(url, params) { 
      var $form = $("<form method='POST'>").attr("action", url); 
      $.each(params, function(name, value) { 
       $("<input type='hidden'>") 
        .attr("name", name) 
        .attr("value", value) 
        .appendTo($form); 
      }); 
      $form.appendTo("body"); 
      $form.submit(); 
     } 
    }); 
})(jQuery); 

Użycie:

$.doPost("/mail/send.php", { 
    subject: "test email", 
    body: "This is a test email sent with $.doPost" 
}); 

Wszelkie opinie będą mile widziane.

Update: Odpowiedź zobaczyć Dustina do wersji, która działa w IE8

+0

bez $ form.appendTo ("body"); to nie zadziała w IE9. Dzięki ! Miałem problem z tym – fredcrs

0

Dobra robota itadok!Jeśli chcesz niewidzialna postać umieścić go w ukrytym Gr:

(function($) { 
    $.extend({ 
     doGet: function(url, params) { 
      document.location = url + '?' + $.param(params); 
     }, 
     doPost: function(url, params) { 
      var $div = $("<div>").css("display", "none"); 
      var $form = $("<form method='POST'>").attr("action", url); 
      $.each(params, function(name, value) { 
       $("<input type='hidden'>") 
        .attr("name", name) 
        .attr("value", value) 
        .appendTo($form); 
      }); 
      $form.appendTo($div); 
      $div.appendTo("body"); 
      $form.submit(); 
     } 
    }); 
})(jQuery); 
+1

Tak, lub możesz po prostu ustawić

na "display: none". Formularz z tylko ukrytymi polami nie powinien wyświetlać niczego - z wyjątkiem może trochę pustego miejsca z marginesu/padding (w niektórych przeglądarkach). –

3

FYI dla każdego, kto robi doPost dla szyn 3, trzeba dodać w token CSRF, dodając następujący do odpowiedzi należy zrobić ...

var token = $('meta[name="csrf-token"]').attr('content'); 
$("<input name='authenticity_token' type='hidden' value='" + token + "'/>").appendTo($form); 
+1

Tak, niektóre inne technologie po stronie serwera (Drupal i Django) będą wymagać pewnych ukrytych pól związanych z bezpieczeństwem, takich jak ten. –

1

ten jest podobny do powyższego, z wyjątkiem będzie obsługiwać parametry tablicowe są przekazywane do MVC

(function($) { 
    $.extend({ 
     getGo: function(url, params, traditional) { 
      /// <summary> 
      ///  Perform a GET at url with specified params passed as part of the query string. 
      /// </summary> 
      /// <param name="url"></param> 
      /// <param name="params"></param> 
      /// <param name="traditional">Boolean: Specify true for traditional serialization.</param> 
      document.location = url + '?' + $.param(params, traditional); 
     }, 
     postGo: function (url, params) { 
      /// <summary> 
      ///  Perform a POST at url with the specified params as part of a form object. 
      ///  If a parameter is an array then it will submit it as multiple attributes so MVC will see it as an array 
      /// </summary> 
      /// <param name="url" type="string"></param> 
      /// <param name="params" type="Object"></param> 
      var $form = $("<form>").attr("method", "post").attr("action", url); 
      $.each(params, function (name, value) { 
       if (value.length != null && value.length > 0) { 
        for (var i = 0; i < value.length; i++) { 
         $("<input type='hidden'>").attr("name", name + '[' + i + ']').attr("value", value[i]).appendTo($form); 
        } 
       } 
       else { 
        $("<input type='hidden'>").attr("name", name).attr("value", value).appendTo($form); 
       } 
      }); 
      $form.appendTo("body"); 
      $form.submit(); 
     } 
    }); 
})(jQuery); 
+0

++, ale zauważ, że (przynajmniej od MVC 6 - nie wiesz o wcześniejszych wersjach) nie musisz modyfikować wartości 'name' z indeksem - wiele elementów o tej samej nazwie będzie rozpoznawanych jako tablica . Również, być może podstawienie '$ .isArray (value)' dla 'value.length! = Null && value.length> 0' sprawia, że ​​kod jest bardziej czytelny. – mklement0

Powiązane problemy