2017-05-07 69 views
0

所以我有这个问题,每次我创建一个新的元素,我的Jscolor函数在新元素上工作,因为它需要一个唯一的ID。我不知道如何解决这个问题。创建一个新的独特的id每次我创建一个JavaScript中的新元素

我已经尝试过for循环等,并无法弄清楚如何。因为在JS函数中我需要选择一个ID,但是我如何选择一个刚刚创建的ID?

希望有人能帮助我解决这个问题:)

HTML代码:

<p class="half-circle"> 
    <button class="addNoteBtn"> 
     <i class="ion-android-add-circle"></i> 
    </button> 
</p> 

JS代码:

createNote = function(){ 

    var stickerEl = document.createElement('div'), 
     barEl = document.createElement('div'), 
     color = document.createElement('button'), 
     colorIcon = document.createElement('i'), 
     deleteBtn = document.createElement('button'), 
     deleteBtnIcon = document.createElement('i'), 
     moveIcon = document.createElement('i'), 
     colorEl = document.createElement('input'), 
     textareaEl = document.createElement('textarea'); 

    var transformCSSPosition = "translateX(" + Math.random() * 800 + "px) translateY(" + Math.random() * 400 + "px)"; 

    stickerEl.style.transform = transformCSSPosition; 


    barEl.classList.add('bar'); 
    stickerEl.classList.add('sticker'); 
    color.classList.add('color'); 
    deleteBtn.classList.add('deleteBtn'); 
    deleteBtnIcon.classList.add('ion-android-delete'); 
    colorIcon.classList.add('ion-android-color-palette'); 
    stickerEl.id = "1"; 

    colorEl.classList.add('jscolor'); 
    colorEl.onchange = function(){update(this.jscolor)}; 
    colorEl.value = "cc66ff"; 

    color.onclick = function() {showColorPicker}; 


    // tilføj til: 
    stickerEl.append(barEl); 
    stickerEl.append(color); 
    stickerEl.append(deleteBtn); 
    stickerEl.append(colorEl); 
    stickerEl.appendChild(textareaEl); 
    color.append(colorIcon); 
    deleteBtn.append(deleteBtnIcon); 
    barEl.append(moveIcon); 

    stickerEl.addEventListener('mousedown', onDragStart, false); 

    document.body.appendChild(stickerEl); 

}; 

    createNote(); 

    addNoteBtnEl = document.querySelector('.addNoteBtn'); 
    addNoteBtnEl.addEventListener('click', createNote, false); 

    document.addEventListener('mousemove', onDrag, false); 
    document.addEventListener('mouseup', onDragEnd, false); 

    function update(jscolor) { 
      document.getElementById('1').style.backgroundColor = '#' + jscolor; 
    } 
+0

为什么不是'document.createElement('div').id ='your_random_id';'? –

+0

@NirBen-Yair它仍然不会创建一个uniwue id。我将id设置为低一点,但是我想让id每次都独一无二,否则jscolor将无法工作! – Scripto

+0

你需要一个ID为什么?你有一个对节点本身的引用:'colorEl.onchange = function(){stickerEl.style.backgroundColor ='#'+ colorEl.value};' – Thomas

回答

1

你可以使用一个基本名称很可能是唯一的然后附加一个计数器,在每个新元素创建后增加计数器:

let getNewElement = (function() { 
 
    const idBase = 'my-unique-id-'; 
 
    let count = 0; 
 
    return function (type = 'div') { 
 
    let el = document.createElement(type); 
 
    el.id = idBase + count; 
 
    count += 1; 
 
    return el; 
 
    } 
 
}()); 
 

 
// create 3 new elements in an array 
 
let newElements = [getNewElement('div'), getNewElement('div'), getNewElement()]; 
 

 
// make the text of the elements the same as the id and 
 
// add them to the document 
 
newElements.forEach(function (el) { 
 
    el.textContent = el.id; 
 
    document.body.appendChild(el); 
 
});
div { 
 
    border: 1px solid #ccc; 
 
    margin: 1em; 
 
    padding: 1em; 
 
}

在上面的代码我使用Immediately Invoked Function Expression (IIFE)来封装计数器和基本名称,以便外的代码不能干扰它们。该IIFE返回另一个函数,这是调用getNewElement时实际调用的函数。内部函数通过closure访问counter,它创建新元素,给它它的id,然后递增counter,所以下次调用getNewElement时,它会得到一个新名称。

这种函数返回另一个函数是可能的,因为JavaScript支持higher-order programming,它简单地说就是说你可以像函数调用中的参数那样传递函数,或者像函数调用中的参数那样传递函数。由于IIFE在代码运行时立即被调用,它将返回分配给getNewElement的内部函数。

+0

好吧,但我如何在我已经有的代码中使用它?因为我已经创建了一个div,并且想要将它们命名为rect1,rect2等等。我不想使用数组,因为我需要在按下添加按钮时创建一个新元素。检查我的代码在这里: https://codepen.io/Qbinx/pen/OmObRg – Scripto

+0

我刚刚使用了数组,所以我可以轻松地遍历示例中的新对象,将它们添加到DOM,它与无关使用这种技术。在你的代码中,将你的'createNote'函数包装在一个IIFE中,并从IFFE返回现有的函数。您只需使用“rect”的基本名称并在“1”处启动计数器以生成一系列名称,如“rect1”,“rect2”,“rect3”等。 –

+0

好吧,所以什么时候这样做,我怎么抓住通过使用getElement ById函数? 函数更新(jscolor){ \t document.getElementById('rect1').style。backgroundColor ='#'+ jscolor; } 这里我只是抓住了第一个。但是,我如何抓住下一个? – Scripto

相关问题