无法在 Select2 下拉列表中选择项目

2023-12-26

我正在开发一个使用 Select2(版本 3.5.1)的应用程序。设置此下拉/自动完成字段的 HTML 如下所示:

<input id="mySelect" class="form-control" type="hidden">

The form-control此代码片段中的类来自 Bootstrap。我使用以下命令从 JavaScript 初始化该字段:

function getItemFormat(item) {
  var format = '<div>' + item.ItemName + '</div>';
  return format;
}

$(function() {
  $('#mySelect').select2({
    minimumInputLength: 5,
    placeholder: 'Search for an item',
    allowClear: true,
    ajax: {
      url: '/api/getItems',
      dataType: 'json',
      quietMillis: 250,
      data: function (term, page) {
        return {
          query: term
        };
      },
      results: function (data, page) {
        return { results: data, id: 'ItemId', text: 'ItemText' };
      }
    },
    formatResult: getItemFormat,
    dropdownCssClass: "bigdrop",
    escapeMarkup: function (m) { return m; }
  });
});

当我的选择字段加载时,它会成功呈现。一旦我至少输入第五个字符,它就会成功从服务器中提取项目并将它们列为选项。但是,如果我尝试选择其中之一,则什么也不会发生。下拉弹出窗口保持打开状态。没有任何内容被放入实际字段中。 JavaScript 控制台中没有错误。就像我没有点击任何东西一样。

此外,我注意到当我将鼠标放在某个项目上或尝试使用箭头键导航选项列表时,没有任何内容突出显示。

我究竟做错了什么?


怎么了:

默认情况下,results您要返回的对象的ajax.results应该是这个结构中的一个数组[{id:1,text:"a"},{id:2,text:"b"}, ...].

  results: function (data, page) {
    var array = data.results; //depends on your JSON
    return { results: array };
  }

In Select2.js https://github.com/ivaynberg/select2/blob/master/select2.js它实际上指出:

* @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
*      The expected format is an object containing the following keys:
*      results array of objects that will be used as choices
*      more (optional) boolean indicating whether there are more results available
*      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}

阅读源码我们可以看到ajax.resultsAJAX 成功时调用:

   success: function (data) {
                        // TODO - replace query.page with query so users have access to term, page, etc.
                        // added query as third paramter to keep backwards compatibility
                        var results = options.results(data, query.page, query);
                        query.callback(results);
                    }

So ajax.results实际上只是一个将数据格式化为适当结构的函数(例如[{id:a,text:"a"},{id:b,text:"b"}, ...])在数据传递到之前query.callback:

 callback: this.bind(function (data) {

                    // ignore a response if the select2 has been closed before it was received
                    if (!self.opened()) return;


                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
                    self.postprocessResults(data, false, false);

                    if (data.more===true) {
                        more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
                    } else {
                        more.remove();
                    }
                    self.positionDropdown();
                    self.resultsPage = page;
                    self.context = data.context;
                    this.opts.element.trigger({ type: "select2-loaded", items: data });
                })});

还有什么query.callback最终要做的是正确设置逻辑,以便当您选择其中一项并触发时一切正常.selectChoice.

selectChoice: function (choice) {

            var selected = this.container.find(".select2-search-choice-focus");
            if (selected.length && choice && choice[0] == selected[0]) {

            } else {
                if (selected.length) {
                    this.opts.element.trigger("choice-deselected", selected);
                }
                selected.removeClass("select2-search-choice-focus");
                if (choice && choice.length) {
                    this.close();
                    choice.addClass("select2-search-choice-focus");
                    this.opts.element.trigger("choice-selected", choice);
                }
            }
        } 

因此,如果存在一些配置错误(例如results结构不正确)导致该类.select2-search-choice-focus之前不要添加到 DOM 元素.selectChoice被调用,这就是发生的事情:

下拉弹出窗口保持打开状态。没有任何内容被放入实际字段中。 JavaScript 控制台中没有错误。就像我没有点击任何东西一样。


解决方案

对此有很多解决方案。其中之一当然是在中进行一些数组键操作ajax.results.

  results: function (data, page) {
  //data = { results:[{ItemId:1,ItemText:"a"},{ItemId:2,ItemText:"b"}] };
    var array = data.results;
    var i = 0;
    while(i < array.length){
        array[i]["id"] = array[i]['ItemId'];
        array[i]["text"] = array[i]['ItemText'];
        delete array[i]["ItemId"];
        delete array[i]["ItemText"];
    i++;
    }
    return { results: array };
  }

