未捕获的ReferenceError:未定义jQuery

时间:2015-07-13 12:10:49

标签: javascript jquery yii2

我在控制台中收到错误Uncaught ReferenceError: jQuery is not defined(anonymous function)。下面是我的代码

yii = (function ($) {
var pub = {
    /**
     * List of JS or CSS URLs that can be loaded multiple times via AJAX requests. Each script can be represented
     * as either an absolute URL or a relative one.
     */
    reloadableScripts: [],
    /**
     * The selector for clickable elements that need to support confirmation and form submission.
     */
    clickableSelector: 'a, button, input[type="submit"], input[type="button"], input[type="reset"], input[type="image"]',
    /**
     * The selector for changeable elements that need to support confirmation and form submission.
     */
    changeableSelector: 'select, input, textarea',

    /**
     * @return string|undefined the CSRF parameter name. Undefined is returned if CSRF validation is not enabled.
     */
    getCsrfParam: function () {
        return $('meta[name=csrf-param]').attr('content');
    },

    /**
     * @return string|undefined the CSRF token. Undefined is returned if CSRF validation is not enabled.
     */
    getCsrfToken: function () {
        return $('meta[name=csrf-token]').attr('content');
    },

    /**
     * Sets the CSRF token in the meta elements.
     * This method is provided so that you can update the CSRF token with the latest one you obtain from the server.
     * @param name the CSRF token name
     * @param value the CSRF token value
     */
    setCsrfToken: function (name, value) {
        $('meta[name=csrf-param]').attr('content', name);
        $('meta[name=csrf-token]').attr('content', value)
    },

    /**
     * Updates all form CSRF input fields with the latest CSRF token.
     * This method is provided to avoid cached forms containing outdated CSRF tokens.
     */
    refreshCsrfToken: function () {
        var token = pub.getCsrfToken();
        if (token) {
            $('form input[name="' + pub.getCsrfParam() + '"]').val(token);
        }
    },

    /**
     * Displays a confirmation dialog.
     * The default implementation simply displays a js confirmation dialog.
     * You may override this by setting `yii.confirm`.
     * @param message the confirmation message.
     * @param ok a callback to be called when the user confirms the message
     * @param cancel a callback to be called when the user cancels the confirmation
     */
    confirm: function (message, ok, cancel) {
        if (confirm(message)) {
            !ok || ok();
        } else {
            !cancel || cancel();
        }
    },

    /**
     * Handles the action triggered by user.
     * This method recognizes the `data-method` attribute of the element. If the attribute exists,
     * the method will submit the form containing this element. If there is no containing form, a form
     * will be created and submitted using the method given by this attribute value (e.g. "post", "put").
     * For hyperlinks, the form action will take the value of the "href" attribute of the link.
     * For other elements, either the containing form action or the current page URL will be used
     * as the form action URL.
     *
     * If the `data-method` attribute is not defined, the `href` attribute (if any) of the element
     * will be assigned to `window.location`.
     *
     * Starting from version 2.0.3, the `data-params` attribute is also recognized when you specify
     * `data-method`. The value of `data-params` should be a JSON representation of the data (name-value pairs)
     * that should be submitted as hidden inputs. For example, you may use the following code to generate
     * such a link:
     *
     * ```php
     * use yii\helpers\Html;
     * use yii\helpers\Json;
     *
     * echo Html::a('submit', ['site/foobar'], [
     *     'data' => [
     *         'method' => 'post',
     *         'params' => [
     *             'name1' => 'value1',
     *             'name2' => 'value2',
     *         ],
     *     ],
     * ];
     * ```
     *
     * @param $e the jQuery representation of the element
     */
    handleAction: function ($e) {
        var method = $e.data('method'),
            $form = $e.closest('form'),
            action = $e.attr('href'),
            params = $e.data('params');

        if (method === undefined) {
            if (action && action != '#') {
                window.location = action;
            } else if ($e.is(':submit') && $form.length) {
                $form.trigger('submit');
            }
            return;
        }

        var newForm = !$form.length;
        if (newForm) {
            if (!action || !action.match(/(^\/|:\/\/)/)) {
                action = window.location.href;
            }
            $form = $('<form method="' + method + '"></form>');
            $form.attr('action', action);
            var target = $e.attr('target');
            if (target) {
                $form.attr('target', target);
            }
            if (!method.match(/(get|post)/i)) {
                $form.append('<input name="_method" value="' + method + '" type="hidden">');
                method = 'POST';
            }
            if (!method.match(/(get|head|options)/i)) {
                var csrfParam = pub.getCsrfParam();
                if (csrfParam) {
                    $form.append('<input name="' + csrfParam + '" value="' + pub.getCsrfToken() + '" type="hidden">');
                }
            }
            $form.hide().appendTo('body');
        }

        var activeFormData = $form.data('yiiActiveForm');
        if (activeFormData) {
            // remember who triggers the form submission. This is used by yii.activeForm.js
            activeFormData.submitObject = $e;
        }

        // temporarily add hidden inputs according to data-params
        if (params && $.isPlainObject(params)) {
            $.each(params, function (idx, obj) {
                $form.append('<input name="' + idx + '" value="' + obj + '" type="hidden">');
            });
        }

        var oldMethod = $form.attr('method');
        $form.attr('method', method);
        var oldAction = null;
        if (action && action != '#') {
            oldAction = $form.attr('action');
            $form.attr('action', action);
        }

        $form.trigger('submit');

        if (oldAction != null) {
            $form.attr('action', oldAction);
        }
        $form.attr('method', oldMethod);

        // remove the temporarily added hidden inputs
        if (params && $.isPlainObject(params)) {
            $.each(params, function (idx, obj) {
                $('input[name="' + idx + '"]', $form).remove();
            });
        }

        if (newForm) {
            $form.remove();
        }
    },

    getQueryParams: function (url) {
        var pos = url.indexOf('?');
        if (pos < 0) {
            return {};
        }
        var qs = url.substring(pos + 1).split('&');
        for (var i = 0, result = {}; i < qs.length; i++) {
            qs[i] = qs[i].split('=');
            result[decodeURIComponent(qs[i][0])] = decodeURIComponent(qs[i][1]);
        }
        return result;
    },

    initModule: function (module) {
        if (module.isActive === undefined || module.isActive) {
            if ($.isFunction(module.init)) {
                module.init();
            }
            $.each(module, function () {
                if ($.isPlainObject(this)) {
                    pub.initModule(this);
                }
            });
        }
    },

    init: function () {
        initCsrfHandler();
        initRedirectHandler();
        initScriptFilter();
        initDataMethods();
    }
};

function initRedirectHandler() {
    // handle AJAX redirection
    $(document).ajaxComplete(function (event, xhr, settings) {
        var url = xhr.getResponseHeader('X-Redirect');
        if (url) {
            window.location = url;
        }
    });
}

function initCsrfHandler() {
    // automatically send CSRF token for all AJAX requests
    $.ajaxPrefilter(function (options, originalOptions, xhr) {
        if (!options.crossDomain && pub.getCsrfParam()) {
            xhr.setRequestHeader('X-CSRF-Token', pub.getCsrfToken());
        }
    });
    pub.refreshCsrfToken();
}

function initDataMethods() {
    var handler = function (event) {
        var $this = $(this),
            method = $this.data('method'),
            message = $this.data('confirm');

        if (method === undefined && message === undefined) {
            return true;
        }

        if (message !== undefined) {
            pub.confirm(message, function () {
                pub.handleAction($this);
            });
        } else {
            pub.handleAction($this);
        }
        event.stopImmediatePropagation();
        return false;
    };

    // handle data-confirm and data-method for clickable and changeable elements
    $(document).on('click.yii', pub.clickableSelector, handler)
        .on('change.yii', pub.changeableSelector, handler);
}

function initScriptFilter() {
    var hostInfo = location.protocol + '//' + location.host;
    var loadedScripts = $('script[src]').map(function () {
        return this.src.charAt(0) === '/' ? hostInfo + this.src : this.src;
    }).toArray();

    $.ajaxPrefilter('script', function (options, originalOptions, xhr) {
        if (options.dataType == 'jsonp') {
            return;
        }
        var url = options.url.charAt(0) === '/' ? hostInfo + options.url : options.url;
        if ($.inArray(url, loadedScripts) === -1) {
            loadedScripts.push(url);
        } else {
            var found = $.inArray(url, $.map(pub.reloadableScripts, function (script) {
                return script.charAt(0) === '/' ? hostInfo + script : script;
            })) !== -1;
            if (!found) {
                xhr.abort();
            }
        }
    });

    $(document).ajaxComplete(function (event, xhr, settings) {
        var styleSheets = [];
        $('link[rel=stylesheet]').each(function () {
            if ($.inArray(this.href, pub.reloadableScripts) !== -1) {
                return;
            }
            if ($.inArray(this.href, styleSheets) == -1) {
                styleSheets.push(this.href)
            } else {
                $(this).remove();
            }
        })
    });
}

return pub;
})(jQuery);

jQuery(document).ready(function () {
    yii.initModule(yii);
});

有什么问题?我错过了什么。我在javascript方面不是很好。这个js文件yii.activeForm.js在web / assets / b807742中 因为这个错误模态不起作用

1 个答案:

答案 0 :(得分:3)

您需要插入:

<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>

作为您网页上的第一个脚本。这是您需要jQuery库来实现此功能的。它是其中一个依赖项。