我正在调用一个Web服务(使用SPServices)将我的所有项目放入一个数组中,然后在我的自动完成调用中使用该数组。它工作得很好,但我有一些问题/问题
如何拒绝用户选择不在选择列表中的值?我认为组合框可以做到这一点,但我不想将整个列表加载到页面上......这导致#2
我正在使用一个选择器列表,其中包含几千个项目(目前为几百个),从我收集的自动完成功能中,它将所有选择值加载到一个数组中然后使用从中挑选。那是对的吗?有没有更好的解决方法,所以我可以使用部分输入的单词调用Web服务,并且只对结果进行排列,而不是所有项目?这是自动完成或组合框之外的独特解决方案吗?
谢谢, 大卫
答案 0 :(得分:1)
所以这就是我做的......
在按键时,使用新术语调用我的Web服务,然后将返回的结果放入自动完成。然后缓存结果。
我还在检查用户何时继续说明指定的值包含在数组中,确保它们没有弄乱值。
function setVendorLookup() {
var term = $(this).val().toLowerCase();
if (term.length > 2) {
if (vendors.join(" ").toLowerCase().indexOf(term) == -1) { //some caching
vendors = [];
$().SPServices({
operation: "GetListItems",
listName: "Yellow Pages",
async: false,
CAMLViewFields: "<ViewFields><FieldRef Name='VENDOR_ID'/><FieldRef Name='NAME1'/><FieldRef Name='CITY'/><FieldRef Name='STATE'/></ViewFields>",
CAMLQuery: "<Query><Where><Or><Contains><FieldRef Name='VENDOR_ID' /><Value Type='Text'>" + term + "</Value></Contains>" +
"<Contains><FieldRef Name='NAME1' /><Value Type='Text'>" + term + "</Value></Contains></Or></Where></Query>",
completefunc: function (xData, Status) {
$(xData.responseXML).find("[nodeName='z:row']").each(function () {
vendors.push($(this).attr("ows_VENDOR_ID") + " - " + $(this).attr("ows_NAME1") + ", " + $(this).attr("ows_CITY") + ", " + $(this).attr("ows_STATE"));
});
}
}); //SPServices
}
$(".vendor").autocomplete({
source: vendors,
minLength: 3
});
} else
vendors = [];
}
function validate()
{
if (jQuery.inArray($(".vendor").val(), vendors) == -1) {
myAlert("Validation Error", "Please select a valid vendor");
return false;
}
}