I am trying to load different videos according to the screen size. I found a solution to doing this using javascript. However, I am not able to integrate this code into nuxt.js.
Working Code: HTML
<div class="container"> <div class="row"> <video id="vid1" class="col-12" loop muted autoplay></video> <video id="vid2" class="col-12" loop muted autoplay></video> </div> </div>
JAVASCRIPT
let videos = { "vid1": [ "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4", "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4" ], "vid2": [ "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4", "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4" ] }; function setVideoWithScreen(screen, element) { console.log(videos); element.setAttribute("type", "video/mp4"); if (window.innerWidth < screen) { element.removeAttribute("src"); element.setAttribute("src", videos[element.id][0]); element.load(); } else { element.removeAttribute("src"); element.setAttribute("src", videos[element.id][1]); element.load(); } } let el = document.querySelectorAll('.video'); for (i = 0; i < el.length; i++) { setVideoWithScreen(700, el[i]) } window.addEventListener("resize", function() { let el = document.querySelectorAll('.video') for (i = 0; i < el.length; i++) { setVideoWithScreen(700, el[i]) } });
The Fiddle: https://jsfiddle.net/j78w36er/2/
I tried to integrate like this:
<template> <div class="container"> <div class="row"> <video id="vid1" class="col-12" loop muted autoplay></video> <video id="vid2" class="col-12" loop muted autoplay></video> </div> </div> </template> export default { data () { return { let videos = { "vid1": [ "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4", "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4" ], "vid2": [ "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4", "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4" ] } } }, methods: { setVideoWithScreen(screen, element) { element.setAttribute("type", "video/mp4"); if (window.innerWidth < screen) { element.removeAttribute("src"); element.setAttribute("src", videos[element.id][0]); element.load(); } else { element.removeAttribute("src"); element.setAttribute("src", videos[element.id][1]); element.load(); } } }, mounted () { if (process.browser) { let el = document.querySelectorAll('.video'); for (i = 0; i < el.length; i++) { setVideoWithScreen(700, el[i]) } window.addEventListener("resize", function() { let el = document.querySelectorAll('.video') for (i = 0; i < el.length; i++) { setVideoWithScreen(700, el[i]) } }) } }
I would be very thankful for any kind of help!
Advertisement
Answer
Your code is primarily invalid and not compliant With Vue. The correct code should look like this (.vue file):
<template> <div class="container"> <div class="row"> <video id="vid1" class="col-12" loop muted autoplay></video> <video id="vid2" class="col-12" loop muted autoplay></video> </div> </div> </template> <script> export default { data () { return { videos: { "vid1": [ "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4", "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4" ], "vid2": [ "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4", "https://storage.googleapis.com/coverr-main/mp4/Love-Boat.mp4" ] } } }, methods: { setVideoWithScreen(screen, element) { element.setAttribute("type", "video/mp4"); if (window.innerWidth < screen) { element.removeAttribute("src"); element.setAttribute("src", this.videos[element.id][0]); element.load(); } else { element.removeAttribute("src"); element.setAttribute("src", this.videos[element.id][1]); element.load(); } } }, mounted () { if (process.browser) { let el = document.querySelectorAll('video'); for (let i = 0; i < el.length; i++) { this.setVideoWithScreen(700, el[i]) } window.addEventListener("resize", () => { let el = document.querySelectorAll('video') for (let i = 0; i < el.length; i++) { this.setVideoWithScreen(700, el[i]) } }) } } } </script>
but unfortunately there are a lot of bad practices here that you should keep in mind when writing your code. A few tips from me:
- study basic concepts of vue, there are lot of vue bugs in data, mounted. Check how vue works in documentation.
- use debounce function when you work with events like resize, scroll etc.
- use DRY pattern
- you can use vue $refs instead of querySelector