Javascript иногда не выполняет ajax код вызова - PullRequest
0 голосов
/ 26 мая 2020

Я создаю измерительную диаграмму, используя Raphael.js. Я использую ajax для вызова службы, которая вернет данные, которые должны отображаться на диаграмме датчика. В моем приложении есть несколько страниц HTML, на которых должна отображаться эта диаграмма, поэтому я создал общий файл Layout HTML, чтобы сделать код диаграммы общим. Я использую MVC CSHTML страниц.

Итак, проблема в том, что с первой HTML страницы, когда я вызываю код javascript для генерации диаграммы измерения, код ajax выполняется нормально и возвращает данные. Но с другой страницы вся ajax часть кода просто пропускается, и у меня нет данных для привязки в датчике. И в консоли также нет сообщения об ошибке.

Вот код JS для генерации датчика:

(function ($, window, document, undefined) {
    debugger;
    var leadid = jQuery("#hdnSessionLeadId").data('value');
    var scoreNeeded = jQuery("#hdnscoreNeeded").data('value');
    var min = 0;
    var max = 0;
    var value = 0;
    var insurabilityScore = 0;
    var scoreAvg = 0;
    var description = '';
    $.ajax({
        url: "GaugeChartData?Lead_ID=" + leadid + "&Lob=Auto&scoreNeeded=" + scoreNeeded,
        dataType: "json",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        async: false,
        cache: false,
        success: function (data) {
            if (data != "") {
                data = JSON.parse(data);
                min = data.scoreMin;
                max = data.scoreMax;
                debugger;
                insurabilityScore = data.insurabilityScore;
                insurabilityScore = 700;
                description = 'Excellent';

                if (insurabilityScore == 0) {
                    description = '';
                    insurabilityScore = '';
                }
                else {
                    //description = data.description;
                }
                 scoreAvg = data.scoreAvg;
                 value = data.insurabilityScore;
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('Got an Error');
        }
    });
    var config = {
        radius: 80,
        paddingX: 0,
        paddingY: 0,
        gaugeWidth: 15,

        fill: '0-#FE5249:5-#FA8B1B:12-#F8A903:20-#70CD60:90-#19C1E6:100-#19C1E6',
        gaugeBackground: '#f4f4f4',
        background: '#fff',

        showNeedle: true,
        showNeedles: true,
        animationSpeed: 1200,

        width: 200,
        height: 120,
        centerX: 0,
        centerY: 0,

        min: min,
        max: max,
        value: 0, 
        scoreAvg: scoreAvg,
        insurabilityScore: insurabilityScore,
        description: description,

        valueLabel: {
            display: true,
            fontFamily: 'Arial',
            fontColor: '#1ABFE9',
            fontSize: '50',
            fontWeight: 'normal',
            value: insurabilityScore,
        },
        valueLabel2: {
            display: true,
            fontFamily: 'Arial',
            fontColor: '#1ABFE9',
            fontSize: '18',
            fontWeight: 'normal',
            value: description,
        },
        title: {
            display: true,
            value: 'Avg',
            fontFamily: 'Arial',
            fontColor: '#000',
            fontSize: '10',
            fontWeight: 'normal',
            centerX: 0,
            centerY: 0,
        },
        title2: {
            display: true,
            value: 'You',
            fontFamily: 'Arial',
            fontColor: '#000',
            fontSize: '10',
            fontWeight: 'normal',
            centerX: 0,
            centerY: 0,
        },
        label: {
            display: true,
            left: min,
            right: max,
            fontFamily: 'Arial',
            fontColor: '#000',
            fontSize: '12',
            fontWeight: 'normal'
        }
    };

    // Create an arc with raphael.js
    Raphael.fn.arc = function (startX, startY, endX, endY, radius1, radius2, angle) {
        var arcSVG = [radius1, radius2, angle, 0, 1, endX, endY].join(' ');
        return this.path('M' + startX + ' ' + startY + ' a ' + arcSVG);
    };

    // Calculate a circular arc with raphael.js
    Raphael.fn.circularArc = function (centerX, centerY, radius, startAngle, endAngle) {
        var startX = centerX + radius * Math.cos(startAngle * Math.PI / 180);
        var startY = centerY + radius * Math.sin(startAngle * Math.PI / 180);
        var endX = centerX + radius * Math.cos(endAngle * Math.PI / 180);
        var endY = centerY + radius * Math.sin(endAngle * Math.PI / 180);
        return this.arc(startX, startY, endX - startX, endY - startY, radius, radius, 0);
    };


    // The kuma Gauge constructor
    function kumaGauge(element, options, method) {
        // This
        var _this = this;
        // The element
        _this.element = element;
        _this.$element = $(element);
        // The config
        _this.config = $.extend({}, config, options);
        _this._config = config;
        _this.method = method;
        // The actual gauge
        _this.gauge = {};
        // Initialise
        _this.init();
    }

    // Extend the kumaGauge object
    kumaGauge.prototype = {
        init: function () {
            // this
            _this = this;
            if (!_this.method) {
                _this.draw();
            }
        },
        _setup: function () {
            // This
            _this = this;
            // Calculate some values needed do draw the gauge
            _this.config.width = (_this.config.radius * 2) + (_this.config.paddingX * 2);
            _this.config.height = _this.config.radius + (_this.config.paddingY * 2);
            _this.config.centerX = _this.config.paddingX + _this.config.radius;
            _this.config.centerY = _this.config.paddingY + _this.config.radius;
            // The div wich acts as the canvas needs an id, so we give it a unique one if it doesn't have one
            if (typeof $(this).attr('id') === 'undefined' || $(this).attr('id') === '') {
                _this.config.id = 'gauge-' + $('*[id^="gauge-"]').length;
                _this.$element.attr('id', _this.config.id);
            }
        },
        _calculateRotation: function (min, max, val) {
            var _range, _rotation;
            _range = max - min;

            if (val < max && val > min) {
                _rotation = 180 * ((val - min) / _range);
            } else if (val <= min) {
                _rotation = 0;
            } else {
                _rotation = 180;
            }

            return _rotation;
        },
        draw: function () {
            //this
            var _this = this;

            // Setup all the needed config variables
            _this._setup();

            // Make the base drawing Canvas
            _this.gauge = new Raphael(_this.config.id, _this.config.width, _this.config.height);

            // Draw the gauge
            _this.gauge.gauge = _this.gauge.circularArc(_this.config.centerX, _this.config.centerY,
                _this.config.radius, 180, 0);
            _this.gauge.gauge.attr({
                'fill': _this.config.fill,
                'stroke': 'none',
                'height':'120px'
            });
            _this.gauge.gauge.node.setAttribute('class', 'gauge');

            // Draw the gauge background
            _this.gauge.gaugeBackground = _this.gauge.circularArc(_this.config.centerX, _this.config.centerY,
                _this.config.radius, 180, 0);
            _this.gauge.gaugeBackground.attr({
                'fill': _this.config.gaugeBackground,
                'stroke': 'none'
            });
            _this.gauge.gaugeBackground.node.setAttribute('class', 'gauge__background');

            // Draw the white center arc
            _this.gauge.centerArc = _this.gauge.circularArc(_this.config.centerX, _this.config.centerY,
                _this.config.radius - _this.config.gaugeWidth, 180, 0);
            _this.gauge.centerArc.attr({
                'fill': _this.config.background,
                'stroke': 'none'
            });
            _this.gauge.centerArc.node.setAttribute('class', 'gauge__center');
            _this.gauge.title2 = _this.gauge.text(_this.config.centerX - -50, _this.config.paddingY - -5,
                _this.config.title2.value);
            _this.gauge.title2.attr({
                'fill': '#55E5DA',
                'fill-opacity': 0,
                'font-size': _this.config.title2.fontSize,
                'font-family': _this.config.title2.fontFamily,
                'font-weight': _this.config.title2.fontWeight
            });

            //Draw the needle

            // Draw the bottom mask to hide the rotated background arc
            _this.gauge.bottomMask = _this.gauge.rect(0, _this.config.centerY, _this.config.width, 40);
            _this.gauge.bottomMask.attr({
                'fill': _this.config.background,
                'stroke': 'none'
            });

            // Draw the text container for the value
            if (_this.config.valueLabel.display) {

                    _this.gauge.valueLabel = _this.gauge.text(_this.config.centerX, _this.config.centerY - 30,
                        _this.config.insurabilityScore);

                _this.gauge.valueLabel.attr({
                    'fill': _this.config.valueLabel.fontColor,
                    'font-size': _this.config.valueLabel.fontSize,
                    'font-family': _this.config.valueLabel.fontColor,
                    'font-weight': _this.config.valueLabel.fontWeight
                });
                _this.gauge.valueLabel.node.setAttribute('class', 'gauge__value');
                _this.gauge.valueLabel.node.setAttribute('display', 'block');
            }
            // Draw the text container for the value
            if (_this.config.valueLabel2.display) {
                debugger;

                    _this.gauge.valueLabel2 = _this.gauge.text(_this.config.centerX, _this.config.centerY -0,
                        _this.config.description);

                _this.gauge.valueLabel2.attr({
                    'fill': _this.config.valueLabel2.fontColor,
                    'font-size': _this.config.valueLabel2.fontSize,
                    'font-family': _this.config.valueLabel2.fontColor,
                    'font-weight': _this.config.valueLabel2.fontWeight
                });
                _this.gauge.valueLabel2.node.setAttribute('class', 'gauge__value2');
                _this.gauge.valueLabel.node.setAttribute('display', 'block');
            }



            if (_this.config.label.display) {
                // Draw the left label
                _this.gauge.leftLabel = _this.gauge.text((_this.config.gaugeWidth / 2) + _this.config.paddingX + 2,
                    _this.config.centerY + 5, _this.config.label.left);
                _this.gauge.leftLabel.attr({
                    'fill': _this.config.title.fontColor,
                    'fill-opacity': 0,
                    'font-size': _this.config.label.fontSize,
                    'font-family': _this.config.label.fontFamily,
                    'font-weight': _this.config.label.fontWeight
                });
                _this.gauge.leftLabel.node.setAttribute('class', 'gauge__label--left');

                // Draw the right label
                _this.gauge.rightLabel = _this.gauge.text((_this.config.width - (_this.config.gaugeWidth / 2)) - _this.config.paddingX,
                    _this.config.centerY + 10, _this.config.label.right);
                _this.gauge.rightLabel.attr({
                    'fill': _this.config.title.fontColor,
                    'fill-opacity': 0,
                    'font-size': _this.config.label.fontSize,
                    'font-family': _this.config.label.fontFamily,
                    'font-weight': _this.config.label.fontWeight
                });
                _this.gauge.rightLabel.node.setAttribute('class', 'gauge__label--right');
            }

            setTimeout(function () {

                if (_this.config.title.display) {
                    _this.gauge.title.attr({
                        'fill-opacity': 1
                    });
                }
                if (_this.config.title2.display) {
                    _this.gauge.title2.attr({
                        'fill-opacity': 1
                    });
                }
                if (_this.config.label.display) {
                    _this.gauge.leftLabel.attr({
                        'y': _this.config.centerY + (_this.gauge.leftLabel.getBBox().height / 2),
                        'fill-opacity': 1,
                    });
                    _this.gauge.rightLabel.attr({
                        'y': _this.config.centerY + (_this.gauge.rightLabel.getBBox().height / 2),
                        'fill-opacity': 1,
                    });
                }
            }, 1000);
            // Animate the gauge to the right value position
            _this.gauge.gaugeBackground.animate({
                transform: 'r' +
                    _this._calculateRotation(_this.config.min, _this.config.max, _this.config.value) + ',' +
                    _this.config.centerX + ',' + _this.config.centerY
            }, _this.config.animationSpeed, '<>');

        },
        update: function (data) {
            //this
            var _this = this;
            var updateGauge = function (min, max, value) {
                _this.config.min = min;
                _this.config.max = max;
                _this.config.value = value;

                // Update the rotation of the gauge
                _this.gauge.gaugeBackground.animate({
                    transform: 'r' +
                        _this._calculateRotation(min, max, value) + ',' +
                        _this.config.centerX + ',' + _this.config.centerY
                }, _this.config.animationSpeed, '<>');

                // Update the value label
                if (_this.config.valueLabel.display) {
                    if (_this.config.showNeedle) {
                        _this.gauge.valueLabel.attr('text', value);
                    } else {
                        _this.gauge.valueLabel.attr('text', 500);
                    }
                }
            };

            if (typeof data.min !== 'undefined' && typeof data.max !== 'undefined' && typeof data.value !== 'undefined') {
                updateGauge(data.min, data.max, data.value);
            } else if (typeof data.value !== 'undefined') {
                updateGauge(_this.config.min, _this.config.max, data.value);
            }
        }
    };
    $.fn.kumaGauge = function (method, options) {
        var _method = method,
            _arguments = arguments,
            _this = this;
        if (typeof _method !== 'string') {
            if (_arguments.length === 1) {
                options = _method;
                method = false;

                return this.each(function () {
                    if (!$.data(this, 'kumaGauge')) {
                        $.data(this, 'kumaGauge', new kumaGauge(this, options, method));
                    }
                });
            }
        } else {
            return this.each(function () {
                if (typeof $.data(this, 'kumaGauge')[method] === 'function') {
                    $.data(this, 'kumaGauge')[method](options);
                }
            });
        }
    };
})(jQuery, window, document);

Диаграмма, созданная на первой странице, показана на первом рисунке. График, созданный на второй странице, находится на втором рисунке. Поскольку вызов ajax не выполняется, у меня нет данных для отображения на этой диаграмме датчика, поэтому отсутствуют данные

Раздел div, в котором создается датчик:

<div class="js-gauge js-gauge--1 gauge scaling-svg"></div>

Вот как работает вызывается из document.ready:

<script type="text/javascript">

    $('.js-gauge--1').kumaGauge({
        value: 1000,
    });
</script>
...