2010-09-12 14 views
45

Estoy usando el autocompletado de JQuery en uno de mis formularios.¿Cómo paso un parámetro adicional al campo Autocompletar de Jquery?

La forma básica selecciona los productos de mi base de datos. Esto funciona muy bien, pero me gustaría seguir desarrollando para que solo se devuelvan los productos enviados desde un determinado código postal. Tengo el script de backend resuelto. Solo necesito averiguar la mejor manera de pasar el código postal a este script.

Así es como se ve mi formulario.

<form> 

<select id="zipcode"> 

<option value="2000">2000</option> 
<option value="3000">3000</option> 
<option value="4000">4000</option> 

</select> 

<input type="text" id="product"/> 

<input type="submit"/> 

</form> 

Y aquí es el código de jQuery:

$("#product").autocomplete 
({ 
    source:"product_auto_complete.php?postcode=" + $('#zipcode').val() +"&", 
    minLength: 2, 
    select: function(event, ui){ 

          //action 

           } 
}); 

Este código funciona hasta cierto punto. Pero solo devuelve el primer valor de código postal independientemente de qué valor se seleccione realmente. Supongo que lo que sucede es que la URL de origen está cebada en la carga de la página en lugar de cuando se cambia el menú de selección. ¿Hay alguna forma de evitar esto? ¿O hay una mejor manera en general para lograr el resultado que estoy buscando?

Respuesta

65

Es necesario utilizar un enfoque diferente para la llamada source, así:

$("#product").autocomplete({ 
    source: function(request, response) { 
    $.getJSON("product_auto_complete.php", { postcode: $('#zipcode').val() }, 
       response); 
    }, 
    minLength: 2, 
    select: function(event, ui){ 
    //action 
    } 
}); 

Este formato permite pasar cualquiera que sea el valor es cuando se ejecuta, en contraposición a cuando es obligado.

+0

Hmmm. Parece que no puedo hacer que funcione usando este método. Aunque sería genial si pudiera, ya que parece una forma más elegante de abordar el problema. ¿Los datos JSON deben estructurarse de manera diferente? ¿Todavía uso $ _GET ['postcode'] && $ _GET ['term'] en mi archivo fuente? – matt

+12

@matt - Simplemente usará '$ _GET ['postcode']' con el código anterior ... si quiere un término allí, agréguelo usando el argumento de datos: '{term: request. término, código postal: $ ('# zipcode').val()} ' –

+1

@Nick Todavía tiene problemas para que funcione. Hice el cambio, pero la autocompleta no se materializa. Jquery es muy nuevo para mí, así que no estoy seguro de cómo depurarlo, pero parece evitar que todo el código de mi archivo javascript funcione. No estoy seguro de lo que podría estar fuera de lugar, pero el "request.term" es nuevo para mí. Solo para aclarar, este es el "término" que crea autocompletar a medida que escribe, ¿no? – matt

5

Creo que tiene razón al pensar que su llamada al $("#product").autocomplete está activando la carga de la página. Tal vez se puede asignar un controlador onchange() para el menú de selección:

$("#zipcode").change(resetAutocomplete); 

y lo han invalidar la llamada #product autocompletar() y crear una nueva.

function resetAutocomplete() { 
    $("#product").autocomplete("destroy"); 
    $("#product").autocomplete({ 
     source:"product_auto_complete.php?postcode=" + $('#zipcode').val(), 
     minLength: 2, 
     select: function(event, ui){... } 
    }); 
} 

Es posible que desee que su resetAutocomplete() para ser un poco más inteligente - como la comprobación de si el código postal realidad es diferente del último valor - para guardar un par de llamadas del servidor.

+0

Destruyendo el widget de autocompletar y recreando es * tremendamente * derrochador, se debe utilizar el argumento 'source' como estaba previsto ... –

+0

El parámetro de fuente @NickCraver no funciona para mí :( – Footniko

+0

@Footniko on cargada, necesito volver a crearla para cambiar los valores, ¡estoy usando un extraParams y no actualiza su valor sin hacer esto! – Cirelli94

3

Esto funciona para mí. Anular el evento search:

jQuery('#Distribuidor_provincia_nombre').autocomplete({ 
    'minLength':0, 
    'search':function(event,ui){ 
     var newUrl="/conf/general/provincias?pais="+$("#Distribuidor_pais_id").val(); 
     $(this).autocomplete("option","source",newUrl) 
    }, 
    'source':[] 
}); 
+0

Solución genial y simple para configurar los vars GET en la url de origen en el momento de la búsqueda, no en la carga de la página. Mucho más fácil de leer que tener una llamada AJAX en la función fuente – ransomweaver

3
jQuery("#whatJob").autocomplete(ajaxURL,{ 
    width: 260, 
    matchContains: true, 
    selectFirst: false, 
    minChars: 2, 
    extraParams: { //to pass extra parameter in ajax file. 
     "auto_dealer": "yes", 
    }, 
}); 
+1

Ahora se llama solo params. params: {"auto_dealer": "yes"}, – rothschild86

22

Esto no es para los hombres complicados:

$(document).ready(function() { 
src = 'http://domain.com/index.php'; 

// Load the cities straight from the server, passing the country as an extra param 
$("#city_id").autocomplete({ 
    source: function(request, response) { 
     $.ajax({ 
      url: src, 
      dataType: "json", 
      data: { 
       term : request.term, 
       country_id : $("#country_id").val() 
      }, 
      success: function(data) { 
       response(data); 
      } 
     }); 
    }, 
    min_length: 3, 
    delay: 300 
}); 
}); 
0
$('#txtCropname').autocomplete('Handler/CropSearch.ashx', { 
    extraParams: { 
     test: 'new' 
    } 
}); 
0
$('#product').setOptions({ 
    extraParams: { 
     extra_parameter_name_to_send: function(){ 
      return $("#source_of_extra_parameter_name").val(); 
     } 
    } 
}) 
Cuestiones relacionadas