2009-10-03 9 views
18

¿Hay alguna manera de establecer el método de envío HTTP Autocompletar de Jquery en POST en lugar de GET?¿Cómo configuro JQuery Autocompletar en POST en lugar de GET?

+0

También puede cambiar MVC para permitir GET. Consulte http://stackoverflow.com/questions/2350921/asp-net-mvc-2-failed-with-jquery-ajax-response#2350957 – Daveo

+0

@Daveo: es cierto, pero debemos tener cuidado al desactivar una característica que era destinado a protegernos de los exploits de vulnerabilidad del navegador. – StriplingWarrior

+2

Posiblemente de interés: una solicitud de función (http://bugs.jqueryui.com/ticket/5353) y una explicación de por qué fue rechazada (http://forum.jquery.com/topic/jqueryui-autocomplete-post -option-for-remote-request # 14737000002084408). – StriplingWarrior

Respuesta

6

Desafortunadamente, no hay opción para el autocompletador que le permita configurar eso. Sin embargo, hay un lugar único en el código del complemento donde se llama a la función $.ajax. No se ha especificado la opción type, lo que significa que se establecerá de manera predeterminada en una solicitud GET. Se podría modificar el $.ajax llamada (que comienza en la línea 361 de la última versión) para incluir una opción type y establezca su valor en "post":

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

La modificación de la fuente significa que tendrá problemas para actualizar a la próxima versión. – usr

+0

Además, la documentación dice que 'type:" POST "' es obligatorio. Probablemente, ambos funcionan, pero la minúscula es mala. – usr

13

Puede utilizar el

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

antes la llamada para autocompletar, y anulará la llamada ajax en la página.

+0

Esto modifica * todas * las llamadas AJAX realizadas a través de jQuery. Esto interactúa mal con otro código que se ejecuta en la página. Altamente peligroso. – usr

51

Probablemente mejor para pasarlo con el parámetro de origen en lugar de establecer de forma global como esto:

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

Aquí hay una versión más completa de $ .post con datos adicionales que se pasan: $(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

Esto se rompe si una de las solicitudes falla. En ese caso, nunca se llama 'response', lo que rompe el complemento de autocompletar. De lo contrario, este es el enfoque correcto. – usr

1

Es una muy mala idea de editar el código fuente, porque si no se pierden los cambios en la próxima actualización del widget. Es mejor configurar el tipo global para "publicar" o pasar un objeto de solicitud/respuesta.

+0

Hacer una configuración POST global modifica * todas * las llamadas AJAX realizadas a través de jQuery. Esto interactúa mal con otro código que se ejecuta en la página. Altamente peligroso. – usr

-1

Sobreescribí esa función en nuestro archivo JavaScript (cargado después de la interfaz de usuario jQuery) para que acepte GET/POST como otra opción.

$.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; 
    } 
}; 

Creo que resuelve los problemas mencionados por otras personas anteriormente sin romper cualquier otra cosa:
- Edición del archivo de interfaz de usuario jQuery directamente haría que la actualización jQuery UI un dolor, y evitar que utilice las API de Google para alojar su jQuery archivos
- $ .ajaxSetup afectaría cada llamada de autocompletado o ajax en nuestro producto
- Escribir un $ .post y pasarlo como una función es genial, pero un montón de tipeo si usa docenas de autocompletas en su sitio.

+1

La modificación de la fuente significa que tendrá problemas para actualizar a la próxima versión. – usr

+0

Afortunadamente, las funciones en JavaScript son mutables, por lo que no es necesario.Pero cualquier cambio en esa función en particular se perderá si una nueva versión de jQuery lo cambiara. Por eso no querrás usar esta estrategia en más que las circunstancias más raras. – DrShaffopolis

Cuestiones relacionadas