html 输入 cytoscape.js 无法打开对话框 window
html input with cytoscape.js fails to open the dialog window
我正在构建一个交互式图形应用程序,用户可以在其中上传数据文件。然后应用程序将从输入文件构建图形。
我在使用 cytoscape 进行输入时遇到问题。更具体地说,当我包含 div 时,文件对话框 window 不会弹出。也就是说,除非我注释掉 cytoscape ,否则输入按钮没有响应。
请看下面的代码。我想,这不是 cytoscape 特有的。但是,我无法深入了解,所以我发布了问题的完整实例。
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<script src="cytoscape.js"></script>
</head>
<style>
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
}
</style>
<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>
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);
</script>
<script>
// 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();
</script>
</body>
</html>
与div的z-index有关。在您的情况下,因为您没有将 z-indexes 分配给 divs 并在末尾添加 cy
div,所以它呈现在顶部,因此您无法与按钮交互.
可以给cy
赋一个z-index div比如-1发送到后台:
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
z-index: -1;
}
但在这种情况下,您将无法与 cy canvas 的顶部进行交互。更好的解决方案是将 top
属性更改为某个值,例如 250px,以便 cy
canvas 开始呈现在按钮和文本下方:
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 250px;
left: 0px;
}
我正在构建一个交互式图形应用程序,用户可以在其中上传数据文件。然后应用程序将从输入文件构建图形。
我在使用 cytoscape 进行输入时遇到问题。更具体地说,当我包含 div 时,文件对话框 window 不会弹出。也就是说,除非我注释掉 cytoscape ,否则输入按钮没有响应。
请看下面的代码。我想,这不是 cytoscape 特有的。但是,我无法深入了解,所以我发布了问题的完整实例。
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<script src="cytoscape.js"></script>
</head>
<style>
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
}
</style>
<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>
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);
</script>
<script>
// 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();
</script>
</body>
</html>
与div的z-index有关。在您的情况下,因为您没有将 z-indexes 分配给 divs 并在末尾添加 cy
div,所以它呈现在顶部,因此您无法与按钮交互.
可以给cy
赋一个z-index div比如-1发送到后台:
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
z-index: -1;
}
但在这种情况下,您将无法与 cy canvas 的顶部进行交互。更好的解决方案是将 top
属性更改为某个值,例如 250px,以便 cy
canvas 开始呈现在按钮和文本下方:
#cy {
width: 100%;
height: 100%;
position: absolute;
top: 250px;
left: 0px;
}