javascript - 如何在动态创建的 div 上附加一个元素

标签 javascript html css

我是一名吉他迷,我尝试为吉他指法制作一个 UI。

在我的js代码中,可以看到

var notes = ['s6f1', 's5f5', 's4f7', 's3f6', 's2f5', 's1f3', 's6f8', 's5f1', 's4f6', 's3f1', 's2f3', 's1f3', 's6f9', 's5f17', 's4f19'];

's6f1' 表示 6 弦和 1 品,我想在指法谱上显示它。我展示这个的方式是在字符串6上放一个“1”。请看下图。在我的代码中,我基本上遍历了 notes 数组并将每个音符附加到 tablature 上。我把每 6 六行定义为一组。在一个组中填满 4 个音符后,将显示一个新组。因为在我的实际应用中,我不知道笔记数组有多少个笔记(在这个例子中,我只是简化了有 15 个笔记),我必须动态创建每个组并为每一行分配一个唯一的 id。我的问题是我不知道如何将数字附加到字符串上。例如,在动态创建一个“六行”后,如何在正确的行上附加该数字。我认为我的问题的挑战在于我无法在 html 中预定义六行的位置。下面的代码是我写的html、css、js代码。希望有人能帮助我。先感谢您。

enter image description here

html:

<!DOCTYPE html>
<html>
<head>
    <link type="text/css" rel="stylesheet" href="code.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <script type="text/javascript" src="code_js.js"></script>
</head>
<body>

    </div>

        <div id = "output">

</body>
</html>

CSS:

.deco {
    border-bottom: 1px solid black;
    width: 120px;
    margin-left:0px;
    margin-bottom:10px;
    z-index: 2;
    position: relative;
    display: block;
    margin-right: 20px;
}


#output {
    width: 300px;
    height: 200px;
    position:absolute;
    float:left;
    background-color: yellow;
}


.six_line {
    width: 125px;
    height: 80px;
    float:left;
    margin-right: 20px;
}

js:

"use strict"
var count = 0;
var group = -1;
$(document).ready(function() {
    var notes = ['s6f1', 's5f5', 's4f7', 's3f6', 's2f5', 's1f3', 's6f8', 's5f1', 's4f6', 's3f1', 's2f3', 's1f3', 's6f9', 's5f17', 's4f19'];
    hideNote(notes, 0);
});

function hideNote(notes, i) {
    var x = -2;
    if(count == 4) {count = 0;}
    if(count++ == 0) {
        group++;
        makeItHappen();
    } 
    var ns4 = notes[i];
    // retrive the info of string
    var ns2 = ns4.substring(0,2);
    x = parseInt(ns4.substring(1,2)) + (group*6);
   **/*How to attach fret(#) on the string*
       // finds the line with corresponding id
       $('#hr' + x).attr('class', '?');
   */**
    hide(function(){
        if(++i < notes.length) {
            hideNote(notes, i);
        }
    },notes[i]);
}

function hide(callback, note) {
    setTimeout(function(){
        callback();
    }, 1000); 
}

function makeItHappen() {
    var six = document.createElement('div');
    six.className = "six_line";
    for (var i = 1; i < 7; i++) {
        var hr = document.createElement('hr');
        hr.className = "deco";
        hr.id = "hr" + (group * 6 + i);
        six.append(hr);
    }
    $('#output').append(six);
}

最佳答案

我建议对您的代码进行一些修改。 从创建字符串的函数开始:

function makeItHappen(nbGroup) {  
    for(var g = 1; g <= nbGroup; g++){
        var six = document.createElement('div');
        six.className = "six_line";
        for (var i = 6; i >= 1; i--) {
            var string = document.createElement('div');
            string.className = "deco";
            string.id = "string" + ('G' + g + 'S' + i);
            six.append(string);
        } 
        $('#output').append(six);
    }
}

这将同时创建所有字符串组。为它们中的每一个分配一个明确的 ID 变得很容易:strGiSj 其中 i 是组,j 是组中的字符串。

接下来,hideNode函数怎么样:

function hideNote(notes) {
    makeItHappen(Math.ceil(notes.length / 4));

    notes.forEach(function(n, i){
        var values = n.match(/s(\d)f(\d)/); // values[1] = string, values[2] = fret
        var parentEl = $("#stringG" + (Math.ceil((i + 0.5) / 4)) + "S" + values[1]);
        var child = $("<div></div>")
            .addClass("fret")
            .css("left", (10+ (i%4) * 25) + "px")
            .text(values[2]);

        parentEl.append(child)
    });
}

我们创建所需数量的组(音符数量/4 四舍五入到下一个整数)。对于数组中的每个音符,我们使用正则表达式 /s(\d)f(\d+)/ 检索字符串和品格:

  • \d 匹配一个数字
  • \d+ 匹配一位或多位数字
  • 括号允许轻松检索值

接下来,我们只需要检索适当的组,并检索具有良好 id 的关联 div,然后创建 fret 元素并放置它。

完整代码如下:

"use strict"

$(document).ready(function() {
    var notes = ['s6f1', 's5f5', 's4f7', 's3f6', 's2f5', 's1f3', 's6f8', 's5f1', 's4f6', 's3f1', 's2f3', 's1f3', 's6f9', 's5f17', 's4f19'];
    hideNote(notes);
});

function hideNote(notes) {

    makeItHappen(Math.ceil(notes.length / 4))

    notes.forEach(function(n, i){
      var values = n.match(/s(\d)f(\d+)/);
      var parentEl = $("#stringG" + (Math.ceil((i + 0.5) / 4)) + "S" + values[1]);
      var child = $("<div></div>")
        .addClass("fret")
        .css("left", (10+ (i%4) * 25) + "px")
        .text(values[2]);

      parentEl.append(child)
    })
}

function makeItHappen(nbGroup) {  
  for(var g = 1; g <= nbGroup; g++){
    var six = document.createElement('div');
    six.className = "six_line";
    for (var i = 6; i >= 1; i--) {
        var string = document.createElement('div');
        string.className = "deco";
        string.id = "string" + ('G' + g + 'S' + i);
        six.append(string);
    }
    $('#output').append(six);
  }
}

这是一个codepen带有工作样本。

关于javascript - 如何在动态创建的 div 上附加一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40813434/

相关文章:

javascript - Bootstrap 表插件在 'rtl' 表中不起作用

javascript - Angular Material 中居中对齐的网格列表

javascript - jquery select2 - 通过 AJAX php 格式化结果

javascript - 如何让0返回true?

javascript - 我想在LiveSearch中添加一个加载png

javascript - 将动画 gif 分配给播放器函数

javascript - 简单的 javascript 表单提交有 2 个句柄?

javascript - 从 JavaScript 渲染 HTML

html - 桌面版的 Bootstrap header 正在消失

css - 为具有特定类别的 div 的最后一个子元素设置样式