【问题标题】:Unable to load remote data son into select2无法将远程数据子加载到 select2
【发布时间】:2017-10-01 15:02:02
【问题描述】:

我已经尝试了很多小时来获取一个远程 JSON 文件作为选项导入到 select2 输入中,但没有任何成功。

我使用的是 Select2 的 3.5.3 版本,它通过一个模块加载到 Drupal 中,所以我暂时还是坚持使用它。

我应该说我对 javascript 和 JSON 的经验很少,尽管我花了几个小时浏览各种 select2 教程,虽然脚本将输入更改为 select2 字段,但无论我在搜索中键入什么都只会返回一个字段错误,“加载失败”。

控制台中没有消息,所以我不知道哪里出错了。我怀疑它可能是 JSON 文件,为此我使用的是手动创建的 JSON 文件,我只是将其上传到名为 test.json 的 Web 服务器。这是其中的代码:

[

{
    "entry_id": "45117",
    "url": "http://www.example.com",
    "title": "Title text 1",
    "count": "2",

},

{
    "entry_id": "45096",
    "url": "http://www.example.com",
    "title": "Title text 2",
    "count": "5",
}
]

我希望在 select2 下拉列表中显示“title”字段,并在提交表单时将“entry_id”字段存储为值。我相信这就是 select2 的工作原理,但是字段名称为“id”和“text”,所以我需要我的 JS 来映射我的字段。

我无法更改 JSON 输出格式,因为我将使用的真实世界文件是通过第三方(我还无权访问,因此是测试文件)并且无法更改。

这是我的 JS:

$("#myfieldid").select2({
minimumInputLength: 2,
tags: [],
ajax: {
    url: "http://mydomain.uk/test.json",
    dataType: 'json',
    type: "GET",
    quietMillis: 50,
    data: function (term) {
        return {
            term: term
        };
    },
    results: function (data) {
        return {
            results: $.map(data, function (item) {
                return {
                    text: item.title,
                    id: item.entry_id
                }
            })
        };
    }
}
});

这是我的 html:

<input type="text" id="myfieldid" name="myfieldname" value="" size="60" maxlength="255" tabindex="-1" style="display: none;">

为这篇冗长的帖子道歉,我真的被困在这里了,我完全期望一切都可以从我拥有的代码中运行,所以我的想法是它是 JSON 文件,以太格式或它的生成方式导致问题。

【问题讨论】:

  • 您的测试文件是否托管在与 Drupal 安装相同的域中?如果没有,您可能会遇到跨域限制
  • 是的,测试文件在同一个域中。

标签: javascript json jquery-select2


【解决方案1】:

我查看了您的代码,发现了几个问题。

1) 您的 html 中需要有一个 &lt;select&gt; 元素而不是 &lt;input&gt;。

2) 您提供的示例 JSON 有一些额外的逗号(在 count 字段之后)。测试时,由于这些逗号,Chrome 拒绝加载此数据。你确定你的实际数据也有这些逗号吗?如果是这样,可能会有解决方法,但现在我将假设您的真实 JSON 实际上格式正确。

此外,我会将您的 JSON 数据加载到一个变量中,然后将其传递给 select2,而不是让 select2 执行 ajax 调用。否则,该库将在搜索字段中的每次击键时向服务器查询 json 文件,因为这实际上是用于服务器端搜索/过滤。

结果可能如下所示:

<!-- various HTML elements -->
<select id="myfieldid" name="myfieldname" tabindex="-1">
<!-- various HTML elements -->

<script>
$(document).ready(function() {
  $.ajax({
    async: true,
    url: "data.json",
    dataType: "json",
    error: function (jqXhr, status, error) {
      alert("Error loading data!");
    },
    success: function (data) {
      data = $.map(data, function (item) {
        return {
          text: item.title,
          id: item.entry_id
        };
      });
      $("#myfieldid").select2({
        minimumInputLength: 2,
        data: data
      });
    }
  });
});
</script>

【讨论】:

  • 太棒了!谢谢你。您对 JSON 文件的看法是正确的。我没有看到那些额外的逗号,但这就是问题所在。嗬!如此简单......我的javascript不太正确,但我设法稍微修改了一下,现在一切正常。我不需要将输入更改为选择,因为我使用的是旧版本的 select2 并且输入工作正常,但多亏了你,我非常高兴!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2015-05-12
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多