Пользовательский метод валидатора jQuery undefined * иногда * - PullRequest
0 голосов
/ 28 сентября 2018

Я иногда получал странную ошибку, сообщаемую в Sentry, что один из наших пользовательских методов проверки jQuery не определен.Однако это должно быть невозможным - мы используем веб-пакет для объединения наших скриптов, а пользовательские методы объединяются в один пакет с jQuery и валидатором.

Это очень редкоошибка, и 75% устройств, которые запускают это iPad.Я хотел бы проигнорировать это, но это продолжает беспокоить меня.Как это может произойти?

Вот особенности ...

  • Пользовательский метод называется "NoPOBoxes"
  • Конкретная ошибка, сообщаемая Sentry:«Невозможно прочитать свойство 'call' из неопределенного. Возникла исключительная ситуация при проверке элемента BillAddress2, проверьте метод 'NoPOBoxes'."
  • Строка, которая вызывает ошибку: result = $.validator.methods[ method ].call( this, val, element, rule.parameters );

Webpack создает для нас два пакета: основной и вспомогательный:

webpack.config.js:

module.exports = {
    entry: {
        "main": [ "./dev/config/main.js" ],
        "sub": [ "./dev/config/sub.js" ]
....

main.js (соответствующая часть):

require('jquery');
require("../source/jQueryPlugins/Validator/1.17.0");
require("../source/jquery.validate.1.17.0.CustomMethods");

Все остальное довольно стандартно, sub.js отвечает за настройку валидатора, всех правил и т. Д. Эти скрипты (main.js и sub.js) включены внизу страницы, например:

<script type="text/javascript" src="/includes/bundles/dist/main.js"></script>
<script type="text/javascript" src="/includes/bundles/dist/sub.js"></script>

Также у sub.js есть последний отказоустойчивый.Прежде чем что-либо делать, он проверяет, определен ли jQuery.Таким образом, поскольку jQuery, валидатор и наши пользовательские методы валидатора все определены в main.js - это должно означать, что если jQuery определен, то определены пользовательские методы валидатора и валидатора.

(function() {
    var jQueryLoading = setInterval(function() {
        if (typeof($) === "function") {
            clearInterval(jQueryLoading);
            $(document).ready(function(){
                // do stuff
            });
        }
    }, 100);
})();

Кто-нибудь может увидеть, что я что-то упустил?

...