Jquery 在 Ajax 的选项顶部选择添加 "Clear All" link
Jquery Selectize Add "Clear All" link at the top of options from Ajax
我正在使用 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 函数来获取记录,该函数工作得非常好。
现在,我想在所有结果的顶部附加一个项目作为 hyperlink,例如 Clear All,每次我搜索时都会出现或输入我的输入框。
如果我点击全部清除 link,下面附加的结果应该被清除。
为了使用 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>" });
}
});
},
但它似乎不起作用,因为我在那里看不到我添加的选项。结果填充后,我无法看到我的 Hyperlink。
我已经知道使用类似下面的代码会在我搜索后删除我填充的记录。
$('.my-hyperlink-custom-class').on('click', function() {
control.clearOptions();
});
但是我无法使用 Ajax.
填充的结果将这个新项目附加或推送到我的代码中
有人可以指导我如何实现这一目标。
这是我写的脚本。这将使用 javascript:;
更改所选属性上方的所有 href
属性,而下方的属性将保留 same.You 可以根据您的需要进行修改。
$(".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>
请原谅,我没有使用 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
您可以通过稍微不同的方式来实现您想要实现的目标。
使用 create 回调将创建不在初始选项列表中的新项目,当您 select add ... option显示在顶部。这不是你想要的。
试一试:
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);
}
});
}
});
这会添加一个额外的选项,并在 selected 时使用 onChange 事件清除选项。
还要注意 score 选项,以便禁用默认过滤。
你能试试这个方法吗,我相信你的问题是 DOM 渲染和绑定 JS 函数。由于该元素在加载时不可用,因此该元素无法与 javascript 绑定。以下方法将起作用。
$('body').on('click', '.my-hyperlink-custom-class', function() {
control.clearOptions();
});
这里我已经将函数绑定到 body,但是我再次检查目标元素是否是 .my-hyperlink-custom-class。
非常感谢大家的帮助和支持。特别感谢 的提示以实现此功能。
这是我最终想出的解决方案。
$('#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
事件中添加了下面的代码,以便在我的建议标签选项中附加 "Clear All" 锚标签。
// 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);
});
希望对您有所帮助。
我正在使用 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 函数来获取记录,该函数工作得非常好。
现在,我想在所有结果的顶部附加一个项目作为 hyperlink,例如 Clear All,每次我搜索时都会出现或输入我的输入框。
如果我点击全部清除 link,下面附加的结果应该被清除。
为了使用 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>" });
}
});
},
但它似乎不起作用,因为我在那里看不到我添加的选项。结果填充后,我无法看到我的 Hyperlink。
我已经知道使用类似下面的代码会在我搜索后删除我填充的记录。
$('.my-hyperlink-custom-class').on('click', function() {
control.clearOptions();
});
但是我无法使用 Ajax.
填充的结果将这个新项目附加或推送到我的代码中有人可以指导我如何实现这一目标。
这是我写的脚本。这将使用 javascript:;
更改所选属性上方的所有 href
属性,而下方的属性将保留 same.You 可以根据您的需要进行修改。
$(".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>
请原谅,我没有使用 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
您可以通过稍微不同的方式来实现您想要实现的目标。 使用 create 回调将创建不在初始选项列表中的新项目,当您 select add ... option显示在顶部。这不是你想要的。
试一试:
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);
}
});
}
});
这会添加一个额外的选项,并在 selected 时使用 onChange 事件清除选项。
还要注意 score 选项,以便禁用默认过滤。
你能试试这个方法吗,我相信你的问题是 DOM 渲染和绑定 JS 函数。由于该元素在加载时不可用,因此该元素无法与 javascript 绑定。以下方法将起作用。
$('body').on('click', '.my-hyperlink-custom-class', function() {
control.clearOptions();
});
这里我已经将函数绑定到 body,但是我再次检查目标元素是否是 .my-hyperlink-custom-class。
非常感谢大家的帮助和支持。特别感谢
这是我最终想出的解决方案。
$('#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
事件中添加了下面的代码,以便在我的建议标签选项中附加 "Clear All" 锚标签。
// 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);
});
希望对您有所帮助。