---
# System prepended metadata

title: Modal 影片更換
tags: [Bootstrap 4, JS, Jquery, Bootstrap Modal, Youtube]

---

Modal 影片更換
=============
###### tags:  `JS`, `Jquery`, `Youtube`, `Bootstrap 4`, `Bootstrap Modal`

最近寫modal影片替換發生一些小問題，啟動第一次影片modal功能正常，第二次時卻沒辦法替換成新影片。

原本以為是因為監聽click導致，將寫法寫成不監聽click事件，而是改由modal彈出的當下，抓modal的啟動元件$(event.relatedTarget)也就是按鈕的src並替換。

```
$(function() {
    // 20221226 直接取影片ID放入modal(YT影片連結/分享連結/iframe src)
    let video_src;
    let video_id;
    let ytIframe =  $("#yt_modal iframe");
  

    // 取 youtube ID 
    function ytVidId(url) {
        console.log("tranlating")
        var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
        return (url.match(p)) ? RegExp.$1 : false;
    }

    // 第一次修改(按鈕帶值，點擊時取值，跑函式取id)
    // $(".video_card").on("click", function() {
    //     let video_src = $(this).data("src")
    //     video_id = ytVidId(video_src)
    // })

    // modal 顯示，替換url
    $('#yt_modal').on('show.bs.modal', function (event) {
        video_src = $(event.relatedTarget).data("src"); // modal會抓觸發的原件(按鈕)
        video_id = ytVidId(video_src);
        ytIframe.attr("src", `https://www.youtube.com/embed/${video_id}`)
    })

    // modal 消失，清空url
    $('#yt_modal').on('hidden.bs.modal', function () {
        ytIframe.attr("src", ``);
    });
})

```

測試結果在本機上可執行，但到伺服器上時就無法成功。
最後發現是變數`ytIframe`存取的是src尚未替換的DOM，替換過src後變數`ytIframe`已經失效，所以取消定義變數，改為每次啟動 model 時用 jquery 抓`$("#yt_modal iframe")`

```
$(function() {
    // 20221226 直接取影片ID放入modal(YT影片連結/分享連結/iframe src)
    let video_src;
    let video_id;
    //let ytIframe =  $("#yt_modal iframe"); // 第二次修改 取消存取物件
  

    // 取 youtube ID 
    function ytVidId(url) {
        console.log("tranlating")
        var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
        return (url.match(p)) ? RegExp.$1 : false;
    }

    // modal 顯示，替換url
    $('#yt_modal').on('show.bs.modal', function (event) {
        video_src = $(event.relatedTarget).data("src");
        video_id = ytVidId(video_src);
        //ytIframe.attr("src", `https://www.youtube.com/embed/${video_id}`)
        $("#yt_modal iframe").attr("src", `https://www.youtube.com/embed/${video_id}`) // 第二次修改 顯示的當下jquery直接抓目標
    })

    // modal 消失，清空url
    $('#yt_modal').on('hidden.bs.modal', function () {
        //ytIframe.attr("src", ``);
	$("#yt_modal iframe").attr("src", ``); // 第二次修改 顯示的當下jquery直接抓目標
    });
})

```