เติม HTML ‹select› ด้วยอาร์เรย์ Javascript

ฉันกำลังพยายามเติมช่องการเลือก HTML จากอาร์เรย์ JavaScript แต่เมื่อฉันรันเพจ คอนโซลของฉันแสดงผลดังต่อไปนี้:

Uncaught TypeError: Cannot read property 'appendChild' of null at hello.html:113

อย่างไรก็ตาม เนื่องจากสร้างโดย JavaScript innerHTML ฉันจึงไม่สามารถเลือกได้ มีวิธีอื่นในการเลือกสิ่งนี้หรือไม่?

var police_api_dates = ["&date=2017-03",];
var info = L.control();
info.onAdd = function (mymap) {
    this._div = L.DomUtil.create('div', 'info');
    this.update();
    return this._div;
};

info.update = function (properties) {
    this._div.innerHTML = '<select id="parent"></select><h4>Highlighted Postcode</h4>' +  (properties ?
        '<b> Postcode: ' + properties.Name
        : 'Hover over a state');
};
var parent = document.getElementById("parent");
for ( var pos = 0; pos < police_api_dates.length; pos++)
{
    //create an <option> to add the <select>
    var child = document.createElement("option");

    //assign values to the <option>
    child.textContent = police_api_dates[pos]
    child.value = pos;

    //attach the mew <option> to the <selection>
    parent.appendChild(child);
}


info.addTo(mymap);

person Adam    schedule 21.01.2018    source แหล่งที่มา
comment
var parent = document.getElementById("parent"); ได้รับการประเมินเพียง หนึ่งครั้ง เมื่อ JS ดำเนินการบรรทัดนี้ ต่อมาใน info.update() คุณแทนที่องค์ประกอบนี้ด้วยองค์ประกอบใหม่ (แม้ว่าจะมีรหัสเดียวกัน แต่เป็นองค์ประกอบอื่น)   -  person connexo    schedule 21.01.2018
comment
เป็นไปได้ไหมที่จะแนะนำการแก้ไขตามที่คุณชี้ให้เห็นว่าฉันยังไม่เห็นว่าฉันผิดตรงไหน   -  person Adam    schedule 21.01.2018
comment
เพียงลบบรรทัด var parent = document.getElementById("parent"); เท่านี้คุณก็พร้อมแล้ว วิธีนี้จะคืนค่าพฤติกรรมเริ่มต้นของเบราว์เซอร์ในการทำให้องค์ประกอบ id เข้าถึงได้โดย id โดยไม่ต้องประกาศตัวแปรและใช้ document.getElementById   -  person connexo    schedule 21.01.2018
comment
ฉันได้ลบ var parent = document.getElementById(parent); และ parent.appendChild (ลูก);   -  person Adam    schedule 21.01.2018
comment
อย่างไรก็ตาม ปัญหาของฉันคือตอนนี้กล่องตัวเลือกปรากฏว่างเปล่าแทนที่จะแสดงสิ่งที่อยู่ในอาร์เรย์   -  person Adam    schedule 21.01.2018
comment
parent.appendChild(child); จะต้องไม่ถูกลบ   -  person connexo    schedule 21.01.2018
comment
Uncaught TypeError: parent.appendChild ไม่ใช่ฟังก์ชัน   -  person Adam    schedule 21.01.2018
comment
คุณต้องตรวจสอบให้แน่ใจว่าในขณะที่ดำเนินการ parent.appendChild(child); นั้น DOM มีองค์ประกอบที่มี id=parent   -  person connexo    schedule 21.01.2018
comment
this._div.innerHTML = '‹select id=parent›‹/select› สิ่งนี้ไม่ได้ถูกสร้างขึ้นในบรรทัดนี้ใช่หรือไม่   -  person Adam    schedule 21.01.2018
comment
ที่อยู่ภายในฟังก์ชัน และจะดำเนินการเมื่อมีการเรียกใช้ฟังก์ชันเท่านั้น   -  person connexo    schedule 21.01.2018
comment
รหัสนี้มีปัญหามากมาย อาร์กิวเมนต์ถูกส่งผ่านและไม่ได้ใช้ parent ถูกสร้างขึ้นในฟังก์ชันที่ถูกเรียกหลังจากอ้างอิงเท่านั้น แต่ฟังก์ชันยังทำลายรายการลูกๆ ที่เพิ่มในพาเรนต์ด้วย... รายการยาวเกินไป ฉันจะ (โดยสุจริต!) แนะนำให้คุณเริ่มต้นจากศูนย์   -  person trincot    schedule 21.01.2018
comment
อาจซ้ำกันของ ใช้อาร์เรย์ javascript เพื่อ กรอกช่องเลือกแบบเลื่อนลง   -  person Heretic Monkey    schedule 21.01.2018
comment
ฉันสมมติว่าสคริปต์ของคุณอยู่ในส่วนหัวของไฟล์ html ของคุณ ดังนั้นเมื่อใดก็ตามที่มีการประมวลผลโค้ดของคำจำกัดความของ parent และ for loop ลำดับต่อมา <select> ก็ยังไม่มีอยู่ ฉันขอแนะนำให้ห่อโค้ดส่วนนั้นไว้ในฟังก์ชันที่เรียกใช้ทันทีที่โหลดหน้าเว็บจนเต็ม คุณสามารถทำเช่นนั้นได้ด้วย document.addEventListener   -  person rolfv1    schedule 21.01.2018
comment
ฉันยังใหม่กับ javascript ดังนั้นฉันจึงไม่ค่อยมีความรู้มากนัก แต่ถ้าใครสามารถช่วยฉันปรับโค้ดให้เหมาะสมได้ ก็จะยินดีมากเพื่อที่ฉันจะได้เรียนรู้จากข้อผิดพลาดของฉัน   -  person Adam    schedule 21.01.2018
comment
ควรสังเกตด้วยว่า HTML ของฉันว่างเปล่า และไม่มี ID ใด ๆ เนื่องจากฉันต้องการทำผ่านจาวาสคริปต์   -  person Adam    schedule 21.01.2018
comment
@Adam เพิ่มแท็กแผ่นพับ คุณจะได้รับคำตอบที่เหมาะกับปัญหาของคุณมากขึ้น   -  person zer00ne    schedule 21.01.2018


