将多个Select2链接在一起
Chaining multiple Select2 together
尝试使用select2插件使两个链接自动填充选择字段第一个选择包含国家名称(静态选择),第二个选择显示从第一个选择中选择的国家的状态。我的代码是
<select id="country" name="country" size="1" class=" form-control">
<option></option>
<option value="1">USA</option>
<option value="2">Untied Kingdom</option>
<option value="3">France</option>
etc........
</select>
<select id="states" name="states" size="1" class="form-control">
<option></option>
</select>
JavaScript代码
$(document).ready(function() {
$('#country').select2({
placeholder: 'Select Country',
allowClear: true
});
$('#state').select2({
placeholder: 'Select State',
allowClear: true
});
$('#country').change(function() {
var selectedCountries = $('#countryoption:selected').val();
var selectedCountries = 'id='+ selectedCountries;
$.ajax({
type: 'POST',
url: 'http://localhost/CodeIgniter/countries/get_state/',
dataType: 'html',
data: selectedCountries,
}).done( function( data ) {
data = $.map(data, function(item) {
return { id: item.id, text: item.name };
});
$('#state').select2({
data: data
});
}
})
});
});
JSON中返回的结果
{"id":"1","text":"Chigaco"}{"id":"4","text":"Albama"}{"id":"2","text":"Tulsa"} etc...........
我搜索了很多例子来帮助我,但没有工作的权利,我所需要的是显示国家的国家选择在第一个选择,并将其传递给第二个选择知道我使用的是select2 v4.0和jquery v2
可以用与标准<select>
相同的方式链接Select2。因此,这意味着当第一个选择的值被链接时,第二个选择被重置(通常为占位符),并且选项通常也会更改。
对于如何使用Select2完成此操作,您有两个选项:
-
在值变化时预加载第二个
<select>
的选项,并让Select2处理本地搜索。这将类似于你目前试图做到这一点,但可能会遇到问题,当有大量的选项可以在第二个<select>
中选择。在你的例子中,不应该有成千上万的"状态"。(对于任何程度的状态)在一个国家内,所以本地搜索应该不是太大的问题。
-
使用Select2的AJAX功能,并根据第一个
<select>
的值传递一个不同的参数作为url
。这要求您有一个动态端点,它可以处理为第二次选择检索条目,并在搜索时过滤它们,因此这并不总是可行的。如果您已经有这样一个支持过滤的端点,这是一个响应更快的选项,因为用户不必等待所有选项都被检索到,然后才能从第二个
<select>
中选择一个选项。
你选择什么选项很大程度上取决于你已经设置了什么,你正在处理的数据集的大小(Select2不能很好地处理数千个选项),以及你想要提供的用户体验。
第一个选项的代码类似于
$("#first").select2({
placeholder: 'Select a number range'
});
$("#second").select2({
placeholder: 'Select a number'
});
$("#first").on("change", function () {
$("#second option[value]").remove();
var newOptions = []; // the result of your JSON request
$("#second").append(newOptions).val("").trigger("change");
});
可以在以下jsbin中进行测试,使用数字范围而不是国家和州:http://jsbin.com/wigalivapi/1/edit?html,output
请注意,虽然与您使用的代码类似,但有一些小的区别可能会引起您的注意。当您真正期望
dataType: "json"
时,您设置了dataType: "html"
。您在响应中返回JSON,而不是HTML。您在第二次呼叫
.select2({data:[]})
之前没有清除<select>
。Select2不会自动删除它与data
一起生成的<option>
标签,因此您需要自己完成。当您更改
<select>
的值时,您永远不会告诉Select2。您需要在更改第二个<select>
后重新触发change
事件。您在问题中提供的JSON似乎无效。现在我不确定这是否只是因为你给它作为一个例子,但我会检查你的JSON响应与JSONLint只是为了确保它是有效的。
第二个选项的代码类似于
$("#first").select2({
placeholder: 'Select a number range'
});
$("#second").select2({
placeholder: 'Select a number',
ajax: {
url: http://localhost/CodeIgniter/countries/get_state/',
type: 'POST',
data: function (params) {
return {
id: $("#first").val(),
search: params.term
}
}
}
});
可以在下面的jsbin中进行测试,该jsbin使用一系列数字模拟响应(与另一个示例类似):http://jsbin.com/gihusohepe/1/edit?html,output
json响应中缺少逗号。
http://jsfiddle.net/jEADR/1570/var data = [{"id":"1","text":"Chigaco"},{"id":"4","text":"Albama"},{"id":"2","text":"Tulsa"}];
var data2=[];
$.map(data, function(item) {
data2.push( { id: item.id, text: item.text });
});
$('#state').select2({
data: data2
});
- JavaScript链接在点击时不起作用;函数在页面加载时工作
- 在 JavaScript 中使用侦听器将输入字段链接在一起
- 我想通过单击按钮将 2 个 php 文件链接在一起
- 如何将(CSS/HTML)的包链接在一起.CSS/HTML->CSS/HTML->CSS/HTML
- 我可以将javascript和方法中的属性链接在一起吗?
- 未定义“角度”(脚本未链接在一起)
- 使用一行将标记链接在一起:googlemapsapi
- 将承诺与多个参数链接在一起
- 如何在react中将单独文件中的组件链接在一起
- JavaScript变量毫无理由地链接在一起
- 如何将CSS、javascript和HTML文件链接在一起
- 如何使用jquery将两个元素关联/链接在一起
- 将大量(>40,000)原生承诺链接在一起会消耗太多内存
- 如何将这些函数与承诺链接在一起
- javascript数组中的对象神秘地链接在一起
- jQuery-如何将DOM元素和Javascript对象链接在一起
- AngularJS-将两个指令绑定/链接在一起
- 使用Jquery(甚至只是Javascript),了解如何将命令链接在一起
- 拥有多个日期选择器并将它们全部链接在一起
- 将多个Select2链接在一起