未捕获的TypeError:无法读取null

时间:2016-08-21 20:14:53

标签: javascript graph plotly

我在这里重新创建了ploytly.js下拉图:

https://plot.ly/javascript/dropdowns/#bind-dropdown-events-to-plotlyjs-charts

我在我的应用程序中复制并粘贴了代码,它运行得很好。

现在我只想复制图表并将其放在原始图片下方。这是html:

<div class="showcase__section" id="bubble">
  <div class="spacer --small"></div>
  <div id="bubbleplots">
    <div class="bubbleplot" data-num="0">
      <div class="plot" id="plotdiv"></div>
      <div class="control-row">
        Country: <select class="countrydata">
        </select>
      </div>
    </div>
  </div>
</div>

<div class="showcase__section" id="bubble">
  <div class="spacer --small"></div>
  <div id="bubbleplots">
    <div class="bubbleplot" data-num="0">
      <div class="plot1" id="plotdiv1"></div>
      <div class="control-row">
        Country: <select class="countrydata1">
        </select>
      </div>
    </div>
  </div>

我更改了3个div,因此javascript可以区分它们。

以下是javascript。再次,我更改了第二个图的一些变量的名称。否则,第一个和第二个图的javascript是相同的。

第一张图完全显示在我的应用中,但第二张图存在问题。第二个图表显示,图表上的数据正确,弹出菜单显示但没有国家/地区名称。我是第二个图表的console.log('currentOption1')三次分开。 控制台前两次按预期返回,但第三次显示“未捕获的TypeError:无法读取属性”附加“null”。 <问题在于

selector.appendChild(currentOption1);

再次

selector.appendChild(currentOption);

与第一张图完美配合。

所以currentOption1为null。为什么,我该如何解决?

以下是two graphs

的链接
Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv', function(err, rows){

    function unpack(rows, key) {
        return rows.map(function(row) { return row[key]; });
    }

var allCountryNames = unpack(rows, 'country'),
    allYear = unpack(rows, 'year'),
    allGdp = unpack(rows, 'gdpPercap'),
    listofCountries = [],
    currentCountry,
    currentGdp = [],
    currentYear = [];

  for (var i = 0; i < allCountryNames.length; i++ ){
    if (listofCountries.indexOf(allCountryNames[i]) === -1 ){
      listofCountries.push(allCountryNames[i]);
    }
  }

  function getCountryData(chosenCountry) {
    currentGdp = [];
    currentYear = [];
    for (var i = 0 ; i < allCountryNames.length ; i++){
      if ( allCountryNames[i] === chosenCountry ) {
        currentGdp.push(allGdp[i]);
        currentYear.push(allYear[i]);
      }
    }
  };

// Default Country Data
setBubblePlot('Afghanistan');

function setBubblePlot(chosenCountry) {
    getCountryData(chosenCountry);

    var trace1 = {
      x: currentYear,
      y: currentGdp,
      mode: 'lines+markers',
      marker: {
        size: 12,
        opacity: 0.5
      }
    };

var data = [trace1];

var layout = {
  title: 'GDP per cap according to Country<br>'+ chosenCountry + ' GDP'
};

    Plotly.newPlot('plotdiv', data, layout);
};

var innerContainer = document.querySelector('[data-num="0"'),
    plotEl = innerContainer.querySelector('.plot'),
    countrySelector = innerContainer.querySelector('.countrydata');

function assignOptions(textArray, selector) {
  for (var i = 0; i < textArray.length;  i++) {
      var currentOption = document.createElement('option');
      currentOption.text = textArray[i];
      selector.appendChild(currentOption);
  }
}

assignOptions(listofCountries, countrySelector);

function updateCountry(){
    setBubblePlot(countrySelector.value);
}

countrySelector.addEventListener('change', updateCountry, false);
 });


Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv', function(err, rows){

    function unpack(rows, key) {
         return rows.map(function(row) { return row[key]; });
    }

var allCountryNames = unpack(rows, 'country'),
    allYear = unpack(rows, 'year'),
    allGdp = unpack(rows, 'gdpPercap'),
    listofCountries = [],
    currentCountry,
    currentGdp = [],
    currentYear = [];

  for (var i = 0; i < allCountryNames.length; i++ ){
    if (listofCountries.indexOf(allCountryNames[i]) === -1 ){
      listofCountries.push(allCountryNames[i]);
    }
  }

  function getCountryData(chosenCountry) {
    currentGdp = [];
    currentYear = [];
    for (var i = 0 ; i < allCountryNames.length ; i++){
       if ( allCountryNames[i] === chosenCountry ) {
        currentGdp.push(allGdp[i]);
        currentYear.push(allYear[i]);
      }
    }
  };

// Default Country Data
setBubblePlot('Brazil');

function setBubblePlot(chosenCountry) {
    getCountryData(chosenCountry);

    var trace1 = {
       x: currentYear,
       y: currentGdp,
      mode: 'lines+markers',
      marker: {
        size: 12,
        opacity: 0.5
      }
    };

    var data = [trace1];

    var layout = {
      title: 'GDP per cap according to Country<br>'+ chosenCountry + ' GDP'
    };

    Plotly.newPlot('plotdiv1', data, layout);
};

var innerContainer = document.querySelector('[data-num="0"'),
    plotEl = innerContainer.querySelector('.plot1'),
    countrySelector = innerContainer.querySelector('.countrydata1');

function assignOptions(textArray, selector) {
  for (var i = 0; i < textArray.length;  i++) {
      var currentOption1 = document.createElement('option');
        console.log('currentOption1')
      currentOption1.text = textArray[i];
      console.log('currentOption1')
      selector.appendChild(currentOption1);
      console.log('currentOption1')
  }
}

 assignOptions(listofCountries, countrySelector);

function updateCountry(){
    setBubblePlot(countrySelector.value);
}

countrySelector.addEventListener('change', updateCountry, false);
});

1 个答案:

答案 0 :(得分:1)

var innerContainer = document.querySelector('[data-num="0"')

调用第一个下拉框,我将其更改为

var innerContainer = document.getElementById('bubble1')

并且在我创建了&#39; bubble1&#39;之后,它从第二组相同数据中检索到了正确的数据。在html中使用id来区分两者。