顺序自动完成

问题描述:

考虑下表:顺序自动完成

<table> 
    <tr> 
     <th>Country</th> 
     <th>State/Province</th> 
     <th>City</th> 
    </tr> 
    <tr> 
     <td><input name="country_1" value="" /></td> 
     <td><input name="stateProv_1" value="" /></td> 
     <td><input name="city_1" value="" /></td> 
    </tr> 
    <tr> 
     <td><input name="country_n" value="" /></td> 
     <td><input name="stateProv_n" value="" /></td> 
     <td><input name="city_n" value="" /></td> 
    </tr> 
    ... 
</table> 

我想用jQuery UI Autocomplete来帮助我的用户输入的数据。 country_1的值用于选择stateProv_1的可能值用于选择city_1的可能值。

这种顺序自动完成的解释很好by this Q&A

我的问题涉及到jQuery位本身:我必须为每个输入标签调用自动完成代码吗?

$("country_1").autocomplete({ ... }); 
$("stateProv_1").autocomplete({ ... }); 
$("city_1").autocomplete({ ... }); 
... 
$("country_n").autocomplete({ ... }); 
$("stateProv_n").autocomplete({ ... }); 
$("city_n").autocomplete({ ... }); 

还是有每个型自动完成的(国家,StateProv,市)来监视其所有输入的方式吗?

n根据用户上下文而变化。

您可能需要重复它的3种类型,而不是为3种类型的X n次

$('input[name^="country_"]').autocomplete({ ... }); 
$('input[name^="stateProv_"]').autocomplete({ ... }); 
$('input[name^="city_"]').autocomplete({ ... }); 

您可以使用this.element源函数里面做这

喜欢的东西

$('input[name^="stateProv_"]').autocomplete({ 
    source: function(request, term){ 
     console.log(request, this.element); 
     var name = this.element.attr('name'); 
     var idx = name.substring(10); 
     var elcountry = $('input[name="country_' + idx + '"]'); 
     console.log(idx, 'c', elcountry.val()) 
    } 
}) 

演示:Fiddle

+0

请参阅我对Dipesh的评论。 – Drew 2013-03-20 03:32:11

+0

你正在使用'source'函数不是吗? – 2013-03-20 03:32:54

+0

@AndrewHeath看到我的更新 – 2013-03-20 03:42:31

可以监视所有输入:

$("input").autocomplete({ ... }); 

可以使用classinput,然后应用到auto-completeclass

HTML

<td><input class="makemeauto" name="country_1" value="" /></td> 
<td><input class="makemeauto" name="stateProv_1" value="" /></td> 
<td><input class="makemeauto" name="city_1" value="" /></td> 

jQuery的

$(".makemeauto").autocomplete({ ... }); 

评论响应

您需要单独调用autocomplete每个元素:

<td><input class="makemeauto" name="country_1" value="" data-autocomplete-source ="source_country"/></td> 
<td><input class="makemeauto" name="stateProv_1" value="" data-autocomplete-source ="source_stateProy"/></td> 
<td><input class="makemeauto" name="city_1" value="" data-autocomplete-source ="source_city" /></td> 


$('input.makemeauto').each(function() 
{ 
    $(this).autocomplete({ 
     source: $(this).data('autocomplete-source') 
    }); 
}); 
+0

怎么那么你限制'stateProv_2'的自动完成查询,仅做一个开关使用'country_2'中的值? – Drew 2013-03-20 03:30:17

+0

@AndrewHeath你可以使用'switch'或'if'来获取当前正在访问哪个'textbox',并根据该请求发出'request'。 – 2013-03-20 03:33:48

+0

@AndrewHeath看到我的更新答案,这将有所帮助。 – 2013-03-20 03:39:32

您可以使用1个功能来更新自动填充。也许给每个类型的输入一个类。

<td><input class="country" name="country_n" value="" /></td> 
     <td><input class="state" name="stateProv_n" value="" /></td> 
     <td><input class="city" name="city_n" value="" /></td> 

$(function(){ 
    $(".country").change(countryChanged); 
    $(".state").change(stateChanged); 
}); 

function countryChange(){ 
    var $countryInput = $(this); 
    var $stateInput = $countryInput.parent().next().children(".state"); 
    $stateInput.autocomplete({}); 
} 
function stateChange(){ 
    //similar code sequence 
} 

你也可以拥有1个功能与确定取决于它是否是一个国家或国家等