简体   繁体   English

在Chrome扩展程序中动态呈现内联函数

[英]Dynamically rendering an inline function in Chrome Extension

In my chrome extension, I am dynamically rendering some items in an object and tried to put an inline function that gets tied to a single item. 在我的chrome扩展程序中,我正在对象中动态渲染某些项目,并试图将一个内联函数绑定到单个项目。

chrome.storage.sync.get(['player_info'], (data) => {
    console.log('search')
    console.log(data)
    // data = list of possible players 
    let player_arr = data.player_info
    for (let i = 0; i < player_arr.length; i++) {
        document.getElementById("card-wrapper").innerHTML +=
            `<div onclick="alert('clicked')" class="player_option">
                <center>
                    <div class="card-img-small">
                        <a href="#">
                            <img id=\"player_img\" src="${player_arr[i].profile_img}" class="img-responsive">
                        </a>
                    </div>
                </center>
                <div class="card-body">
                    <div id="player-name" class="price-small">
                        ${player_arr[i].name}
                    </div>`
    }
})

In the div wrapper, I added an alert function to check if it works, but nothing happens. div包装器中,我添加了一个alert功能来检查它是否有效,但是什么也没发生。 I inspected the element, and it looked like this: 我检查了元素,它看起来像这样:

<div onclick="alert('clicked')" class="player_option">
                <center>
                    <div class="card-img-small">
                        <a href="#">
                            <img id="player_img" src="https://fmdataba.com/images/p/4348.png" class="img-responsive">
                        </a>
                    </div>
                </center>
                <div class="card-body">
                    <div id="player-name" class="price-small">
                        Paul Pogba
                    </div></div></div>

It seems like this is now allowed in Chrome Extension. Chrome扩展程序现在似乎允许使用此功能。 What is a way to solve this without violating the security policy? 在不违反安全策略的情况下有什么解决方法?

EDIT - using addEventListener 编辑-使用addEventListener

let player_arr = data.player_info
for (let i = 0; i < player_arr.length; i++) {
    document.getElementById("card-wrapper").innerHTML +=
        `<div id="selected_player_${i}" class="player_option">
            <center>
                <div class="card-img-small">
                    <img id=\"player_img\" src="${player_arr[i].profile_img}" class="img-responsive">
                </div>
            </center>
            <div class="card-body">
                <div id="player-name" class="price-small">
                    ${player_arr[i].name}
                </div>`

    document.getElementById(`selected_player_${i}`).addEventListener("click", function() {
        alert(`${player_arr[i].name}`)
    })
}

I solved the issue by making another for-loop for the addEventListener() . 我通过为addEventListener()创建另一个for循环解决了该问题。 If I put both HTML rendering and the addEventListener in a single for-loop as I did in my question, the addEventListener gets applied only to the last item. 如果像我在问题中那样将HTML呈现和addEventListener放在一个for循环中,则addEventListener仅应用于最后一项。

const callname = (name) => {
    alert(name)
}

chrome.storage.sync.get(['player_info'], (data) => {
    console.log('search')
    console.log(data)
    // data = list of possible players
    let player_arr = data.player_info
    for (let i = 0; i < player_arr.length; i++) {
        document.getElementById("card-wrapper").innerHTML +=
            `<div id="selected_player_${i}" class="player_option">
                <center>
                    <div class="card-img-small">
                        <img id=\"player_img\" src="${player_arr[i].profile_img}" class="img-responsive">
                    </div>
                </center>
                <div class="card-body">
                    <div id="player-name" class="price-small">
                        ${player_arr[i].name}
                    </div>`
    }
    for (let i = 0; i < player_arr.length; i++) {
        document.getElementById(`selected_player_${i}`).addEventListener("click", function() {
            callname(`${player_arr[i].name}`)
        })
    }
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM