【发布时间】:2021-10-26 23:40:24
【问题描述】:
尝试使用 jQuery Autocomplete 呈现搜索列表,但是我的目标是,一旦将列表项附加到页面(用户选择一个项目,并且用户可以选择多个项目),用户就无法搜索相同的项目。
HTML 代码
<div id='feature-searchbar'>
<label for='feature-search'>Search for applicable features...</label>
<input id="feature-search-input" type="text" name="featureSearch-input" placeholder="Search for applicable features..." class="feature__search-input ui-autocomplete-input" autocomplete="off">
<div id='feature-results'>
//Selected items go here
</div>
</div>
现在尝试通过将一个类添加到已呈现的项目中来解决它,如果它已经存在于附加页面中。使用 jQuery,如果用户选择一个并以数据类型为目标,我将目标定位在项目将出现的页面上。告诉我的 jQuery '如果数据类型已经存在,添加一个类' 但是我似乎无法在 if 语句之外返回值。
jQuery
jQuery("#feature-search-input").autocomplete({
appendTo: "#feature-searchbar",
source: function (req, res) {
jQuery.ajax({
url: myAPI
data: {
term: jQuery("#feature-search-input").val(),
},
type: "GET",
datatype: 'json',
crossOrigin: true,
success: function (data) {
// set results to top 6 only
data.length = Math.min(data.length, 5);
var items = data;
var search_term = jQuery("#feature-search-input").val();
items.push({
label: `<?php _e('More search results for'); ?> "${ search_term }"`,
value: search_term,
more_results: true
});
res(items);
}
});
},
select: function(event, ui) {
var featureListItem = `<div class="feature-list-item" data-id="${ui.item.id}">
<input type='hidden' name='content-feature-ids[]' value='${ui.item.id}'>
<p>${ ui.item.short_desc }</p>
<a class='content-feature-remove'>Remove<a/>
</div>`;
//append to page
jQuery('#feature-results').append(featureListItem);
//removal
jQuery(".content-feature-remove").click(function (e) {
jQuery(this).parent().remove();
});
jQuery("#feature-search-input").val('');
}
}).data("ui-autocomplete")._renderItem = function( ul, item ) {
//TODO: check if item exists within feature-results, do not render it
//if item is rendered onto feature-results { add: class which tells user it has already been selected}
var item_label = '';
//need to validate items somehow so they do not get selected twice
if (item.id && item.short_desc) {
item_label = `
<div class='rendered-feature-item' data-id="${item.id}">
<p>${ item.short_desc }</p>
</div>
`;
} else {
item_label = `<strong>No Results</strong>`;
}
//need to validate items somehow so they do not get selected twice
//target the html and check if data-type is same as item.id
var existing_feature = jQuery(`#feature-results .feature-list-item[data-id="${item.id}"]`)
var existing_feature_id = 0;
var variable = '';
if (existing_feature !== undefined && existing_feature !== null) {
existing_feature_id = existing_feature.data('id');
if (existing_feature_id !== undefined && existing_feature_id !== null) {
console.log(existing_feature_id);
var potential_existing = jQuery('.rendered-feature-item[data-id="'+existing_feature_id+'"]');
var potential_existing_id = potential_existing;
return existing_feature_id;
}
return existing_feature_id;
}
//here is where I get errors, code does not recognize existing_feature_id
var potential_existing_id = existing_feature_id
var potential_existing_item = jQuery('.rendered-feature-item[data-id="'+potential_existing_id+'"]')
potential_existing_item.css('color', 'red');
return jQuery( '<li>' )
.attr( "data-value", item.id )
.append( item_label )
.appendTo( ul );
};
});
我必须运行 if 语句的原因是 id 变量作为 id 返回,但同时也作为“未定义” 目前收到一个错误,指出 未捕获的 TypeError:this._renderItem(...).data 不是函数
【问题讨论】:
-
看看这个演示:jqueryui.com/autocomplete/#multiple 这允许选择多个项目。您需要在
source中添加的是过滤掉以前选择的项目。
标签: javascript jquery jquery-ui jquery-ui-autocomplete