【问题标题】:Select2() is not a functionSelect2() 不是函数
【发布时间】:2013-11-30 19:41:10
【问题描述】:

所以我已经下载了 select2 我已经通过将其放入我的文件夹中“安装”它,然后在我检查控制台时将其加载到我的网站上(我可以看到正在加载的所有脚本)我可以看到文件 select2 .js

我去了他们的文档并复制并添加了$("#e9").select2();

但是当我加载页面时出现以下错误:

TypeError: $(...).select2 is not a function


$("#e9").select2();

有没有其他人经历过这样的事情?

这里的附加信息是我的脚本:

    jQuery(document).ready(function(){
    var max_amount = parseFloat($('#max_amount').val());
    $( "#item_amount" ).keyup(function() {
           if($(this).val() > max_amount){
            $(this).val( max_amount);
        }
        if( /\D/.test($(this).val()) ){
            alert('Må kun indeholde tal!');
            $(this).val('');
        }
        if($(this).val()== '0'){
            alert('Må ikke være 0!');
            $(this).val('');
        }
    });
    $("#e1").select2();

});
function addToBasket(){
    var amount = $('#item_amount').val();
    if(amount == ""){
        amount = 1;
    }

    if(amount > 0){
    $.ajax({
        type: 'POST',
        url: myBaseUrl + 'Products/addItemToBasket',
        dataType: 'json',
        data: {
            id: window.location.pathname.substring(window.location.pathname.lastIndexOf('/') + 1),
            amount: amount
        },
        success: function (data) {
            var urlToBasket = myBaseUrl+'Products/basket';
            var newAmount = parseInt(amount)
            var price = data[0]['Product']['pris'];
            var id = data[0]['Product']['id'];
            var dat = data;
            var tmp_basket_html = $('#basket_amount').html();
           if($('#basket_amount').html() !== " Tom"){
              $('#shopping_table_body').append(
                  "<tr id='"+id+"'>" +
                      "<td class='image'>" +
                      ""+
                      "</td>" +
                      "<td class='name'>" +
                      " "+data[0]['Product']['name'] +
                      "</td>"+
                      "<td class='quantity'>" +
                      "x "+amount +""+
                      "</td>"+
                      "<td class='total'>" +
                      ""+price*amount+
                      "</td>" +
                      ""+
                      "<td class='remove'>" +
                      "<input class='icon-remove' type='button' onclick='removeItemFromBasket("+id+")'>"+
                      "</td>"+
                      "</tr>"
              );
           }else{
               $("#shopping_menu").append(
                   "<ul class='dropdown-menu topcartopen'>"+
                       "<li id='basket_list'>"+
                      "<table id='shopping_table'>"+
                        "<tbody id='shopping_table_body'>"+
                       "<tr id='"+id+"'>" +
                       "<td class='image'>" +
                       ""+
                       "</td>" +
                       "<td class='name'>" +
                       " "+data[0]['Product']['name'] +
                       "</td>"+
                       "<td class='quantity'>" +
                       "x "+amount +""+
                       "</td>"+
                       "<td class='total'>" +
                       ""+price*amount+
                       "</td>" +
                       ""+
                       "<td class='remove'>" +
                       "<input class='icon-remove' type='button' onclick='removeItemFromBasket("+id+")'>"+
                       "</td>"+
                       "</tr>"+
                       "</table>"+
                       "</li>"+
                       "<div class='well pull-right'>"+
                       "<input type='button' onclick='goToBasket()' class='btn btn-success' value='Tjek ud'>"+
                       "</div>"+
                       "</ul>"

               )
           }
            updateTotal(amount,price);
            updateBasketAmount();
        }
    });
    }
    Notifier.success('Vare tilføjet', 'Tilføjet'); // text and title are both optional.
}
function updateTotal(amount, price){
    var price = parseFloat(price);
    var oldValue = parseFloat($('#basket_total_cost').html());
    var newPrice = amount*price+oldValue;
    $('#basket_total_cost').html(newPrice);
}
function updateBasketAmount(){
   var tmp =  $('#basket_amount').html();
    if(!isNaN(tmp)){
   var oldAmount = parseInt(tmp.substr(0,2));
    var i = oldAmount + 1;;
    $('#basket_amount').html(
        ""+i+" vare(r)"
    );
    }else{
        $('#basket_amount').html(
            "1"+" vare(r)"
        );
    }
}
function goToBasket(){
    window.location.href = myBaseUrl+'Products/basket';
}

【问题讨论】:

  • 要么你没有加载 jQuery,要么其他脚本已经控制了全局 $。与 select2 无关。
  • jquery 已加载并正在我的代码中的其他地方使用一切正常..
  • 您确定在使用之前已完全加载脚本吗?尝试将$("#e9").select2(); 放在控制台中。如果它在控制台中工作,而不是在您的页面上运行时,那么您可能会遇到 javascript 的异步功能错误。
  • @DutGRIFF 这是我的控制台:$('#e1').select2() TypeError: $(...).select2 is not a function $('#e1').select2( )
  • 也可能你有多个版本的 jQuery 被加载......在你的插件之后加载一个版本将覆盖绑定到第一个版本的插件(覆盖整个 jQuery 对象)。在所有插件之前只加载一次 jQuery

标签: javascript jquery jquery-select2


【解决方案1】:

当我开始将 select2 与 XCrud 一起使用时,我遇到了这个问题。我通过禁用 XCrud 加载 JQuery 来解决它,这是第二次,并将其加载到 body 标记下方。因此,请确保 JQuery 不会在您的页面上加载两次。

