Вид с вкладками / несколько диаграмм Google возвращают ошибку «e null»

0

У меня есть экран с вкладками на странице wordpress. На каждой вкладке должна отображаться другая круговая диаграмма.

код:

  google.load("visualization", "1", {packages:["corechart"]});
  google.setOnLoadCallback(drawChart);
  google.setOnLoadCallback(drawChart2);

    function drawChart() {
    var data = google.visualization.arrayToDataTable([
      ['Level', ''],
      ['High Scool',     <?php echo $myrows->EduHsch;?>],
      ['Some College',      <?php echo $myrows->EduScoll;?>],
      ['Associate Degree',  <?php echo $myrows->EduAssoc;?>],
      ['Bachelor Degree', <?php echo $myrows->EduBach;?>],
      ['Graduate Degree',    <?php echo $myrows->Mardivor;?>]
    ]);

    var options = {
      title: 'Highest Level of Education',
      is3D: true,
    };

    var chart = new google.visualization.PieChart(document.getElementById('education'));
    chart.draw(data, options);
  }

    function drawChart2() {
    var data = google.visualization.arrayToDataTable([
      ['Level', ''],
      ['Never Married',     <?php echo $myrows->MarNever;?>],
      ['Married',      <?php echo $myrows->MarMarr;?>],
      ['Seperated',  <?php echo $myrows->Marsep;?>],
      ['Widowed', <?php echo $myrows->MarWidow;?>],
      ['Divorced',    <?php echo $myrows->EduGrad;?>]
    ]);

    var options = {
      title: 'Marital Status',
      is3D: true,
    };

    var chart = new google.visualization.PieChart(document.getElementById('mar_chart_div'));
    chart.draw(data, options);
  }

HTML:

     <div class="su-tabs su-tabs-style-default" data-active="1">
    <div class="su-tabs-nav" ><span class="" >Education</span><span class="" >Marital  Status</span><span class="" id="hh">Households</span><span class="">Commute</span></div>
    <div class="su-tabs-panes">
    <div class="su-tabs-pane su-clearfix" style="width: 500px; height: 500px;display:block;" id="education">Education</div>
    <div class="su-tabs-pane su-clearfix" style="width: 500px; height: 500px;display:block;"  id="mar_chart_div">Marital Status</div>
    <div class="su-tabs-pane su-clearfix" style="width: 500px; height: 500px;display:block;"  id="house_chart_div">Households</div>
    <div class="su-tabs-pane su-clearfix"style="width: 500px; height: 500px;display:block;"  id="commute_chart_div">Commute</div>
    </div>

При загрузке страницы он правильно отображает диаграмму для образования, но как только я выберу любую другую вкладку, она показывает, что "e равно null",

Теги:
charts
google-visualization

1 ответ

0

Известно, что диаграммы чертежей внутри скрытых div (которые являются большинством интерфейсов табуляции) вызывают проблемы в API визуализации, хотя это сообщение об ошибке не то, что я ожидаю увидеть как прямой результат использования вкладок. Решение этой проблемы, вероятно, будет итеративным процессом, поэтому я хотел бы начать с нескольких различных подходов, чтобы исключить некоторые возможные причины.

Сначала создайте эту функцию:

function initialize () {
    drawChart();
    drawChart2();
}

и замените google.load и google.setOnLoadCallback следующим образом:

google.load("visualization", "1", {packages:["corechart"], callback: initialize});

Перезагрузите страницу с этими изменениями. Вы все еще видите ошибку?

[Изменить - добавлен общий код, чтобы помочь с проблемами с вкладками]

Во-первых, консолидация вашего кода в одну функцию рисования, вероятно, поможет вам здесь, так как вам необходимо скопировать чертеж двух диаграмм. Этот код является примером инициализации ваших вкладок после рисования диаграмм:

