jquery autocomplete実装(自動充填および連選)
最近はプロジェクトでjquery autocompleteを使っているので、使い勝手がいいと思います.主に高速自動充填を解決し、連選問題も解決できます.たとえば、国を選択し、選択領域を特定するという問題があります.
まずjqueryとautocompleteパッケージがあります.添付ファイルに添付してあります.
ページは次のとおりです.
search.flt
注意inputにはautocomplete=「on」属性があります.この属性は重要です.2つのパラメータをクエリーする必要がある場合は、autocompleteにパラメータを渡す必要があります.これは、パラメータを持つことを許可することを意味します.当初はこの項目を無視していましたが、autocompleteはデフォルトでパラメータを持っていて、actionで「q」で受信します.これは死んだと書かれています.たとえばinputボックスに「china」と入力すると、actionに伝わるqはchinaに等しい.
しかし、ビジネスは常に変化します.例えば、countryが選択し、regionを選択する場合、このregionはcountry idに基づいて領域の範囲を制限する必要があります.このときregionをクエリーする2つのパラメータがあります.1つはあなたが入力したパラメータで、1つはcountry idです.このときautocompleteはq 1個では足りません.Autocompleteはパラメータを設定するためにこのextraParams:{}を選択しなければならないが、ページがロードされると、このパラメータは変更できず、静的なパラメータをロードするためにしか使用できないようだ.
country.js
country inputボックスに国を入力すると、autocompleteCountryNameメソッドが自動的にトリガーされ、action findCountryメソッドが動的に呼び出されます.
Action
このactionはリストをループ出力するページを返します
struts.xml
hotelconfigforselect.ftl
見てみようjs
このコード:
彼はパラメータを割り当てに来たのです.国を選択するとcountryIdが生成され、countryIdが領域autocompleteに付与され、領域が再クエリされるとactionでこのcountryIdが得られます.アクションでString countryIdを定義します.このcountryIdを得ることができます.
selectItemForCountry(li)メソッドは、国を循環してリストを取得し、必要なデータを処理することです.
ここでftlページでLIST autocompleteをループすると自動的にliタグが付けられます.
そして私たちはこのliラベルを通じて私たちのデータを得ることができます.
まずjqueryとautocompleteパッケージがあります.添付ファイルに添付してあります.
ページは次のとおりです.
search.flt
<tr>
<td> :</td>
<td align="left">
<input type="text" id="country" autocomplete="on"/>
<input type="hidden" id="countryId" name="conditions.country.value"/>
</td>
<td> :</td>
<input type="text" id="region" autocomplete="on">
<input type="hidden" id="regionId" name="conditions.region.value" >
</td>
</tr>
注意inputにはautocomplete=「on」属性があります.この属性は重要です.2つのパラメータをクエリーする必要がある場合は、autocompleteにパラメータを渡す必要があります.これは、パラメータを持つことを許可することを意味します.当初はこの項目を無視していましたが、autocompleteはデフォルトでパラメータを持っていて、actionで「q」で受信します.これは死んだと書かれています.たとえばinputボックスに「china」と入力すると、actionに伝わるqはchinaに等しい.
しかし、ビジネスは常に変化します.例えば、countryが選択し、regionを選択する場合、このregionはcountry idに基づいて領域の範囲を制限する必要があります.このときregionをクエリーする2つのパラメータがあります.1つはあなたが入力したパラメータで、1つはcountry idです.このときautocompleteはq 1個では足りません.Autocompleteはパラメータを設定するためにこのextraParams:{}を選択しなければならないが、ページがロードされると、このパラメータは変更できず、静的なパラメータをロードするためにしか使用できないようだ.
country.js
$(document).ready(function() {
autocompleteCountryName($("#country"));
});
function autocompleteCountryName(obj, callBackFn) {
$(obj).autocomplete(
".." + "/hotelconfig/findCountry.action",
{
delay:200,
minChars:2,
matchSubset:1,
matchContains:1,
cacheLength:1,
onItemSelect:callBackFn || selectItemForCountry,
formatItem:formatItem,
maxItemsToShow:20,
width:300,
autoFill:false
});
}
function selectItemForCountry(li) {
var $span = $("span:first", li);
var id = $span.text();
var name = $span.next().text();
$("#countryId").val(id);
$("#country").val(name);
var completer = document.getElementById("region").autocompleter;
completer.setExtraParams({"countryId" : $("#countryId").val()});
completer.flushCache();
}
function formatItem(row) {
return row[0];
}
country inputボックスに国を入力すると、autocompleteCountryNameメソッドが自動的にトリガーされ、action findCountryメソッドが動的に呼び出されます.
Action
...
private q;
private List<HotelConfigCondition> hotelConfigConditions = new ArrayList<HotelConfigCondition>();
public void findCountry(){
hotelConfigConditions = service.findCountrys(q);
.....
return SUCCESS
}
このactionはリストをループ出力するページを返します
struts.xml
<action name="findCountry" class="...HotelConfigByProviderAction" method="findCountry">
<result name="success">/pages/hotelconfigbyprovider/hotelconfigforselect.ftl</result>
</action>
hotelconfigforselect.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<@s.iterator value="hotelConfigConditions">
<span style="display:none;"><@s.property value="id"/></span><span><@s.property value="name"/></span>
</@s.iterator>
見てみようjs
このコード:
var completer = document.getElementById("region").autocompleter;
completer.setExtraParams({"countryId" : $("#countryId").val()});
completer.flushCache()
彼はパラメータを割り当てに来たのです.国を選択するとcountryIdが生成され、countryIdが領域autocompleteに付与され、領域が再クエリされるとactionでこのcountryIdが得られます.アクションでString countryIdを定義します.このcountryIdを得ることができます.
selectItemForCountry(li)メソッドは、国を循環してリストを取得し、必要なデータを処理することです.
ここでftlページでLIST autocompleteをループすると自動的にliタグが付けられます.
そして私たちはこのliラベルを通じて私たちのデータを得ることができます.