【讨论】:

  • 是的,为我双重加载 jQuery!谢谢
  • 精准,节省了几个小时!在我的 Asp.Net MVC 项目中,我有一个 js 包,其中包含 Jquery,它在局部视图中第二次加载。布局页面已经有了 jquery。
【解决方案2】:

如果在 select2 js 文件之前加载了使用选择框限制 select2 的 js 文件,则会引发此错误。 请确保文件应按此顺序排列,如..

  • jQuery
  • select2 js
  • 你的js

【讨论】:

  • 在重新排序加载脚本的方式后,它开始为我工作。但奇怪的是,当我在本地运行时没有注意到这样的错误。只有在部署时它才出现。所以问题是由于异步加载和延迟问题,仅在部署时存在。
  • jquery 的潜在重复引用
  • @Ashutosh Singh 谢谢这是我的主要问题,你节省了我的时间!
【解决方案3】:

有同样的问题。通过延迟加载 select2 对其进行排序

<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.8/js/select2.min.js" defer></script>

【讨论】:

    【解决方案4】:

    我也遇到了同样的问题并注意到发生此错误是因为我使用 select2 的选择器不存在或未加载。

    所以通过执行确保 $("#selector") 存在

    if ($("#selector").length > 0)
       $("#selector").select2();
    

    【讨论】:

    • 这种情况下的错误信息不一样。 OP 的错误消息说“$(...).select2 不是函数”,但你应该说“找不到空对象的 select2”类似这样的内容
    【解决方案5】:

    document.ready() 函数中添加$("#id").select2()

    【讨论】:

      【解决方案6】:

      我使用了 jQuery slim 版本并得到了这个错误。通过使用普通的 jQuery 版本,问题得到了解决。

      【讨论】:

      • “精简版”我认为您的意思是 jquery.min.js。我切换到 jquery.js,它暂时消失了,然后又回来了。
      • 使用 .min 什么都不做
      【解决方案7】:

      这个问题已经很老了,但我会写一些小笔记,因为我今天花了几个小时调查同样的问题。 在我动态加载部分代码后,select2 无法在新的选择框上运行,并出现错误“$(...).select2 is not a function”。

      我发现在未打包的 select2.js 中有一行阻止它重新处理 main 函数(在我的 3.5.4 版本中它位于第 45 行):

      if (window.Select2 !== undefined) {
          return;
      }
      

      所以我只是在那里评论它并开始使用 select2.js(而不是缩小版)。

      //if (window.Select2 !== undefined) {
      //    return;
      //}
      

      它开始工作得很好,当然它现在可以进行多次处理而失去性能,但无论如何我都需要它。

      希望这会有所帮助, 弗拉基米尔

      【讨论】:

        【解决方案8】:

        您可能指的是两个 jquery 脚本,它给出了上述错误。

        【讨论】:

          【解决方案9】:

          config.assets.debug = false 放入config/environments/development.rb。

          【讨论】:

          • 我正在开发一个 Rails3 应用程序,使用 select2-rails gem,你的建议已经解决了这个问题。但是我不得不放弃资产的调试。为什么?还有其他解决方案吗?
          • 谁说这是一个 ruby​​ 项目?
          【解决方案10】:

          对我来说,select2.min.js 文件有效,而不是 select2.full.min.js。我已经手动定义了从 github page 获得的 dist 文件夹中复制的文件。还要确保在 select2 文件之前导入了一个 jQuery(document).ready(...) 定义和 jquery 文件。

          【讨论】:

            【解决方案11】:

            对于像我这样的新手,他们最终会回答这个问题:如果您尝试在使用纯 javascript 而不是使用 jQuery 检索的元素上调用 .select2() 也会发生此错误。

            这会失败并出现“select2 不是函数”错误:

            document.getElementById('e9').select2();
            

            这行得通:

            $("#e9").select2();
            

            【讨论】:

              【解决方案12】:

              在我的例子中,当 webpacker 和 sprockets 都试图导入 jQuery 时,我在我的 rails 应用程序中遇到了这个错误。直到我的代码编辑器自动尝试将 jQuery 导入 webpacker 模块时,我才注意到它。

              【讨论】:

                【解决方案13】:

                我今天遇到了同样的问题,其他答案都没有奏效。我不明白它是如何或为什么起作用的,但它确实有效并且(敲木头)仍然有效。

                不过先说一下我的具体情况:

                我在一个 .js 文件中使用了 select2 并试图将其放入另一个文件中,但出现此错误。 jQuery 在另一个 .js 文档中运行良好,而我尝试使用的第二个在 html 中被称为晚于我正在编写的第一个 .js 文档,并且都晚于 jquery 和 select2 标记。

                好的,现在解决没有意义但确实有效的解决方案:

                我将 jQuery 元素的定义放入早期的 .js 文件中,并将该变量的 .select2 放入后面的 .js 文件中。很奇怪,对吧?所以,像这样:

                <head>
                *blah blah blah html headers*
                <script src="/static/js/jquery-3.6.0.js"></script>  
                <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
                </head>
                <body>
                *blah blah blah page stuff*
                <script src="/static/js/first.js"></script>
                *blah blah some more stuff*
                <script src="/static/js/second.js"></script>
                

                first.js

                const selector = $('#select-this')
                

                second.js

                selector.select2({
                *&c, &c, &c.*
                

                【讨论】:

                  猜你喜欢
                  • 2020-02-04
                  • 2018-08-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-01-06
                  • 2016-09-05
                  • 1970-01-01
                  • 2019-10-21
                  • 2021-06-22
                  相关资源
                  最近更新 更多