未捕获的 TypeError: $(...).select2 不是 CodeIgniter 中的函数

Posted

技术标签:

【中文标题】未捕获的 TypeError: $(...).select2 不是 CodeIgniter 中的函数【英文标题】:Uncaught TypeError: $(...).select2 is not a function in CodeIgniter 【发布时间】:2021-06-22 23:39:50 【问题描述】:

我是 CodeIgniter 的新手,目前被困在一项任务中,我需要在添加新产品时使用多选下拉菜单来显示类别,但是当我运行我的代码时,它显示以下错误: https://i.stack.imgur.com/xxeCV.png 我已经阅读了几乎所有类似的问题,但没有发现任何与 CodeIgniter 相关的问题。对此最常见的答案是 jQuery 被加载了两次,但我检查了所有不是这种情况的文件。因此,如果有任何与 CodeIgniter 相关的问题,请指导我解决问题或帮助我编写代码。 感谢您提前回复。 添加新产品的视图:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');?>
<div class="main-panel">
  <div class="content-wrapper">
    <div class="row">
      <div class="col-md-12 grid-margin">
        <div class="d-flex justify-content-between align-items-center">
          <div>
            <?php 
            $CI =& get_instance();
            $CI->load->library('ion_auth');
            if($CI->ion_auth->is_admin())
              echo '<h4 class="font-weight-bold mb-0">Admin Dashboard</h4>';
            
            else
              echo '<h4 class="font-weight-bold mb-0">User Dashboard</h4>';
            
            ?>
          </div>          
        </div>              
      </div>
    </div>
    <div class="row">
      <div class="col-12 grid-margin">
        <div class="card">
          <div class="card-body">
            <h4 class="card-title">Add Product</h4>
            <?php echo form_open(base_url()."products/manageproducts/addproductinsert");?>
            <div class="row">
              <div class="col-md-6">
                <div class="form-group row">
                  <label class="col-sm-3 col-form-label">Product Name</label>
                  <div class="col-sm-9">
                    <input type="text" class="form-control" id="product_name" name="product_name" placeholder="Product Name"/>                    
                  </div>
                </div>
              </div>
            </div>
            <div class="row">
              <div class="col-md-6">
                <div class="form-group row">
                  <label class="col-sm-3 form-check-label">Categories</label>
                  <div class="col-sm-9">
                    <select id="catdropdown" name="cat_list[]" multiple="multiple">
                      <option value='0'>--Select Category--</option>   
                    </select>
                  </div>
                </div>
              </div>
            </div>
            <div class="row">
              <div class="col-md-12">
                <div class="text-center">
                  <input type="submit" name="submit" value="Submit" class="btn btn-primary">
                </div>
              </div>
            </div>
            <?php echo form_close(); ?>
          </div>
        </div>
      </div>
    </div>
  </div>
  <script type="text/javascript">
    $(document).ready(function()
      $('#catdropdown').select2(
        ajax:
          url:'<?php echo base_url() ?>categories/managecategories/getcategories',
          type:'post',
          dataType:'json',
          delay:250,
          data:function(param)
            return
              searchTerm: param.term
            
          ,
          processResults: function(response)
            return 
              results:response
            
          ,
          cache:true
        
      );
    );
  </script>

控制器:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class ManageProducts extends CI_Controller 
    public function __construct()
    
        parent::__construct();
        $this->load->database();
        //$this->load->library('javascript/jquery');
        $this->load->library(['ion_auth', 'form_validation']);
        $this->load->helper(['url', 'language','form']);
        $this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth'));

        $this->lang->load('auth');
        $this->load->model('products_model');
        $this->load->model('categories/categories_model');
        
    
    public function addproduct()
        $res=$this->categories_model->showallcategories();
        $data['categories']=$res;
        $this->load->view('header');
        $this->load->view('sidebar');
        $this->load->view('addproduct',$data);
        $this->load->view('footer');
    

包含 jquery 和 select2 的头文件:
<!DOCTYPE html>
<html lang="en">

<head> <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link rel="stylesheet" href="<?php echo base_url()?>vendors/ti-icons/css/themify-icons.css">
  <link rel="stylesheet" href="<?php echo base_url()?>vendors/base/vendor.bundle.base.css">
  <link rel="stylesheet" href="<?php echo base_url()?>css/style.css">
  <link rel="shortcut icon" href="<?php echo base_url()?>images/favicon.png" />
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
  <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  <script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>
  <script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/additional-methods.min.js"></script>
</head>

【问题讨论】:

你的 codeigniter 版本是多少? 3.1.11 @RiazLaskar 尝试将.select2 js代码放在“head”部分jst中检查一次 试过了。仍然在不同的行上显示相同的错误。 @RiazLaskar 是库加载正确检查网络,并在加载库时控制台是否有任何错误,即url 【参考方案1】:

我解决了! 我通过在脚本标签中使用 defer 属性来做到这一点。 以下是对我有用的方法,希望将来对任何需要它的人有用:

<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js" defer></script>

感谢所有提供帮助的人。

【讨论】:

以上是关于未捕获的 TypeError: $(...).select2 不是 CodeIgniter 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

VueJS:未捕获(承诺中)TypeError:无法读取未定义的属性“推送”

未捕获的TypeError:(中间值).map不是函数[重复]

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

未捕获(承诺)TypeError:无法读取未定义的属性“长度”

JQuery UI'可拖动不是函数'未捕获的TypeError

未捕获的 Promise 错误:TypeError:成员不是函数