开发者问题收集

我似乎找不到任何错误,为什么这段代码不起作用?

2019-04-08
425

Html 和 CSS 工作正常,但出于某种原因,JS 无法正常工作。它似乎给出了一个语法错误:未捕获的 TypeError:无法读取 null 的属性“getTotalLength”,并且它不会给我长度。我正在遵循 devEd 的教程。outline.style.strokedasharray 也不起作用。我真的需要一个解决方案,谢谢!

<!DOCTYPE html>
<html>
<head>
	<title>Meditation App</title>
	<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
	<script>
	const app = () => {
const song = document.querySelector(".song");
const play = document.querySelector(".play");
const outline = document.querySelector(".moving-outline circle");
const video = document.querySelector(".vid-container video");

//Sounds
const sounds = document.querySelectorAll(".sound-picker button");
//Time Display
const timeDisplay = document.querySelector(".time-display");
//Get length of the outside
const outlineLength = outline.getTotalLength();
//Duration
let fakeDuration = 600;

outline.style.strokeDasharray = 100;

};	
	
	
	app();
	</script>
	<style>
	*{
		margin:0;
		padding:0;
		box-sizing:border-box;
		
	}
	.app{
		height:100vh;
		display:flex;
		justify-content:space-evenly;
		align-items:center;
		
	}
	.time-select,.sound-picker,.player-container{
		height:80%;
		flex:1;
		display:flex;
		flex-direction:column;
		justify-content:space-evenly;
		align-items:center;
		
	}
	.player-container{
		position:relative;
	}
	.player-container svg{
		position:absolute;
		height:50%;
		top:50%;
		left:50%;
		transform:translate(-50%,-50%);
		pointer-events:none;
		
	}

	.time-display{
		position:absolute;
		bottom:10%;
		color:white;
		font-size:50px;
	}
	video{
		position:fixed;
		top:0%;
		left:0%;
		width:100%;
		z-index:-10;
		
	}
	.time-select button, 
	.sound-picker button{
		color:white;
		width:30%;
		height:10%;
		background:none;
		border:2px solid white;
		cursor:pointer;
		border-radius:5px;
		font-size:20px;
		transition:all 0.5s ease;
	}
	.time-select button:hover{
		color:black;
		background:white;
		
	}
	.sound-picker button{
		border:none;
		height:120px;
		width:120px;
		border-radius:50%;
	}
	.sound-picker button:nth-child(1){
		background:#4972a1;
		
	}
	.sound-picker button:nth-child(2){
		background:#a14f49;
	}


	


	
	</style>
</head>
<body>
<div class="app">
<div class="vid-container">
	<video Loop>
	<source src="https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"/>
	</video>
	</div>
<div class="time-select">
<button data-time="120">2 Minutes</button>
<button data-time="300">5 Minutes</button>
<button data-time="600">10 Minutes</button>
</div>
<div class="player-container">
	<audio class="song">
		<source src="https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1"/>
	</audio>
	<svg class="play"
	 width="90" height="90" viewBox="0 0 68 78" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M68 39L0.499996 77.9711L0.5 0.0288552L68 39Z" fill="white"/>
</svg>
	<svg class="track-outline"
	width="453" height="453" viewBox="0 0 453 453" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="226.5" cy="226.5" r="216.5" stroke="white" stroke-width="20"/>
</svg>
<svg class="moving-outline"
width="453" height="453" viewBox="0 0 453 453" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="226.5" cy="226.5" r="216.5" stroke="#018EBA" stroke-width="20"/>
</svg>
<h3 class="time-display">0:00</h3>
</div>
<div class="sound-picker">
<button data-sound="https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1" data-video="https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"><img src="https://i.ibb.co/8BspYTV/rain-1.png"></button>
<button data-sound="https://www.dropbox.com/s/6k9nauf2ffyvfuu/beach.mp3?raw=1"
 data-video="https://www.dropbox.com/s/tsdd86bxmax32jp/beach.mp4?raw=1"><img src="https://i.ibb.co/T0xw4k7/sun-umbrella.png"</button>


</div>





</body>
</html>
3个回答

我认为您可以使用 DOMContentLoaded 事件。 类似这样的内容:

document.addEventListener("DOMContentLoaded", () => {
//your code (your function)
});

但原因已在上文中描述。

Денис Степанов
2019-04-08

