如何在 IE9 的 React App 中加载 jQuery?错误 SCRIPT5009:“$”

How to load jQuery in a React App in IE9? Error SCRIPT5009: '$'

关于如何在涉及简单表单的 React 应用程序中加载 jQuery 的一些建议,我将不胜感激。我在这里想要实现的是在 IE9(我的应用程序支持的最低 IE 版本)中为我的 React 表单输入添加占位符支持。

我使用检测浏览器来检查和检索浏览器版本。如果是 IE9,则在我的 head 标签中加载 jQuery 并使用下面众所周知的 jQuery 脚本将占位符插入我的输入中。

我现在加载 jQuery 的方式,我收到错误 SCRIPT5009: '$',原因很明显。我在这里做错了什么,我该如何解决?我也试过 import $ from 'jquery';然后只是删除从 head 加载 jquery 的脚本,但这并不能解决我的问题,我仍然从上面得到同样的错误。

这是我的代码:

import React from 'react';
const browser = require('detect-browser');

class App extends React.Component {
    constructor(props) {
        super(props);
        this.iePlaceholder = this.iePlaceholder.bind(this);
    }

    iePlaceholder() {
        if(browser.name === 'ie' && browser.version === '9.0.0') {
            const scriptJquery = document.createElement("script");
            scriptJquery.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
            document.head.appendChild(scriptJquery);

            const placeholdersIeScript = `
                $(document).ready(function() {
                    $('[placeholder]').focus(function() {
                        var input = $(this);
                        if (input.val() == input.attr('placeholder')) {
                            input.val('');
                            input.removeClass('placeholder');
                        }
                    }).blur(function() {
                        var input = $(this);
                        if (input.val() == '' || input.val() == input.attr('placeholder')) {
                            input.addClass('placeholder');
                            input.val(input.attr('placeholder'));
                        }
                    }).blur();
            });
            `
            const script = document.createElement("script");
            script.type = "text/javascript";
            script.innerHTML = placeholdersIeScript;
            document.head.appendChild(script);
        }
    }

    componentWillMount() {
        this.iePlaceholder();
    }

    render() {
        return (
            <div>
                <h1>A title</h1>
                <form>
                    <input id="myInput"
                        type="text"
                        placeholder="MyPlaceholder"
                    />
                </form>

            </div>
        );
    }
}

export default App;

在使用 npm 安装 jquery 之后,您可以做一些像 const $ = require('jquery'); 这样简单的事情,然后只 运行 脚本,而不是像您正在做的那样尝试注入它。

另一种方法是使用 webpack。在您的 webpack 配置文件中,您可以使用以下语法添加插件:

plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
    })
]

这将自动用 jquery 替换代码中的 $ 引用,尽管它只是避免在代码中其他地方使用 const $ = require('jquery'); 的快捷方式。