function drawChart () {
    var data1 = google.visualization.arrayToDataTable([
        ['Level', ''],
        ['High Scool', <?php echo $myrows->EduHsch;?>],
        ['Some College', <?php echo $myrows->EduScoll;?>],
        ['Associate Degree', <?php echo $myrows->EduAssoc;?>],
        ['Bachelor Degree', <?php echo $myrows->EduBach;?>],
        ['Graduate Degree', <?php echo $myrows->Mardivor;?>]
    ]);

    var options1 = {
        title: 'Highest Level of Education',
        is3D: true,
    };

    var chart1 = new google.visualization.PieChart(document.getElementById('education'));

    var data2 = google.visualization.arrayToDataTable([
        ['Level', ''],
        ['Never Married', <?php echo $myrows->MarNever;?>],
        ['Married', <?php echo $myrows->MarMarr;?>],
        ['Seperated', <?php echo $myrows->Marsep;?>],
        ['Widowed', <?php echo $myrows->MarWidow;?>],
        ['Divorced', <?php echo $myrows->EduGrad;?>]
    ]);

    var options2 = {
        title: 'Marital Status',
        is3D: true,
    };

    var chart2 = new google.visualization.PieChart(document.getElementById('mar_chart_div'));

    var chartsReady = {
        chart1: false,
        chart2: false
    }

    function initTabs () {
        // initialize tab interface here
    }

    google.visualization.events.addListener(chart1, 'ready', function () {
        chartsReady.chart1 = true;
        if (chartsReady.chart2) {
            initTabs();
        }
    });
    google.visualization.events.addListener(chart2, 'ready', function () {
        chartsReady.chart2 = true;
        if (chartsReady.chart1) {
            initTabs();
        }
    });

    chart1.draw(data1, options1);
    chart2.draw(data2, options2);
}

Если вместо этого вы хотите нарисовать каждый график, когда он сначала откроет вкладку контейнера, тогда вы хотите что-то вроде этого:

function drawChart () {
    var data1 = google.visualization.arrayToDataTable([
        ['Level', ''],
        ['High Scool', <?php echo $myrows->EduHsch;?>],
        ['Some College', <?php echo $myrows->EduScoll;?>],
        ['Associate Degree', <?php echo $myrows->EduAssoc;?>],
        ['Bachelor Degree', <?php echo $myrows->EduBach;?>],
        ['Graduate Degree', <?php echo $myrows->Mardivor;?>]
    ]);

    var options1 = {
        title: 'Highest Level of Education',
        is3D: true,
    };

    var chart1 = new google.visualization.PieChart(document.getElementById('education'));

    function tab1Open () {
        chart1.draw(data1, options1);
    }

    // hook up an event handler on your tabs that calls tab1Open when the education tab is opened

    var data2 = google.visualization.arrayToDataTable([
        ['Level', ''],
        ['Never Married', <?php echo $myrows->MarNever;?>],
        ['Married', <?php echo $myrows->MarMarr;?>],
        ['Seperated', <?php echo $myrows->Marsep;?>],
        ['Widowed', <?php echo $myrows->MarWidow;?>],
        ['Divorced', <?php echo $myrows->EduGrad;?>]
    ]);

    var options2 = {
        title: 'Marital Status',
        is3D: true,
    };

    var chart2 = new google.visualization.PieChart(document.getElementById('mar_chart_div'));

    function tab2Open () {
        chart2.draw(data2, options2);
    }

    // hook up an event handler on your tabs that calls tab2Open when the mar_chart_div tab is opened
}

Обе эти концепции могут быть расширены, чтобы включать произвольное количество графиков и вкладок.

  • 0
    Я попробовал то, что вы предложили, и кажется, что он делает вчера трюк, но теперь он говорит - Не могу прочитать свойство 'length' null Можете ли вы объяснить, как это сделать. Разве div не должен быть в "display: none"? Если я этого не сделаю, то это показывает, что диаграммы вместе, но я не хочу. Диаграмма должна отображаться только при нажатии на конкретную вкладку
  • 0
    Следующая часть - заняться рисованием. У вас есть два основных варианта: либо нарисовать все диаграммы перед инициализацией вкладок, либо нарисовать каждый график при первом открытии вкладки контейнера.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню