【问题标题】:$(...).datetimepicker is not a function$(...).datetimepicker 不是函数
【发布时间】:2016-06-06 20:51:17
【问题描述】:

我使用webpack 并想使用bootstrap-datetimepicker。在我的 webpack 配置 中,我使用 ProvidePlugin 来获取“jquery 模块”。

在我的代码中,当我调用$('#datetimepicker12').datetimepicker 函数时出现错误$(...).datetimepicker is not a function。我不明白为什么$变量不包含datetimepicker函数,应该定义在var datetimepicker = require('eonasdan-bootstrap-datetimepicker');

webpack.config.js

var webpack = require('webpack');
var merge = require('webpack-merge');
var NpmInstallPlugin = require('npm-install-webpack-plugin');
var autoprefixer = require('autoprefixer');

const TARGET = process.env.npm_lifecycle_event;
console.log("target event is " + TARGET);

var common = {
  cache: true,
  debug: true,
  entry: './src/script/index.jsx',
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  output: {
    filename: 'index.js',
    sourceMapFilename: '[file].map'
  },
  module: {
    loaders: [{
      test: /\.js[x]?$/,
      loaders: ['babel'],
      exclude: /(node_modules|bower_components)/
    }, {
      test: /\.css$/,
      loaders: ['style', 'css']
    }, {
      test: /\.scss$/,
      loaders: ['style', 'css', 'postcss', 'sass']
    }, {
      test: /\.less$/,
      loaders: ['style', 'css', 'less']
    }, {
      test: /\.woff$/,
      loader: "url-loader?limit=10000&mimetype=application/font-woff&name=[path][name].[ext]"
    }, {
      test: /\.woff2$/,
      loader: "url-loader?limit=10000&mimetype=application/font-woff2&name=[path][name].[ext]"
    }, {
      test: /\.(eot|ttf|svg|gif|png)$/,
      loader: "file-loader"
    }]
  },
  plugins: [
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery"
    })
  ],
  postcss: function() {
    return [autoprefixer({
      browsers: ['last 3 versions']
    })];
  }
};

if (TARGET === 'dev' || !TARGET) {
  module.exports = merge(common, {
    devtool: 'eval-source-map',
    devServer: {
      historyApiFallback: true
    },
    output: {
      publicPath: 'http://localhost:8090/assets'
    },
    plugins: [
      new NpmInstallPlugin({
        save: true // --save
      })
    ]
  });
}

index.jsx

var React = require('react');
var ReactDOM = require('react-dom');

var bootstrap = require('bootstrap');
var bootstrapStyle = require("../../node_modules/bootstrap/dist/css/bootstrap.css");

var datetimepicker = require('eonasdan-bootstrap-datetimepicker');

class DateTimePicker extends React.Component {

  componentDidMount(){
    $('#datetimepicker12').datetimepicker({
              inline: true,
              sideBySide: true
          });
  }

  render() {
    return <div id="wrapper">
                <div className="form-group">
                    <div className="row">
                        <div className="col-md-8">
                            <div id="datetimepicker12"></div>
                        </div>
                    </div>
                </div>
            </div>;
  }
}

ReactDOM.render(
  <DateTimePicker/>, document.getElementById('content'));

package.json

{
  "name": "webpack-bootstrap-datetimepicker",
  "version": "0.0.0",
  "description": "webpack-bootstrap-datetimepicker",
  "main": "index.jsx",
  "scripts": {
    "start": "npm run serve | npm run dev",
    "serve": "./node_modules/.bin/http-server -p 8080",
    "dev": "webpack-dev-server -d --progress --colors --port 8090"
  },
  "devDependencies": {
    "babel": "^6.5.2",
    "babel-core": "^6.5.2",
    "babel-loader": "^6.2.2",
    "babel-preset-es2015": "^6.5.0",
    "babel-preset-react": "^6.5.0",
    "bootstrap": "^3.3.6",
    "css-loader": "^0.23.1",
    "file-loader": "^0.8.5",
    "html-webpack-plugin": "^2.8.1",
    "http-server": "^0.8.5",
    "jquery": "^2.2.0",
    "less": "^2.6.0",
    "less-loader": "^2.2.2",
    "node-sass": "^3.4.2",
    "npm-install-webpack-plugin": "^2.0.2",
    "postcss": "^5.0.15",
    "postcss-loader": "^0.8.1",
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "sass-loader": "^3.1.2",
    "style-loader": "^0.13.0",
    "url-loader": "^0.5.7",
    "webpack": "^1.12.13",
    "webpack-dev-server": "^1.14.1",
    "webpack-merge": "^0.7.3"
  },
  "dependencies": {
    "eonasdan-bootstrap-datetimepicker": "^4.15.35"
  }
}

【问题讨论】:

  • 你有datetimepicker.js吗?
  • 是的,我愿意。解决方案是here
  • 您还必须在您的条目中添加“eonasdan-bootstrap-datetimepicker”。

标签: javascript jquery twitter-bootstrap webpack bootstrap-datetimepicker


【解决方案1】:

您需要检查#datetimepicker12 是否正确,它是否存在于您的浏览器中。按 F12 并按 ctrl+F 并查找 id 存在。 另一方面,任何错误 jquery 文件在您的页面上缺少特别是日期时间选择器 js 文件,您会收到关于该文件的错误 404。将该文件放在所有 js 文件的顶部,希望您的问题能够得到解决

【讨论】:

  • file not found on page 404错误发生然后将datetimepicker.js文件放在你所有js文件的顶部可能会解决
  • 我没有收到 404 错误,并且 webpack 包含 datetimepicker.js 代码。请阅读我的问题。
【解决方案2】:

解决方案在 Github 上的 pull request

【讨论】:

    【解决方案3】:

    对 $.fn 进行持久更改(无需编辑源代码)的一种方法是将expose 插件与imports 结合使用:

    module : {
        loaders : [
                {
                    test : /jquery/,
                    loader : 'expose-loader?$!expose?jQuery'
                },
                {
                    test : /eonasdan-bootstrap-datetimepicker/,
                    loader : 'imports-loader?define=>false,exports=>false,moment=moment'
                }]
    }
    

    imorts loader 的这些参数到底有什么作用?

    当你查看源代码时,它以

    开头
    'use strict';
    if (typeof define === 'function' && define.amd) {
        // AMD is used - Register as an anonymous module.
        define(['jquery', 'moment'], factory);
    } else if (typeof exports === 'object') {
        module.exports = factory(require('jquery'), require('moment'));
    

    然后继续

    } else {
    // Neither AMD nor CommonJS used. Use global variables.
    

    这部分 define=&gt;false,exports=&gt;false 预先添加了一段 JavaScript,将 defineexports(内部包装模块定义)设置为 false,允许它继续“使用全局变量”部分,这正是我们想要什么。 moment=moment 告诉它设置一个变量moment 等于require('moment'),现在当日期选择器尝试从全局变量中解析库时,它会到达var moment=... 定义。如果你打算在全局变量中包含moment(不是作为 npm 依赖项),你应该省略这个参数。

    【讨论】:

    • exports=&gt;false,moment=moment part in import loader 是什么意思?
    【解决方案4】:

    在这里找到了一个更简单的解决方案:https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1319

    解决办法:

    var path = require('path');
    
    module.exports = {
        resolve: {
            alias: {
                // Force all modules to use the same jquery version.
                'jquery': path.join(__dirname, 'node_modules/jquery/src/jquery')
            }
        }
    };
    

    【讨论】:

    • 这在 2020 年仍然有效。有什么现代解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多