但你可能会问:为什么数组中的id必须是“id”,text必须是“text”?

[{id:1,text:"a"},{id:2,text:"b"}] 

数组可以用这个结构吗?

[{ItemId:1,ItemText:"a"},{ItemId:2,ItemText:"b"}]

答案是肯定的。你只需要覆盖id and text具有您自己的功能的功能。


以下是原始函数.selecte2 in Select2.js https://github.com/ivaynberg/select2/blob/master/select2.js:

    id: function (e) { return e == undefined ? null : e.id; },
    text: function (e) {
      if (e && this.data && this.data.text) {
        if ($.isFunction(this.data.text)) {
          return this.data.text(e);
        } else {
          return e[this.data.text];
        }
      } else {
        return e.text;
      }
    },

要覆盖它们,只需在要传递给的对象中添加您自己的函数即可.selecte2:

$('#mySelect').select2({
id: function (item) { return item.ItemId },
text: function (item) { return item.ItemText }
......
});

Updates

还发生了什么:

但是,列表关闭后,所选项目的文本不会出现在字段中。

这意味着.selectChoice已成功执行。现在问题就出在.updateSelection。在源代码中:

   updateSelection: function (data) {

        var container=this.selection.find(".select2-chosen"), formatted, cssClass;

        this.selection.data("select2-data", data);

        container.empty();
        if (data !== null) {
            formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
        }
        if (formatted !== undefined) {
            container.append(formatted);
        }
        cssClass=this.opts.formatSelectionCssClass(data, container);
        if (cssClass !== undefined) {
            container.addClass(cssClass);
        }

        this.selection.removeClass("select2-default");

        if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
            this.container.addClass("select2-allowclear");
        }
    }

从这里我们可以看到,在将相应的文本字符串放入输入之前,它会调用formatSelection.

formatSelection: function (data, container, escapeMarkup) {
            return data ? escapeMarkup(this.text(data)) : undefined;
        },

更新:解决方案

之前我以为this.text(data)可以被覆盖text: funcion(item){ ... }在参数中,但遗憾的是它不是这样工作的。

因此,要在字段中正确呈现文本,您应该覆盖formatSelection通过做

$('#mySelect').select2({
id: function (item) { return item.ItemId },
formatSelection: function (item) { return item.ItemText }
//......
});

而不是尝试覆盖text(据说应该具有相同的效果,但库中尚未支持/实现这种覆盖方式)

