Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取Jinja2 for循环中每个项的API调用_Javascript_Python_Flask_Fetch_Jinja2 - Fatal编程技术网

Javascript 获取Jinja2 for循环中每个项的API调用

Javascript 获取Jinja2 for循环中每个项的API调用,javascript,python,flask,fetch,jinja2,Javascript,Python,Flask,Fetch,Jinja2,我目前正忙于一个个人项目,我正在进行fetchapi调用,以获取html音频标签列表的音频src fetch调用由曲目上的onclick事件触发。尽管无论我点击的是哪首曲目,fetch calls/play_track/1/都会将音频播放器仅附加到第一首曲目。有办法补救吗 如您所见,my index.html基本上就是jinja2: {% extends 'base.html' %} {% block content %} {% for track in tracks %}

我目前正忙于一个个人项目,我正在进行fetchapi调用,以获取html音频标签列表的音频src

fetch调用由曲目上的onclick事件触发。尽管无论我点击的是哪首曲目,fetch calls/play_track/1/都会将音频播放器仅附加到第一首曲目。有办法补救吗

如您所见,my index.html基本上就是jinja2:

{% extends 'base.html' %}

{% block content %}

    {% for track in tracks %}
        {% include '_post.html' %}
    {% endfor %}

{% endblock content %}
下面是带有Fetch调用的_post.html:(当前使用onclick事件进行调用,但将切换到onpageload)


{{track.title}

{{track.artist}

上传到{track.created_at.strftime(“%b%m,%Y”)}

{{{track.id}

函数fetchURL(事件){ tid=document.getElementById('track-id'); track_id=tid.innerHTML; 获取(`${window.origin}/play\u track/${track\u id}`) 。然后((响应)=>{ console.log(响应状态); 返回response.json(); }) .then(功能(数据){ console.log(data.message.url); createAudioPlayer(数据); }); } 函数createAudioPlayer(数据){ 让cardBody=document.getElementById('card-body'); 让audio=document.createElement('audio'); audio.controls=true; 让source=document.createElement('source'); source.type=“音频/mpeg”; source.src=data.message.url cardBody.append(音频); 音频预编(源); };
这是后端代码:(我很确定,如果我调整它,我可以避免将所有内容都提取到一起,但这是另一个问题)

@bp.route('/play\u track/'))
def播放曲目(曲目id):
track=track.query.filter\u by(id=track\u id).first()
res=requests.get(track.audio)
如果不是res.status_code==200:
返回f'状态代码:{res.Status_code}'
json_res=json.loads(res.text)
mpeg_audio_url=json_res['url']
msg_dict={
“url”:mpeg\u音频\u url
}
res=make_response(jsonify({'message':msg_dict}))
返回res
总结:获取调用不理解Jinja2 for循环。无论我单击曲目1、10或46等,它都会调用/play_track/1/并将音频标记附加到第一首曲目

谢谢

        function fetchURL(event) {
            tid = event.target;
            track_id = tid.innerHTML;

            fetch(`${window.origin}/play_track/${track_id}`)
                .then((response) => {
                    console.log(response.status);
                    return response.json();
                })
                .then(function(data) {
                    console.log(data.message.url);
                    createAudioPlayer(data, event);
                });
        }
问题出在第一行。您没有获得当前事件目标。
id必须是唯一的,因此每次在轨迹中循环时,都会创建具有相同id的元素。将轨迹idid更改为

<p onclick="fetchURL(event)" class="track-id">{{ track.id }}</p>
问题出在第一行。您没有获得当前事件目标。
id必须是唯一的,因此每次在轨迹中循环时,都会创建具有相同id的元素。将轨迹idid更改为

<p onclick="fetchURL(event)" class="track-id">{{ track.id }}</p>

这会提供正确的音频,但仍会将其附加到第一首曲目。您使用的是document.getElementById。正如我所说,它返回该id的第一个匹配项,这是第一个轨迹。我会为您修复它,但一定要了解id和类以及各种dom函数。我不是。我已将其修复为使用GetElementsByCassName('track-id')[0],它现在显示正确的音频,但仅在第一个曲目上显示。如果使用GetElementsByCassName(“track id”),它将以数组的形式返回该类的所有元素。然后,如果添加[0],它将获得第一个元素。明白我的意思了。您最终仍将获得第一个元素。您没有获得正确的音频。这会提供正确的音频,但仍会将其附加到第一首曲目。您正在使用document.getElementById。正如我所说,它返回该id的第一个匹配项,这是第一个轨迹。我会为您修复它,但一定要了解id和类以及各种dom函数。我不是。我已将其修复为使用GetElementsByCassName('track-id')[0],它现在显示正确的音频,但仅在第一个曲目上显示。如果使用GetElementsByCassName(“track id”),它将以数组的形式返回该类的所有元素。然后,如果添加[0],它将获得第一个元素。明白我的意思了。您最终仍将获得第一个元素。你没有得到正确的答案。
<p onclick="fetchURL(event)" class="track-id">{{ track.id }}</p>
        function createAudioPlayer(data, event) {

            let cardBody = event.target.parentElement;

            let audio = document.createElement('audio');
            audio.controls = true;

            let source = document.createElement('source');
            source.type = "audio/mpeg";
            source.src = data.message.url

            cardBody.append(audio);
            audio.prepend(source);
        };