คำตอบ (1)


ใช้วิธีนี้...

var police_api_dates = ["&date=2017-03",];

var info = L.control();


info.onAdd = function (mymap) {
    this._div = L.DomUtil.create('div', 'info');
    this.update();
    return this._div;
};


var S='';


for(var i=0; i<police_api_dates.length; i++){

  S=S+'<option value="'+i+'">'+police_api_dates[i]+'</option>';

}



info.update = function (properties) {

 info.innerHTML='<select id="parent">'+S+'</select>'+'<h4>Highlighted Postcode</h4>' + (properties ? '<b> Postcode: ' + properties.Name : 'Hover over a state');
};


parent.innerHTML=S; // Insert the options

parent.selectedIndex=3; // Set your default value


info.addTo(mymap);

หมายเหตุ: ฉันจะหลีกเลี่ยงการใช้ชื่อตัวแปร/ID เช่น "child" และ "parent" เนื่องจากคุณกำลังตั้งค่าตัวเองสำหรับความขัดแย้งของคำที่สงวนไว้ด้วย JavaScript

อัปเดตโค้ดเพื่อรับลำดับของคุณตามลำดับ... มาดูกันว่าจะไปอย่างไร

person user4723924    schedule 21.01.2018
comment
มีปัญหาในการนำสิ่งนี้ไปใช้กับโค้ดของฉัน ฉันได้เปลี่ยนโค้ดแล้ว แต่ฟิลด์ยังคงแสดงค่าว่าง - person Adam; 21.01.2018
comment
คุณช่วยกรุณาใช้ P แทน parent และอาจเป็น C แทน child สำหรับตัวแปร / ID ได้ไหม - person user4723924; 21.01.2018
comment
ฉันได้ทำไปแล้ว แต่ฉันสูญเสียไปเล็กน้อย แต่ก็ยังใช้งานไม่ได้ - person Adam; 21.01.2018
comment
ลองนี่สิ... มันยากที่จะช่วยคุณจากระยะไกล :) - person user4723924; 21.01.2018
comment
jsfiddle.net/uteey91y/4 ข้อมูลนี้อัปเดตโดยใช้โค้ดของคุณ เนื่องจากคุณจะไม่เห็นว่าไม่มีข้อมูลใดเจาะลึก กล่องปรากฏขึ้นที่ด้านบน - person Adam; 21.01.2018
comment
เปลี่ยนใหม่แล้ว...ลองทำตามตรรกะดูครับจะได้แก้ไขให้จบเพราะผมไม่มีภาพทั้งหมดจากตรงนี้ - person user4723924; 21.01.2018
comment
ฉันต้องการกล่องตัวเลือกเหนือกล่องสถานะ แต่ตอนนี้ div ข้อมูลทั้งหมดหายไปแล้ว เทียบกับลักษณะที่ควรดูที่นี่ jsfiddle.net/e1syoc68 - person Adam; 21.01.2018
comment
เกิดอะไรขึ้นกับชื่อ parent และ child ไม่มีการสงวนไว้และสามารถอ่านได้มากกว่า P และ C แน่นอน S ก็ไม่เป็นมิตรเกินไปเช่นกัน - person AuxTaco; 21.01.2018
comment
อย่าเชื่อมโยงข้อมูลที่กำหนดเองเข้ากับบริบทของ HTML โดยไม่มีการหลีกเลี่ยงอย่างเหมาะสม ดีกว่าที่จะกำหนดสิ่งต่าง ๆ ตามคุณสมบัติ - person Brad; 22.01.2018