Сообщение от bobus123
|
В идеале вставляю в инпут поле ссылку на YouTube ролик и на аяксе получаю в другом инпуте длительность этого ролика.
|
Давайте сначала очистим ваш запрос от вещей, которые не имеют никакого смысла и только запутывают вас!
Сообщение от bobus123
|
на аяксе
|
Я всё больше удивляюсь попыткам программировать на несуществующих вещах... В JavaScript нет такого! Я спрашивал у других программистов(C#, Java), поверьте, они они более чем уверены, что такое не нужно для того, чтобы сделать запрос к серверу! Кому вы хотите запудрить мозги своим «на аяксе»? Так и говорите, что вы хотите получить данные с сервера, а не «на аяксе»!
Вы не можете послать AJAX-запрос. Но вы можете послать асинхронный HTTP-запрос, если вы хотите.
Сообщение от bobus123
|
получаю в другом инпуте
|
Это так не работает... Интерфейс Fetch API никак не связан с интерфейсом Element, но если вы хотите вы можете написать код, который запишет результат запроса в какой-нибудь элемент! <input> в первую очередь предназначен для ввода данных от пользователя...
Я думаю, что вы хотели узнать это...
Сообщение от bobus123
|
В идеале вставляю в инпут поле ссылку на YouTube ролик и... получаю ... длительность этого ролика.
|
<form onsubmit="getData(this); return false;" oninput="getData(this);">
<input name="url" pattern=".*(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)?([a-zA-Z0-9_-]{11}).*" required spellcheck="false" placeholder="Введите адрес или идентификатор видео с YouTube, чтобы узнать его продолжительность">
<output><span></span></output>
</form>
<script>
async function getData(form) {
const key = "AIzaSyDYwPzLevXauI-kTSVXTLroLyHEONuF9Rw";
const input = form.querySelector("[name=url]");
const output = form.querySelector("output");
try {
if(!input.checkValidity()) throw new Error("Введите ссылку на видео в YouTube");
const id = new RegExp(input.pattern).exec(input.value)[1];
const response = await fetch(`https://www.googleapis.com/youtube/v3/videos?id=${id}&key=${key}&part=snippet,contentDetails`);
const { items } = await response.json();
if("0" in items === false) throw new Error("Видео не найдено");
output.style.backgroundImage = `url(${items[0].snippet.thumbnails.default.url})`;
output.innerHTML = `<span>${parseTime(items[0].contentDetails.duration)}</span>`;
output.className = "ok";
function parseTime(time) {
const match = time.match(/^PT(?:(\d+)H)?(?:(\d{1,2})M)?(\d{1,2})S$/).slice(1).map(v => v || 0).map(Number);
return `${60 * match[0] + match[1]}:${String(match[2]).padStart(2, "0")}`;
}
} catch(error) {
output.className = "";
output.style.backgroundImage = "";
output.textContent = error.message;
}
}
</script>
<style>
output.ok {
width: 120px;
height: 90px;
display: flex;
justify-content: center;
align-items: center;
margin: 1em;
border-radius: 0.3em;
}
output.ok > span {
color: white;
background: rgba(0, 0, 0, 0.5);
font: bold 1.5em system-ui;
margin: 0.2em;
padding: 0.1em 0.3em;
border-radius: 0.2em;
text-shadow: 0 2px black;
}
form {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
}
[name="url"] {
all: unset;
border-radius: 5px;
padding: 0.5em;
font: 1em system-ui;
background: var(--bg-color, white);
box-shadow: inset 0 0 0 2em var(--bg-color, white);
color: var(--fg-color, black);
-webkit-text-fill-color: var(--fg-color, black);
border: 1px solid var(--fg-color, black);
width: 90%;
text-align: center;
}
[name="url"]:valid {
--fg-color: #33691E;
--bg-color: #F1F8E9;
}
[name="url"]:invalid:not(:placeholder-shown) {
--fg-color: red;
--bg-color: #ffeeee;
}
</style>