2011-12-06 14 views
10

HTML:appendChild काम नहीं कर रहा

<ul id="datalist"> 
</ul> 

जावास्क्रिप्ट:

function add(content){ 
    ul=document.getElementsByTagName("ul"); 
    var li=document.createElement("li"); 
    li.innerHTML=content; 
    ul.appendChild(li); 
} 

जब मैं फोन add, Uncaught TypeError: Object #<NodeList> has no method 'appendChild' फेंक दिया है। कोई विचार क्यों?

+3

यदि कोई jquery नहीं है, तो सवाल के लिए इसे टैग के रूप में क्यों जोड़ें? –

+0

क्षमा करें, मुझे वास्तव में पता नहीं है कि इसे Jquery के साथ टैग किया गया है। टैग जावास्क्रिप्ट और डोम हैं। सही? – bingjie2680

+0

जब प्रश्न बनाया गया था तो इसे 'jQuery' के साथ टैग किया गया था - जैस्पर ने इसे इसके बजाय' जावास्क्रिप्ट 'के साथ बदलने के लिए संपादित किया है। –

उत्तर

20

getElementsByTagName() एक तत्व वापस नहीं करता है, यह NodeList देता है, जो एक सरणी जैसी वस्तु है। इसका मूल रूप से मतलब है कि आप इसे एक सरणी के रूप में उपयोग कर सकते हैं।

तो तुम, उदाहरण के लिए कर सकता है:

var ul = document.getElementsByTagName("ul")[0]; 

लेकिन क्यों आप बस, getElementById() का उपयोग नहीं करते, तो उस सूची वैसे भी एक आईडी है? आईडी पूरे दस्तावेज़ में अद्वितीय होना चाहिए, इसलिए यह विधि केवल एक तत्व लौटाएगी।

var ul = document.getElementById('datalist'); 

नोट: कृपया अपने कार्य करने के लिए एक स्थानीय चर के रूप में घोषित करने के लिए ul (var जोड़ें), जब तक आप समारोह के बाहर इसका इस्तेमाल करने का मतलब यह सुनिश्चित करें।

+0

जब मैं getElementById का उपयोग करता हूं, तो कंसोल आउट 'अनकॉट टाइप एरर: कॉल कॉल नहीं कर सकता' appendChild 'of null' – bingjie2680

+0

@ bingije2680 मेरा [jsFiddle] (http://jsfiddle.net/CB9tD/) दिखाता है कि यह ठीक काम करता है :)। कृपया लिंक जांचें, और यदि आपको अभी भी समस्याएं हैं, तो अपने परिदृश्य के बारे में एक पहेली बनाएं। – kapa

+0

एन ... वायर्ड ... धन्यवाद। – bingjie2680

5

document.getElementsByTagName तत्व को वापस नहीं करता है, लेकिन तत्वों का एक ऐरे देता है।

आपको इस सरणी को लूप करने या कुछ अद्वितीय तत्व प्राप्त करने की आवश्यकता है।

देखो इस दस्तावेज़: https://developer.mozilla.org/en/DOM/element.getElementsByTagName

// check the alignment on a number of cells in a table. 

var table = document.getElementById("forecast-table"); 
var cells = table.getElementsByTagName("td"); 
for (var i = 0; i < cells.length; i++) { 
    var status = cells[i].getAttribute("data-status"); 
    if (status == "open") { 
     // grab the data 
    } 
} 
4

समस्या आपके पास जाता है कि getElementsByTagName() (बहुवचन समारोह के नाम पर 'एस' से गर्भित ध्यान दें) देता है एक सरणी डोम नोड्स, नहीं की एक एकल डोम नोड, जो appendChild() पर काम करने की अपेक्षा करता है; इसलिए आप जो नोड्स की सरणी के लिए आप के साथ काम करना चाहते हैं की पहचान करने की जरूरत है:

function add(content){ 
    ul=document.getElementsByTagName("ul")[0]; // the [0] identifies the first element of the returned array 
    var li=document.createElement("li"); 
    li.innerHTML=content; 
    ul.appendChild(li); 
} 

याद रखें कि अगर वहाँ पृष्ठ पर केवल एकul है, तो आप getElementsByTagName("ul")[0]या इस्तेमाल कर सकते हैं (और यह बेहतर हो सकता है) उस ul पर विशेषता जोड़ें और फिर इसे getElementById() के साथ चुनें, जो अपेक्षा की जाएगी, केवल id लौटाएं।

संदर्भ: