15

我正在使用来自http://ivaynberg.github.io/select2/的 select 2 示例 我在此页面中使用“加载远程数据”示例。

问题:只要我输入一个字母,系统就会进行 ajax 调用。我想在这个请求期间引入 1 秒的延迟,这将允许用户输入他的搜索字符串。

我正在从网站添加代码。请让我知道如何引入延迟。

("#e6").select2({
            placeholder: "Search for a movie",
            minimumInputLength: 1,
            ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
                url: "http://api.rottentomatoes.com/api/public/v1.0/movies.json",
                dataType: 'jsonp',
                data: function (term, page) {
                    return {
                        q: term, // search term
                        page_limit: 10,
                        apikey: "ju6z9mjyajq2djue3gbvv26t" // please do not use so this example keeps working
                    };
                },
                results: function (data, page) { // parse the results into the format expected by Select2.
                    // since we are using custom formatting functions we do not need to alter remote JSON data
                    return {results: data.movies};
                }
            },
            initSelection: function(element, callback) {
                // the input tag has a value attribute preloaded that points to a preselected movie's id
                // this function resolves that id attribute to an object that select2 can render
                // using its formatResult renderer - that way the movie name is shown preselected
                var id=$(element).val();
                if (id!=="") {
                    $.ajax("http://api.rottentomatoes.com/api/public/v1.0/movies/"+id+".json", {
                        data: {
                            apikey: "ju6z9mjyajq2djue3gbvv26t"
                        },
                        dataType: "jsonp"
                    }).done(function(data) { callback(data); });
                }
            },
            formatResult: movieFormatResult, // omitted for brevity, see the source of this page
            formatSelection: movieFormatSelection,  // omitted for brevity, see the source of this page
            dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
            escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
        });
4

4 回答 4

25

我猜 quietMillis 属性在 select2 的较新版本中被更改为延迟:

https://select2.org/data-sources/ajax#rate-limiting-requests

$('select').select2({
  ajax: {
    url: '/example/api',
    delay: 250
  }
});
于 2015-11-29T06:55:07.843 回答
15

您的问题的答案在您向我们指出的实际示例中:

ajax: {
    url: "http://api.rottentomatoes.com/api/public/v1.0/movies.json",
    dataType: 'jsonp',
    quietMillis: 100, // <----------- HERE change it to 1000
    data: function (term, page) {
        return {
            q: term, //search term
            page_limit: 10,
            page: page,
            apikey: "ju6z9mjyajq2djue3gbvv26"
        };
    },
    results: function (data, page) {
        var more = (page * 10) < data.total;
        return {results: data.movies, more: more};
    }
},

quietMillis正如文档所说,只需将其更改为更大的东西:

quietMillis - 在发出 ajax 请求之前等待用户停止输入的毫秒数

于 2013-08-11T19:17:53.210 回答
0

使用像underscore.js这样的实用工具可以让您使用一些很酷的功能,比如debounce

这正好解决了你的问题。debounce将推迟其执行,直到等待毫秒。您可以在下划线文档中找到更多信息

于 2013-08-11T17:59:37.557 回答
-1

您可以使用 setTimeout 功能:

var timer;
...
        initSelection: function(element, callback) {
            clearTimeout(timer);
            var id=$(element).val();
            timer = setTimeout(function() {
                if (id!=="") {
                    $.ajax("http://api.rottentomatoes.com/api/public/v1.0/movies/"+id+".json", {
                        data: {
                            apikey: "ju6z9mjyajq2djue3gbvv26t"
                        },
                        dataType: "jsonp"
                    }).done(function(data) { callback(data); });
                }
            }, 1000);
        },
于 2013-08-11T18:00:02.640 回答