Element tidak terbaca di JavaScript

Jadi gini, saya meload content dari file lain ke dalam sebuah element. Misalnya, saya membuat sebuah div:

<div id="parent">
</div>

Nah, di dalam div#parent tersebut saya meload content yang berasal dari file content.php dengan AJAX.

if(window.XMLHttpRequest)
{
    var xhttp = new XMLHttpRequest();
}
else
{
    var xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

xhttp.onreadystatechange = function()
{
    if(this.readyState == 4 && this.status == 200)
    {
        document.getElementById('parent').innerHTML = this.responseText;
    }
}

xhttp.open('GET', '/url/ke/content.php');
xhttp.send();

Misal isi dari file content.php adalah:

<p id="content"></p>

Hasilnya jadi gini:

<div id="parent">
    <p id="content"></p>
</div>

Masalahnya, ketika saya mencoba mendapatkan element p#content (document.getElementById('content')) setelah AJAX load berhasil dan setelah content berhasil muncul/ditambahkan, hasilnya selalu null, seolah element p#content tidak kebaca oleh document. Tapi, kalau saya langsung pakek innerHTML tanpa menggunakan AJAX, element p#content bisa kebaca. Kenapa ya? Apakah ada solusi?

avatar dalikewara
@dalikewara

351 Kontribusi 260 Poin

Diperbarui 8 tahun yang lalu

2 Jawaban:

agan ngambil elementnya jgn diluar blok kode (function) xhttp.onreadystatechange. itu pola non-blocking code bukan blocking code (prosesnya asyncronize).

xhttp.onreadystatechange = function()
{
    if(this.readyState == 4 && this.status == 200)
    {
        document.getElementById('parent').innerHTML = this.responseText;
        // ngambil selector element disini dapet
    }
}

// kalo ngambil selector element disini ga bakal dapet
// karena prosesnya terjadi di blok berbeda

agan pelajarin perbedaan blocking code sama non-blocking, pahamin asyncronize sama syncronize, juga pahamin multithreading. disitu agan baru bakal paham bener meletakan kode agan seharusnya dimana

avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Dipost 8 tahun yang lalu

Jawaban Terpilih

Udah solved, saya pakek delegate event, dan alhamdulillah bisa ke baca:

document.addEventListener(event, function(e)
{
    var ee = e.target;

    while(ee && ee !== this)
    {
        if(ee.matches(target))
        {
            callback.call(ee, e);
        }

        ee = ee.parentNode;
    }
}, false);

avatar dalikewara
@dalikewara

351 Kontribusi 260 Poin

Dipost 8 tahun yang lalu

Login untuk ikut Jawaban