2009-10-03 7 views
18

C'è un modo per impostare il metodo di invio HTTP di completamento automatico di Jquery su POST anziché su GET?Come si imposta il completamento automatico JQuery su POST anziché su GET?

+0

Inoltre, è possibile modificare MVC per consentire GET. Vedi http://stackoverflow.com/questions/2350921/asp-net-mvc-2-failed-with-jquery-ajax-response#2350957 – Daveo

+0

@Daveo: È vero, ma dobbiamo essere cauti nel disabilitare una funzione che era destinato a proteggerci dagli exploit di vulnerabilità del browser. – StriplingWarrior

+2

Forse di interesse: una richiesta di funzionalità (http://bugs.jqueryui.com/ticket/5353) e una spiegazione del motivo per cui è stata rifiutata (http://forum.jquery.com/topic/jqueryui-autocomplete-post -Opzione-per-remote-request # 14737000002084408). – StriplingWarrior

risposta

6

Sfortunatamente, non vi è alcuna opzione per il completamento automatico che consentirà di impostarlo. Esiste, tuttavia, una singola posizione nel codice del plugin in cui viene chiamata la funzione $.ajax. Non è stata specificata l'opzione type, il che significa che verrà impostato automaticamente su una richiesta GET. Si potrebbe modificare il $.ajax chiamata (che inizia sulla linea 361 della versione più recente) per includere un'opzione type e impostare il valore di "post":

$.ajax({ //line 361 
    type: "post", 
    ... 
+0

Modificare la fonte significa che avrai problemi ad aggiornare alla versione successiva. – usr

+0

Inoltre, la documentazione dice che 'type:" POST "' è richiesto. Probabilmente entrambi funzionano, ma il minuscolo è di cattivo gusto. – usr

13

È possibile utilizzare il

$.ajaxSetup({ type: "post" }); 

prima la chiamata al completamento automatico, e sostituirà la chiamata Ajax sulla pagina.

+0

Questo modifica * tutte * le chiamate AJAX effettuate tramite jQuery. Questo interagisce male con altri codici in esecuzione sulla pagina. Molto pericoloso – usr

51

Probabilmente meglio passare in con il parametro sorgente piuttosto che impostare a livello globale in questo modo:

$("#input").autocomplete({ 
    source: function (request, response) { 
     $.post("/AjaxPostURL", request, response); 
    } 
}); 
+0

Ecco una versione più completa di $ .post con dati aggiuntivi passati: $(function() { \t \t var options = { \t \t \t \t \t \t \t url: "/web/ajax.php?a=query-save-projects&w=app", \t \t \t \t type: 'post', \t \t \t \t data: { \t \t \t \t \t "args":$().crypt({method:"b64enc",source:JSON.stringify(_system) }), \t \t \t \t \t "url":document.URL \t \t \t \t \t } \t \t \t \t }; \t \t $("#query-save-project-name").autocomplete({ \t \t \t \t \t source: function (request, response) { $.post(options["url"], options["data"], response, "json") }, \t \t \t \t \t minLength: 2 \t \t \t \t \t }); \t \t }); mshaffer

+0

Si interrompe se una delle richieste non riesce. In tal caso, 'response' non viene mai chiamato quale interruzione del plug-in di completamento automatico. Altrimenti questo è l'approccio corretto. – usr

1

E 'davvero una cattiva idea quella di modificare il codice sorgente, perché perderai le modifiche sul prossimo aggiornamento del widget. È meglio impostare il tipo globale su "post" o passare un oggetto richiesta/risposta.

+0

L'esecuzione di un'impostazione POST globale modifica * tutte * le chiamate AJAX effettuate tramite jQuery. Questo interagisce male con altri codici in esecuzione sulla pagina. Molto pericoloso – usr

-1

Ho sovrascritto quella funzione nel nostro file JavaScript (caricata dopo l'interfaccia utente jQuery) per far sì che accetti GET/POST come un'altra opzione.

$.ui.autocomplete.prototype._initSource = function() { 
    var array, url, 
     that = this; 
    if ($.isArray(this.options.source)) { 
     array = this.options.source; 
     this.source = function(request, response) { 
      response($.ui.autocomplete.filter(array, request.term)); 
     }; 
    } else if (typeof this.options.source === "string") { 
     url = this.options.source; 
     /*added*/ var httpMethod = this.options.type ? this.options.type : 'GET'; 
     this.source = function(request, response) { 
      if (that.xhr) { 
       that.xhr.abort(); 
      } 
      that.xhr = $.ajax({ 
       url: url, 
       data: request, 
       dataType: "json", 
       /*added*/ type: httpMethod, 
       success: function(data) { 
        response(data); 
       }, 
       error: function() { 
        response([]); 
       } 
      }); 
     }; 
    } else { 
     this.source = this.options.source; 
    } 
}; 

Penso che risolve i problemi menzionati da altre persone al di sopra senza rompere ogni altra cosa:
- modificando direttamente il file UI jQuery renderebbe l'aggiornamento di jQuery UI un dolore, e vi impedisce di utilizzare le API di Google per ospitare il vostro jQuery file
- $ .ajaxSetup influisce su ogni autocomplete o chiamata ajax attraverso il nostro prodotto
- Scrivere un $ .post e passarlo come una funzione è interessante, ma molto digitazione se usi decine di autocompleti attraverso il tuo sito.

+1

Modificare la fonte significa che avrai problemi ad aggiornare alla versione successiva. – usr

+0

Fortunatamente, le funzioni in JavaScript sono modificabili, quindi non è necessario.Tuttavia, qualsiasi modifica a quella particolare funzione andrebbe persa se una nuova versione di jQuery lo avesse cambiato. Ecco perché non vorresti usare questa strategia in più delle circostanze più rare. – DrShaffopolis

Problemi correlati