将整个 <script> 块移至底部。

outline 为空,因为当您执行 const outline = document.querySelector(".movi​​ng-outline circle"); 时,带有类 .movi​​ng-outline 的 DOM 元素尚不存在,因此 outline 为空,因此无法从中调用方法。

<!DOCTYPE html>
<html>
<head>
    <title>Meditation App</title>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
    <style>
        *{
            margin:0;
            padding:0;
            box-sizing:border-box;

        }
        .app{
            height:100vh;
            display:flex;
            justify-content:space-evenly;
            align-items:center;

        }
        .time-select,.sound-picker,.player-container{
            height:80%;
            flex:1;
            display:flex;
            flex-direction:column;
            justify-content:space-evenly;
            align-items:center;

        }
        .player-container{
            position:relative;
        }
        .player-container svg{
            position:absolute;
            height:50%;
            top:50%;
            left:50%;
            transform:translate(-50%,-50%);
            pointer-events:none;

        }

        .time-display{
            position:absolute;
            bottom:10%;
            color:white;
            font-size:50px;
        }
        video{
            position:fixed;
            top:0%;
            left:0%;
            width:100%;
            z-index:-10;

        }
        .time-select button, 
        .sound-picker button{
            color:white;
            width:30%;
            height:10%;
            background:none;
            border:2px solid white;
            cursor:pointer;
            border-radius:5px;
            font-size:20px;
            transition:all 0.5s ease;
        }
        .time-select button:hover{
            color:black;
            background:white;

        }
        .sound-picker button{
            border:none;
            height:120px;
            width:120px;
            border-radius:50%;
        }
        .sound-picker button:nth-child(1){
            background:#4972a1;

        }
        .sound-picker button:nth-child(2){
            background:#a14f49;
        }

    </style>
</head>
<body>
    <div class="app">
        <div class="vid-container">
            <video Loop>
                <source src="https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"/>
            </video>
        </div>
        <div class="time-select">
            <button data-time="120">2 Minutes</button>
            <button data-time="300">5 Minutes</button>
            <button data-time="600">10 Minutes</button>
        </div>
        <div class="player-container">
            <audio class="song">
                <source src="https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1"/>
            </audio>
            <svg class="play"
            width="90" height="90" viewBox="0 0 68 78" fill="none" xmlns="http://www.w3.org/2000/svg">
            <path d="M68 39L0.499996 77.9711L0.5 0.0288552L68 39Z" fill="white"/>
        </svg>
        <svg class="track-outline"
        width="453" height="453" viewBox="0 0 453 453" fill="none" xmlns="http://www.w3.org/2000/svg">
        <circle cx="226.5" cy="226.5" r="216.5" stroke="white" stroke-width="20"/>
    </svg>
    <svg class="moving-outline"
    width="453" height="453" viewBox="0 0 453 453" fill="none" xmlns="http://www.w3.org/2000/svg">
    <circle cx="226.5" cy="226.5" r="216.5" stroke="#018EBA" stroke-width="20"/>
</svg>
<h3 class="time-display">0:00</h3>
</div>
<div class="sound-picker">
    <button data-sound="https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1" data-video="https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"><img src="https://i.ibb.co/8BspYTV/rain-1.png"></button>
    <button data-sound="https://www.dropbox.com/s/6k9nauf2ffyvfuu/beach.mp3?raw=1"
    data-video="https://www.dropbox.com/s/tsdd86bxmax32jp/beach.mp4?raw=1"><img src="https://i.ibb.co/T0xw4k7/sun-umbrella.png"</button>


</div>





</body>
<script>
    const app = () => {
        const song = document.querySelector(".song");
        const play = document.querySelector(".play");
        const outline = document.querySelector(".moving-outline circle");
        const video = document.querySelector(".vid-container video");

        //Sounds
        const sounds = document.querySelectorAll(".sound-picker button");
        //Time Display
        const timeDisplay = document.querySelector(".time-display");
        //Get length of the outside
        const outlineLength = outline.getTotalLength();
        //Duration
        let fakeDuration = 600;

        outline.style.strokeDasharray = 100;
    };  
    app();
</script>
</html>
Teh SoTo
2019-04-08

您需要先让 html 文档加载。使用 jQuery 的 $(document).ready() 函数对此非常有帮助。

jQuery .ready() 文档

jtylerm
2019-04-08