20

我正在使用 select2 插件(ivaynberg.github.io/select2)。我正在尝试显示一个下拉列表(选择)。它正在获取 data.php 中的所有项目作为选项。然而 select2 是一个自动完成插件,应该搜索客户端输入的搜索词,并只显示匹配的结果。目前它正在显示所有项目并且没有获得搜索结果。对不起我的语言

data.php 呼应了这一点:

[{
    "id": "1",
    "text": "item1",
    "exercise": "blah text"
  }, {
    "id": "2",
    "text": "item2"
  }
]

代码是:

$(document).ready(function () {
    $('#thisid').select2({
        minimumInputLength: 2,
        ajax: {
            url: "data.php",
            dataType: 'json',
            data: function (term, page) {
                return {
                    q: term
                  };
            },
            results: function (data, page) {
                return {
                    results: data
                };
            }
        }
    });
});

输入是:

<input type="hidden" id="thisid" style="width:300px" class="input-xlarge" />

我想找到一个线索,我对这个插件很陌生,并且花了一天时间查看示例。

4

6 回答 6

32

如果附加到标准select表单控件,select2 将不会执行 AJAX。它必须附加到隐藏input控件才能通过 AJAX 加载。

更新:这已在 Select2 4.0 中修复。来自预发布说明

与所有数据适配器的标准元素保持一致,<select>无需隐藏<input>元素。

它也可以在他们的示例部分的功能中看到。

于 2013-05-02T18:37:08.673 回答
9

我猜 user2315153 想要接收多个远程值,并错误地将带有 ajax 调用的 select2() 分配给 < select > 元素。

获取远程值的正确方法是使用普通的 < input > 元素,如果需要多个值,请在方法调用时通知“多个”参数。例子:

<input type="hidden" id="thisid" style="width:300px" class="input-xlarge" />
<script>
$('#thisid').select2({
        minimumInputLength: 2,
        multiple: true,
        ajax: {
              ...

< select > 元素不能用于远程值

更新:从 select2 4.0.0 开始,隐藏输入已弃用:

https://select2.github.io/announcements-4.0.html#hidden-input

这意味着:不要使用输入属性 select2 插件,而是使用 SELECT 标记。

注意:很容易从您的服务器使用任何格式的 json。只需使用“processResults”即可。

例子:

<select id='thisid' class='select2-input select2'></select>
<script>
        $("#thisid").select2({
            multiple: true,
            closeOnSelect: true,

            ajax: { 
                url: "myurl",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    return {
                      q: params.term,
                      page: params.page
                    };
                  },
                processResults: function (data, page) { //json parse
                    console.log("processing results");
                    //Transform your json here, maybe using $.map jquery method
                    return { 
                       results: yourTransformedJson
                    };
                },
                cache: (maybe)true
            }
        });
</script>
于 2014-11-18T20:16:00.767 回答
5

我尝试了代码,它运行良好。我认为您没有包含 jquery 框架或检查 js 和 css 的路径。

<!DOCTYPE html>
<html>
<head>
    <link href="select2.css" rel="stylesheet"/>
    <script src="//code.jquery.com/jquery-latest.min.js"></script>
    <script src="select2.min.js"></script>
    <script>
        $(document).ready(function() { 
            $('#thisid').select2({
                minimumInputLength: 2,
        ajax: {
            url: "data.php",
            dataType: 'json',
            data: function (term, page) {
                return {
                    q: term
                  };
            },
            results: function (data, page) {
                return {
                    results: data
                };
            }
        }
    });

        });
    </script>
</head>
<body>
    <input type="hidden" id="thisid" style="width:300px" class="input-xlarge" />

</body>
</html>
于 2013-04-24T15:49:22.053 回答
1

我认为没有必要使用隐藏的输入元素。您可以试一试,从 ajax 调用中获取纯 html 数据并设置它,然后初始化 select2 重置方法。这是代码片段

HTML

<select id="select" name="select" class="select2">
        <option value="" selected disabled>Please Select Above Field</option>
</select>

Javascript

    $.ajax({
        type: "POST",
        cache:false,
        url: YOUR_AJAX_URL,
        success: function(response)
        {
            $('#select').html(response);
        }
    });
    $('#select').select2("val","");

阿贾克斯响应:

<option value="value">Option Name</option>
.
.
.
<option value="value">Option Name</option>
于 2014-02-02T05:25:44.900 回答
0

经过大量阅读,我决定更改 select2.js 本身。

在第 2109 行将其更改为

this.focusser.attr("id", "s2id_"+this.select.context.id);

如果您的输入标签是这样

<select id="fichier">

因此,您在列表中搜索的输入标签的 id 为s2id_fichier_search

据我所知,不应该有冲突,这将允许您在同一页面上拥有多个 select2 并通过它们的事件运行您的功能(包括 .get、.post),例如。

$(function() { 
  $('#s2id_fichier_search').keyup(function() {
    console.log('Be Practical')
  })
}

所以这会像你使用

<select id="fichier" onkeyup="console.log('Be Practical')">
于 2015-01-22T14:04:25.927 回答
0

在我的情况下,旧版本的 select2 库导致了这个问题,请确保在网页中包含最新版本的 js 和 css。

于 2019-12-15T23:08:35.630 回答