我正在使用Jquery的Selectize标记库,这对我来说效果很好。
以下是我使用的代码。
Javascript代码:
$('#q').selectize({
plugins: ['remove_button'],
valueField: 'address',
labelField: 'address',
searchField: 'address',
create: true,
render: {
item: function(data, escape) {
return '<div>' + escape(data.address) + '</div>';
}
},
onChange: function(value) {
$(".selectize-input input[placeholder]").attr("style", "width: 100%;");
},
load: function(query, callback) {
if (!query.length) return callback();
$.ajax({
url: base_url + '/search-property-autocomplete',
type: 'POST',
dataType: 'json',
data: {
q: query,
},
error: function() {
callback();
},
success: function(res) {
console.log(res.properties);
callback(res.properties);
}
});
}
});
PHP代码:
/* API for autocomplete list of properties */
Route::post('/search-property-autocomplete', function () {
if (!empty(trim($_POST['q']))) {
$search_term = trim($_POST['q']);
// getting Suburb State and Postcode of the properties based on search
$query = Property::join('technobrave_suburbs_', function($join) {
$join->on('technobrave_properties_.suburb_id', '=', 'technobrave_suburbs_.id');
});
$query->join('technobrave_states_', function($join) {
$join->on('technobrave_properties_.state_id', '=', 'technobrave_states_.id');
});
$query->select('technobrave_properties_.*', 'technobrave_suburbs_.suburb', 'technobrave_states_.state_name');
$query->where(function($query) use ($search_term) {
$query->where('technobrave_properties_.post_code', 'LIKE', '%' . $search_term . '%');
$query->orwhere('technobrave_suburbs_.suburb', 'LIKE', '%' . $search_term . '%');
$query->orwhere('technobrave_states_.state_name', 'LIKE', '%' . $search_term . '%');
});
$data = $query->take(8)->get(); // getting maximum 8 records only
if ($data) {
foreach ($data as $current_record) {
$result[] = array(
'address' => $current_record->suburb . ' ' . $current_record->state_name . ' ' . $current_record->post_code
);
}
}
} else {
$result = [];
}
echo json_encode(array('properties' => $result));
});
正如您在上面的代码中看到的,我正在使用Ajax来填充数据并通过调用我的php函数获取记录,该函数工作正常。
现在,我想在我的所有结果的顶部添加一个项目作为超链接,例如全部清除,每次我搜索或输入我的输入框时都会出现。
如果我点击全部清除链接,则应清除下面附带的结果。
要使用Selectize提供的clearoptions()
事件,我已在我的JavaScript代码中更新了create:
:
create: function(input, callback) {
$.ajax({
url: base_url + '/search-property-autocomplete',
type: 'POST',
dataType: 'json',
data: {
q: query,
},
error: function() {
callback();
},
success: function(res) {
return callback({ address: "<a href='javascript:void(0)'>Clear All</a>" });
}
});
},
但似乎无法正常工作,因为我无法在那里看到我添加的选项。在我的结果填充后,我无法看到我的超链接。
我已经知道使用类似下面的代码会在搜索后删除我填充的记录。
$('.my-hyperlink-custom-class').on('click', function() {
control.clearOptions();
});
但我坚持将这个新项目附加或推送到我的代码中,并使用Ajax填充结果。
有人可以指导我如何实现这一目标。
答案 0 :(得分:4)
这是我写的剧本。这将使用href
更改所选javascript:;
以上的所有$(".row").click(function(){
var present = $(this).index();
console.log("present"+present)
$(this).closest('.container').find('.row').each(function(index,element){
console.log("eachindex"+$(this).index());
if($(this).index()>=present) {
}
else {
$(this).attr("href","javascript:;");
}
})
$(".row").each(function(){
$("#finalAttribute").append($(this).attr("href"));
})
})
属性,而下面的属性将保持不变。您可以根据需要对其进行修改。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<a class="row row1" href="#1">
R1
</a>
<br/>
<a class="row row2" href="#2">
R1
</a>
<br/>
<a class="row row3" href="#3">
R2
</a>
<br/>
<a class="row row4" href="#4">
R3
</a>
<br/>
<a class="row row5" href="#5">
R4
</a>
<br/>
</div>
<div id="finalAttribute">
</div>
&#13;
private void button1_Click(object sender, EventArgs e)
{
}
&#13;
答案 1 :(得分:4)
你能尝试这个方法,我相信你的问题是DOM渲染和绑定JS函数。由于元素在加载时不可用,因此元素不能通过javascript绑定。以下方法将起作用。
$('body').on('click', '.my-hyperlink-custom-class', function() {
control.clearOptions();
});
这里我已将函数绑定到body,但我再次检查目标元素是否为.my-hyperlink-custom-class。
答案 2 :(得分:3)
原谅我,我没有Selectize的经验,但我确实扫描了他们的examples并注意到了一些可能有帮助的事情:
$('#input-tags3').selectize({
plugins: ['remove_button'],
delimiter: ',',
persist: false,
create: function(input) {
return {
value: input,
text: input
}
}
});
在这个例子中,create:
有函数原型function(input)
,它只有一个参数而没有回调函数。您的代码使用以下原型:create: function(input, callback)
。从Selectize示例中,我只看到load:
使用function(input, callback)
。
我建议将create:
改为:
create: function(input) {
// append "clear all" anchor to top of search div
$("#searchDiv").append('<a href="#" class="clearAll">Clear All</a>')
// perform autocomplete AJAX
$.ajax({
url: base_url + '/search-property-autocomplete',
type: 'POST',
dataType: 'json',
data: {
q: query,
},
error: function() {
// add text
return input;
},
success: function(res) {
// TODO: do something to display the autocomplete results
// e.g. create a dropdown with autcomplete suggestions
// TODO: handle user selecting one of the suggestions
// add text
return input;
}
});
},
并填写必要的TODO
以获得您想要的功能。
HTH
答案 3 :(得分:3)
您尝试实现的目标可能略有不同。 当您选择顶部显示的添加...选项时,使用创建回调会在初始选项列表中创建新项目。这不是你想要的。
试试吧:
var $select = $('#q').selectize({
plugins: ['remove_button'],
valueField: 'address',
labelField: 'address',
searchField: 'address',
create: false,
score: function() { return function() { return 1; }; },
render: {
item: function(data, escape) {
return '<div>' + escape(data.address) + '</div>';
}
},
onChange: function(value) {
if(value == 'Clear All') {
var control = $select[0].selectize;
control.clearOptions();
}
},
load: function(query, callback) {
if (!query.length) return callback();
$.ajax({
url: base_url + '/search-property-autocomplete',
type: 'POST',
dataType: 'json',
data: {
q: query,
},
error: function() {
callback();
},
success: function(res) {
// add the clear All option on top.
res.properties.unshift({address: "Clear All" });
callback(res.properties);
}
});
}
});
这会添加一个额外的选项,并在选择时使用onChange事件清除选项。
另请注意得分选项,以便禁用默认过滤。
答案 4 :(得分:2)
非常感谢大家的帮助和支持。特别感谢@afeique提示实现此功能。
这是我最终提出的解决方案。
$('#q').selectize({
plugins: ['remove_button'],
valueField: 'address',
labelField: 'address',
searchField: 'address',
create: true,
render: {
item: function(data, escape) {
return '<div>' + escape(data.address) + '</div>';
}
},
onChange: function(value) {
$(".selectize-input input[placeholder]").attr("style", "width: 100%;");
},
load: function(query, callback) {
if (!query.length) return callback();
// Appending only if not exists
if($('.clearAllSuggestions').length == 0) {
$(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>');
}
$.ajax({
url: base_url + '/search-property-autocomplete',
type: 'POST',
dataType: 'json',
data: {
q: query,
},
error: function() {
callback();
},
success: function(res) {
console.log(res.properties);
callback(res.properties);
}
});
}
});
$('body').on('click', '.clearAllSuggestions', function() {
var $select = $('#q').selectize({});
var control = $select[0].selectize;
control.clearCache('option');
control.clearOptions();
control.refreshOptions(true);
});
我稍微修改了我的代码并将代码放在我的load
事件中以追加&#34;全部清除&#34;我的建议标签选项中的锚标签。
// Appending only if not exists
if($('.clearAllSuggestions').length == 0) {
$(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>');
}
然后,我只想清除缓存和选项,因此我将代码放在下面。
$('body').on('click', '.clearAllSuggestions', function() {
var $select = $('#q').selectize({});
var control = $select[0].selectize;
control.clearCache('option');
control.clearOptions();
control.refreshOptions(true);
});
希望这有帮助。