Почему img.src не определяет источник img-тега в каждом «li»?

#javascript #firebase #google-cloud-firestore #google-cloud-storage

#javascript #firebase #google-облако-firestore #google-облачное хранилище

Вопрос:

Я хочу добавить изображение из хранилища Firebase в каждый «li» в приведенном ниже коде, но только у первого li есть изображение. В других тегах img нет определенного src. В консоли нет ошибок, но изображение каждого изображения регистрируется в консоли, но оно не будет применяться к src

Код:

 var postDocRef = db.collection('posts').doc(uid).collection('userPosts')

postDocRef.get().then(snapshot => {
setupPosts(snapshot.docs)
})

const posts = document.querySelector('.posts');

const setupPosts = (data) => {

    let html = '';
    data.forEach(doc => {

        var docRefIDpost = docRef.id

        const post = doc.data();
        const li = `
        <li>
            <div class="title">${post.title}</div>
            <div class="content">${post.content}</div>
            <img class="img">
        </li>
        `;

        var imgRef = db.collection('posts').doc(uid).collection('userPosts');

        imgRef.get().then(function(snapshot) {

            if (snapshot.docs.length > 0) {
                snapshot.docs.forEach(doc => {
                    
                    const data = doc.data();

                    const picURL = data.picURL

                    console.log(picURL)

                    var img = document.querySelector(".img")

                    img.src = picURL

                })
            } else {

                console.log("PicURL doesn't exist")

            }
            
            })
        html  = li
    })

    posts.innerHTML = html;

}
});
  

Комментарии:

1. Вы не можете запросить DOM для элемента до его добавления.

Ответ №1:

Проблема в этой строке:

 var img = document.querySelector(".img")
  

Каждый раз, когда это выполняется, вы загружаете первый .img элемент из HTML. Что вы на самом деле хотите сделать, это установить изображение на li то, что вы в данный момент создаете.

Самый простой способ исправить это — добавить img тег только во li внутренний цикл:

 const setupPosts = (data) => {

    let html = '';
    data.forEach(doc => {

        var docRefIDpost = docRef.id

        const post = doc.data();
        let li = `
        <li>
            <div class="title">${post.title}</div>
            <div class="content">${post.content}</div>
        `;

        var imgRef = db.collection('posts').doc(uid).collection('userPosts');

        imgRef.get().then(function(snapshot) {

            if (snapshot.docs.length > 0) {
                snapshot.docs.forEach(doc => {
                    const data = doc.data();

                    const picURL = data.picURL

                    console.log(picURL)

                    var img = document.querySelector(".img")

                    li  = `<img class="${picURL}">`;
                })
            } else {
                console.log("PicURL doesn't exist")
            }
            
            })
            li  = "</li>";

            html  = li
        })

        posts.innerHTML = html;
    }
});
  

Обновленный код:

 const setupPosts = (data) => {
    let html = '';
    data.forEach(doc => {
        var docRefIDpost = docRef.id

        const post = doc.data();
        let li = `
        <li>
            <div class="title">${post.title}</div>
            <div class="content">${post.content}</div>
        `;

        var imgRef = db.collection('posts').doc(uid).collection('userPosts');
        imgRef.get().then(function(snapshot) {
            if (snapshot.docs.length > 0) {
                snapshot.docs.forEach(doc => {
                    const data = doc.data();
                    const picURL = data.picURL

                    var img = document.querySelector(".img")

                    li  = `<img class="${picURL}">`;
                })
            } else {
                console.log("PicURL doesn't exist")
            }
            
            li  = "</li>";
            html  = li
            posts.innerHTML = html;
        })
    })
}
});
  

Это обновляет HTML после чтения каждого документа.

Комментарии:

1. Теперь я получил ошибку; profile.js: 126 Не найдено (в обещании) Ошибка типа: присвоение постоянной переменной. в profile.js:126 в Array.forEach (<анонимный>) в profile.js:117

2. Да, li для этого должна быть обычная переменная. Я обновил свой ответ, но рекомендую искать такие проблемы, если вы получите сообщение об ошибке.

3. Теперь тег img полностью удален. Теперь это только заголовок и содержимое div в li

4. Вы прошли через код и проверили, доходит ли он до li = строки из моего ответа? Если да, то что происходит в этой строке? Stack Overflow — ужасно неэффективный интерактивный отладчик, поэтому вам придется предпринять подобные шаги самостоятельно, если вы хотите, чтобы мы могли эффективно помочь.

5. Хорошо, итак, я просмотрел код сейчас, и это было распечатано как <li> <div class="title">asdasd</div> <div class="content">asdasdasd</div> </li><img class="https://firebasestorage.googleapis.com/v0/b/midpoint2-1d3e2.appspot.com/o/posts/Skjermbilde42.PNG?alt=mediaamp;token=e8970d40-0ef3-479d-866f-9174fb5b4430"> li: так что