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直接抓目標 }); }) ```