Jquery Chosen插件 - 通过Ajax动态填充列表
Jquery Chosen插件 - 通过Ajax动态填充列表
我正在尝试使用Chosen插件构建我的下拉菜单,用于多选。
以下是我所基于的行为:
所以,我不想在我的选择框中硬编码3个
因此,如果用户输入"car",我通过ajax调用发送这个字母,然后我会得到一个类似于以下的数组:
[{"id":"2489","name":"carrie"},{"id":"2490","name":"Caroline"},{"id":"2491","name":"Carole"}]
代码:
$(function() { $(".chzn-select").chosen(); $(".chzn-select-deselect").chosen({allow_single_deselect:true}); $('.chzn-choices input').autocomplete({ source: function( request, response ) { $.ajax({ url: "/change/name/autocomplete/"+request.term+"/", dataType: "json", success: function( data ) { response( $.map( data, function( item ) { $('ul.chzn-results').append('
结果:
我输入"car",在下拉菜单中得到"未找到car的结果",然后我得到了所有我想要的结果。
1. 为什么我会得到"未找到结果"的消息,因为我可以在我的json数组和列表中看到我得到了结果。
-----------------------------
当我删除"car"并输入"sam"时,"sam"的结果会显示在"car"的结果之后。(基本上,我同时看到了两个结果,而不仅仅是我当前搜索的结果)
2. 我是否应该在keyUp时清除ul?我认为插件已经做到了这一点
-----------------------------
当我点击一个名字来实际选择它并将其添加到选择框中时,我在chosen.js文件中得到一个javascript错误
item is undefined
"item.selected = true;" line 732
插件的链接:
http://harvesthq.github.com/chosen/chosen/chosen.jquery.js
它没有在选择框中添加任何内容。
3. 不知道为什么会发生这种情况
-----------------------------
你们有任何关于我做错了什么的想法吗?我完全陷入了困境...!
哦,顺便说一下,我不介意改变插件源代码,因为这是我唯一使用它的地方...
问题的出现原因是因为之前的解决方法已经无效,需要更新使用新的方法。解决方法是使用新的方法代替已经过时的"success"事件,使用.done()方法来处理Ajax的响应。代码中使用了JQuery Chosen插件来动态地通过Ajax填充列表。具体的解决方法是在源URL中添加请求的term,然后将返回的数据映射为option元素添加到选择输入字段的select元素中,并通过.trigger("chosen:updated")方法更新Chosen插件。
其中$("#CHOSEN_INPUT_FIELDID")
是一个输入字段的ID。它是你在使用Chosen插件时使用的
文章整理如下:
Ashirvad的解答已经不再适用。请注意类名的更改,并使用option元素代替li元素。我已经更新了我的解答,不再使用已弃用的"success"事件,而是选择使用.done()方法:
$('.chosen-search input').autocomplete({ minLength: 3, source: function( request, response ) { $.ajax({ url: "/some/autocomplete/url/"+request.term, dataType: "json", beforeSend: function(){ $('ul.chosen-results').empty(); $("#CHOSEN_INPUT_FIELDID").empty(); } }).done(function( data ) { response( $.map( data, function( item ) { $('#CHOSEN_INPUT_FIELDID').append('<option value="blah">' + item.name + '</option>'); })); $("#CHOSEN_INPUT_FIELDID").trigger("chosen:updated"); }); } });
$("#CHOSEN_INPUT_FIELDID")
- 这是什么字段?我没有带有ID的输入字段。
这是你在使用Chosen插件时所使用的
问题的出现原因是使用了错误的类名来选择元素,导致无法正确找到要操作的元素。解决方法是将代码中的类名"chzn-results"替换为"chosen-results"。
尝试以下代码:
$('.chzn-choices input').autocomplete({ source: function( request, response ) { $.ajax({ url: "/change/name/autocomplete/"+request.term+"/", dataType: "json", beforeSend: function(){$('ul.chzn-results').empty();}, success: function( data ) { response( $.map( data, function( item ) { $('ul.chzn-results').append('
是的,这种方式干净地解决了我的第二个问题。谢谢!那么,你对于第三个问题有什么想法吗?插件自身内部的 JavaScript 错误是怎么回事?
嘿,我觉得问题不在插件上。这里的问题是item未定义。你能告诉我你何时使用autocomplete,何时使用chosen吗?
你是什么意思?我在autocomplete上使用了chosen $('.chzn-choices input').autocomplete({,并在文档加载完成后实现了chosen $(function() { $(".chzn-select").chosen(); 我在上面贴出了全部代码。
我不明白为什么这个回答被接受。这对你真的有效吗?chosen库抛出了以下异常"Cannot call method 'lastIndexOf' of undefined"。
新版本将类名从"chzn-results"改为"chosen-results"。
当选择一个选项时,这会给我一个"Uncaught TypeError: Cannot read property 'substr' of undefined"的错误。
原因:问题的出现是因为回答者提到了另一个插件Select2,而不是直接回答问题关于Jquery Chosen插件如何通过Ajax动态填充列表的方法。
解决方法:回答者应该直接回答问题并提供关于Jquery Chosen插件如何通过Ajax动态填充列表的方法,而不是提到另一个插件。如果有必要,可以在评论中提及其他插件作为替代方案。
以下是一种可能的解决方法:
// 创建一个空的下拉列表 var select = $(""); // 发送Ajax请求获取数据 $.ajax({ url: "your-api-url", method: "GET", success: function(response) { // 遍历数据并添加到下拉列表中 for(var i = 0; i < response.length; i++) { var option = $("").text(response[i].name).val(response[i].id); select.append(option); } // 将下拉列表添加到页面中的某个元素中 $("#your-element").append(select); // 初始化Chosen插件 select.chosen(); }, error: function() { // 处理错误情况 } });
以上代码会发送一个Ajax请求到指定的API URL,并在成功响应后遍历数据并将其添加到一个空的下拉列表中。然后,将该下拉列表添加到页面中的指定元素中,并使用Chosen插件对其进行初始化。
希望这个解决方法能够帮助到你。