如何解决 Smarty 中的 jQuery 加载错误

How do I solve this jQuery loading error in Smarty

我有一些页面脚本会产生常量 ReferenceError: $ is not defined 错误。

jQuery 加载在 html 页面底部,就在标记之前。我添加了一个 DOM 侦听器,因此代码可以等待 JQuery 加载。你能看出什么问题吗,代码如下。

Webpack 配置:

new webpack.ProvidePlugin({
          $: "jquery",
          jQuery: "jquery"
      })

console.log 1 个有效,console.log 2 个无效

{literal}
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function(event) {

    console.log('DOM loaded and parsed 1'); // Works!

        if ($('.add-user').length) {
            const addUser = (callbackFunction) => {
                const data = {
                    signup_name: $('#signup-name').val(),
                    user_name: $('#user-name').val(),
                };

                console.log(data);
                callbackFunction();
                return data;
            }
        }
        console.log('DOM fully loaded and parsed 2'); // Doesn't Work?
});
</script>
{/literal}

确保您已添加 jQuery <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 这可能在页面的 HEAD 或页脚中,只需确保在尝试调用任何其他 jQuery 东西之前加载它。

如果还是报错,尝试添加var $ = jQuery。它应该可以正常工作。

这不是解决方案,但可以帮助您确定问题是否来自 jQuery 尚未加载,如果第二个控制台日志仍未显示,则问题出在与其他事情有关。 我将代码的执行延迟了 5 秒,这足以让 jquery 在您的代码执行之前加载

{literal}
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function(event) {

    console.log('DOM loaded and parsed 1'); // Works!
    setTimeout(function(){
        if (jQuery('.add-user').length>0) {
            const addUser = (callbackFunction) => {
                const data = {
                    signup_name: jQuery('#signup-name').val(),
                    user_name: jQuery('#user-name').val(),
                };

                console.log(data);
                callbackFunction();
                return data;
            }
        }
        console.log('DOM fully loaded and parsed 2'); // Doesn't Work?
    },5000)
});
</script>
{/literal}

因此,由于 Webpack 设置,jQuery 似乎不可用。

经过一番研究,我找到了有助于解决错误的答案:

安装暴露加载器:npm install expose-loader --save-dev

并将其添加到 webpack.config.js

module: {
        rules: [            
             {
              // Exposes jQuery for use outside Webpack build
              test: require.resolve('jquery'),
              use: [{
                loader: 'expose-loader',
                options: 'jQuery'
              },{
                loader: 'expose-loader',
                options: '$'
              }]
            }
        ]
}

并确保您还添加了插件

plugins: [
    // Provides jQuery for other JS bundled with Webpack
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
    })
  ]