$('#mySelect').select2({
id: function (item) { return item.ItemId },
text: function (item) { return item.ItemText }  //this will not work.
//......
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Select2 下拉列表中选择项目 的相关文章

  • 防止垃圾邮件按钮呼叫功能

    如何防止调用函数时出现垃圾邮件按钮 就像用户只能在按钮上每 1 秒调用一次该函数 有办法做到吗 因为我尝试了 setTimeout 但没有成功 它仍然在发送垃圾邮件 顺便说一句 我使用 Jquery 这是我的代码
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 两列表:一列尽可能小,另一列占据其余部分

    我在 div 中有一个 to columns 表 div table tbody tr td class action a a td td class content p Bigger text variable size p td tr
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 为什么我的交互式图像仅在 Internet Explorer 上出现故障?

    我的问题 我为自己制作了一个图像地图 交互式图像 它在 Chrome safari 和 Firefox 上完美运行 然而 当我在可怕的互联网浏览器上尝试它时 它真的很糟糕 这些小点应该扩展到更大的盒子中 在互联网浏览器上它要么不起作用 要么
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • 为什么我们需要主干js或任何JS MVC框架?

    如果我们已经使用后端 MVC 框架 例如 Django 或 ROR 为什么还需要使用 JS MVC 框架 主干 我无法理解两个 MVC 框架的概念以及它们如何组合在一起 我认为所有前端相关文件或逻辑 html css js 都位于后端框架的
  • 如何获取 docker 镜像的准确日期?

    I run docker images并得到这样的东西 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker io postgres latest a7d662bede59 2 weeks
  • 如何使用列标题引用 Google Apps 脚本电子表格中的单元格

    我有几个 Google 表格 可以连接并更新它们之间的单元格 现在我必须使用 R1C1 或 A1 类型引用来定义基于特定列的获取或设置单元格 如果添加新列 所有这些引用现在都会关闭 每个工作表的第一行都将列标题作为这些单元格中的值 我可以以
  • Solr 查询唯一整数字段

    我在 schema xml 中定义了一个字段
  • Django Forms clean() 方法 - 需要客户端的 IP 地址

    我正在重写 Django 表单上的 clean 方法 我想要访问客户端的 IP 地址 假设这是绑定表单 如果我有对请求对象的引用 我可以从 META REMOTE ADDR 轻松获取它 但是 我没有参考该请求 关于如何做到这一点有什么想法吗
  • 如何在 Keras 中实现自适应损失?

    我正在尝试使用 Keras 来实现中完成的工作通用的自适应鲁棒损失函数 https arxiv org abs 1701 03077 作者提供了处理困难细节的张量流代码 我只是想在 Keras 中使用他的预构建函数 他的自定义损失函数正在学
  • 是否可以收听“风格改变”事件?

    是否可以在 jQuery 中创建一个可以绑定到任何样式更改的事件侦听器 例如 如果我想在元素更改尺寸或样式属性中的任何其他更改时 执行 某些操作 我可以执行以下操作 div bind style function console log t
  • 将字符串转换为代码

    我想知道是否有任何方法可以转换String为Java可编译代码 我有一个比较表达式保存在数据库字段中 我想从数据库中检索它 然后在条件结构内对其进行评估 有什么办法可以做到这一点吗 如果您使用 Java 6 您可以尝试 Java 编译器 A
  • PHP MySQL 小查询超时,必须将限制设置为 10

    在为相对较小的查询调用 mysql query 时 我收到 PHP 超时错误 因此我必须将限制设置为 10 Fatal error Maximum execution time of 120 seconds exceeded in C xa
  • 角度路由when()无需映射到控制器或模板

    可以使用when 而不映射到任何控制器或模板吗 这就是我配置路线的方式 app config function routeProvider locationProvider locationProvider html5Mode true r
  • 如何在签署 pdf 文件时将时间戳属性添加到认证详细信息

    我想在证书中显示时间戳属性 如图所示 我应该在签名中设置什么 这是我添加标志信息的代码 private SignerInformation signTimeStamp SignerInformation signer throws IOEx
  • python“字符串”模块?

    所以我正在阅读这个旧模块 我认为是 2002 年左右 它有这一行 导入字符串 Python 是否要求您在能够使用字符串类型变量或其他东西之前显式导入字符串模块 我没有看到它在代码中这样使用 string something The stri
  • 天青错误。您没有权限查看该目录或页面

    当我导航到部署的 azure 网站时 出现错误 You do not have permission to view this directory or page 在我的 web config 中
  • 如何生成像github这样的个人访问令牌?

    这是理论问题 我想在 net core webapi 中创建类似 Github 个人访问令牌 的机制 该机制已经与 Identity Server 4 具有 ResourceOwnerPassword 流 理论上 我想根据用户请求手动生成令
  • 用分隔符分割字符串

    我目前正在尝试拆分字符串1128 2这样我就可以有两个不同的值 例如 value1 1128 和 value2 2 这样我就可以单独使用每个值 我努力了split 但没有成功 Grails 是否有特定的方法来处理这个问题 或者有更好的方法
  • 在 UML 中包含或扩展?

    据我所知 扩展关系是当用例是可选的时 但包含是当需要用例的操作时 但不是所有时候 我想为注册系统建模一个用例 但对使用哪种关系有疑问 我有两个可能的选择 我更热衷于 b 表示此操作的方式 因为修改数据和删除数据的部分不应该是可选的 它们用于
  • 如何在Windows中使用启用伪语言环境进行测试?

    Windows Vista引入了三个概念伪语言环境 http msdn microsoft com en us library dd319106 28v vs 85 29 aspx Pseudo Locale Locale Name LCI
  • PhoneGap Build 上的每个平台配置 (config.xml)

    我有一个在 PhoneGap Build 上远程构建的 PhoneGap 3 1 应用程序 在我的应用程序中有一个config xml文件位于项目的根目录下 该文件包含
  • 指向连续二维数组的指针

    我正在使用带标志的 gcc 版本 4 8 0 Wall std gnu99 我需要使用 C 中的 malloc 为连续的二维数组动态分配内存 这个事实是不容谈判的 但是 为了便于使用 我仍然希望能够使用方便的方式访问数组x r c 符号 这
  • 无法在 Select2 下拉列表中选择项目

    我正在开发一个使用 Select2 版本 3 5 1 的应用程序 设置此下拉 自动完成字段的 HTML 如下所示