1

I am building an interactive graph app where the user would upload a data file. The app would then build the graph from the input file.

I am having problems with making the input work with a graph API (cytoscape). More specifically, the file dialog window does not pop up when I include the div. That is, the input button is not responsive unless I comment out the API div.

Please see the code below. I guess this is not specific to the graph component. However, I could not get to the bottom of this, so I am posting the complete instance of the problem.

function updateSize() {
  let nBytes = 0,
    oFiles = this.files,
    nFiles = oFiles.length;
  for (let nFileId = 0; nFileId < nFiles; nFileId++) {
    nBytes += oFiles[nFileId].size;
  }
  let sOutput = nBytes + " bytes";
  // optional code for multiples approximation
  const aMultiples = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
  for (nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
    sOutput = nApprox.toFixed(3) + " " + aMultiples[nMultiple] + " (" + nBytes + " bytes)";
  }
  // end of optional code
  document.getElementById("fileNum").innerHTML = nFiles;
  document.getElementById("fileSize").innerHTML = sOutput;
  console.log("AAAA!")
}

document.getElementById("uploadInput").addEventListener("change", updateSize, false);

// https://blog.js.cytoscape.org/2016/05/24/getting-started/
var cy = cytoscape({
  container: document.getElementById('cy'),
  // ~~~~~~~~~~~~~~~~~~~
  elements: [{
      data: {
        id: 'a'
      }
    },
    {
      data: {
        id: 'b'
      }
    },
    {
      data: {
        id: 'ab',
        source: 'a',
        target: 'b'
      }
    }
  ],
  // ~~~~~~~~~~~~~~~~~~~
  style: [{
    selector: 'node',
    style: {
      shape: 'hexagon',
      'background-color': 'red',
      label: 'data(id)'
    }
  }]
});
cy.layout({
  name: 'circle'
}).run();
#cy {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0px;
  left: 0px;
}
<body>
  <form name="uploadForm">
    <div>
      <input id="uploadInput" type="file" name="myFiles" multiple> selected files: <span id="fileNum">0</span>; total size: <span id="fileSize">0</span>
    </div>

    <div><input type="submit" value="Send file"></div>
  </form>

  <div>
    <h1>This!</h1>
  </div>

  <div id="cy"></div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.20.0/cytoscape.min.js" integrity="sha512-cjmYAonfXK+azDmWqvnqq8xmygHRHqVI7S0zuRxQnvcYVeoakwthRX6pPKoXfG1oIjDvMUtteRV9PhQjJwKWxQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</body>
isherwood
  • 58,414
  • 16
  • 114
  • 157
Ozan.kah
  • 91
  • 8
  • 3
    looks like your div `#cy` could be covering your input. It's style are absolute 100% by 100%. It is stacked on top of your input, so when you think you are clicking your input you are actually clicking the div. – zgood Nov 19 '21 at 16:03

0 Answers0