2017-10-13 14 views
0

我使用createElement()/ createTextNode()創建了不同的元素 - 段落,並將它們添加到主體中。在使用createElement()生成的元素上添加事件和函數

我的問題是,我想讓這些div鏈接或能夠添加事件,如onclick,顯然沒有HTML代碼來做到這一點。只是JavaScript生成的對象。

我的代碼大氣壓:

for (i=0; i<10; i++){ 
    var newDiv = document.createElement("div"); 
    newDiv.className = "block"; 
    var heading = document.createElement("h2"); 
    var newContent = document.createTextNode(data[1][i]); 
    heading.className="title"; 
    heading.appendChild(newContent); 
    newDiv.appendChild(heading); 
    var paragraph = document.createElement("p"); 
    var newContent2 = document.createTextNode(data[2][i]); 
    paragraph.className="light"; 
    paragraph.appendChild(newContent2); 
    newDiv.appendChild(paragraph); 

    var currentDiv = document.getElementById("div1"); 
    document.body.insertBefore(newDiv, currentDiv); 


    } 
+0

將它們添加到'body'後,您可以選擇它們,就像頁面上的任何其他元素一樣。您可以爲元素添加屬性,例如'id',以便更輕鬆地進行選擇。 –

+1

不確定是什麼問題?您可以在'.createElement()'調用 – guest271314

回答

1

您可以將事件監聽器添加到您剛剛創建的對象。該對象不一定是HTML。 Read more about adding event listeners,看看簡單的例子:

var someDiv = document.createElement('div'); 
 
var txt = document.createTextNode('click me'); 
 
someDiv.append(txt); 
 
document.body.append(someDiv); 
 

 
var myFancyFunction = function() { 
 
    alert('you clicked me'); 
 
}; 
 

 
someDiv.addEventListener('click', myFancyFunction);

更新你的代碼後,你可以添加一個事件偵聽器,這些你快速創建對象。您也可以在同一個事件中添加不同的功能。在這種情況下,它的兩個元素/對象相同的功能。與此玩法:(我改變了數據爲「假數據」,因爲沒有數據)

var myClick = function(event) { 
 
    alert(event.target.innerHTML); 
 
}; 
 

 
for (i=0; i<10; i++){ 
 
    var newDiv = document.createElement("div"); 
 
    newDiv.className = "block"; 
 
    var heading = document.createElement("h2"); 
 
    var newContent = document.createTextNode('dummy data1 index: ' + i); 
 
    heading.className="title"; 
 
    heading.appendChild(newContent); 
 
    newDiv.appendChild(heading); 
 
    var paragraph = document.createElement("p"); 
 
    var newContent2 = document.createTextNode('dummy data2 index: ' + i); 
 
    paragraph.className="light"; 
 
    paragraph.appendChild(newContent2); 
 
    newDiv.appendChild(paragraph); 
 

 
    var currentDiv = document.getElementById("div1"); 
 
    document.body.insertBefore(newDiv, currentDiv); 
 

 
    heading.addEventListener('click', myClick); 
 
    paragraph.addEventListener('click', myClick); 
 

 
}

+0

之後將事件附加到創建的元素。代碼轉儲不是有用的*答案。說*你做了什麼,爲什麼它的作品,理想的參考更多的信息.​​.. –

+0

嗨@ T.J.Crowder感謝您的評論!你是對的!我正在努力 – caramba

+0

謝謝,這真的很有幫助。我用for循環創建了不同的元素。我想我需要分配ID給他們一個變量來定位他們 – Kostis

0

一旦元素被添加到dom,您可以選擇它就像任何其他元素。

// Create the element 
 
var paragraph = document.createElement('p'); 
 

 
// Give it an `id` 
 
paragraph.id = 'foo'; 
 

 
// Add the element to the `dom` 
 
document.body.appendChild(paragraph); 
 

 
// Add the listener 
 
paragraph.addEventListener('click', function() { 
 
    this.innerHTML = 'It was clicked'; 
 
});
p { 
 
    height:20px; 
 
    padding:10px; 
 
    outline:1px solid #bada55; 
 
}

在上面的例子中,我添加一個id。如果由於某種原因,您需要重新選擇元素,它可能會更容易。

+1

完全**零理由做上面的getElementById(無論如何,沒有理由爲了這個目的)。你*已經*有'段落'中元素的引用。 –

+0

@ T.J.Crowder True。補充說,答案。我會說,添加'id'不一定是個壞主意。您可能需要稍後使用插件或其他內容進行選擇。誰知道?謝謝你指出,雖然很快,沒有想到:) –

0

你可以簡單地調用addEventListener在JS生成的對象,它們被插入之前就到DOM,或從來沒有插入所有:

let div = document.createElement('div'); 

div.addEventListener('click', function(event) { 
    // do something 
}); 

// This will trigger a call of the registered click callback, 
// regardless of whether the div is in the DOM: 
div.dispatchEvent(new Event('click', { 
    "bubbles": true, 
    "cancelable": false, 
})); 

// To add it to the DOM, simply add it the way you wish: 
document.body.appendChild(div); 
相關問題