#javascript #jquery
#javascript #jquery
Вопрос:
Код принимает URL youtube, получает миниатюру ссылки и сокращает ее. Проблема в том, что когда я пытаюсь изменить код, чтобы он работал для каждого экземпляра входных данных, а не только для одного экземпляра, поскольку он связан с идентификатором:
В настоящее время работает только над вводом с идентификатором:
var elemOutput = document.getElementById("thumb_video");
Попытался изменить на classname, чтобы он работал в каждом экземпляре:
var elemOutput = document.getElementsByClassName("video__thumb");
Как мне заставить код запускаться на каждом экземпляре input
?
/**
* Get YouTube ID from various YouTube URL
* @author: takien
* @link https://gist.github.com/takien/4077195
*/
function YouTubeGetID(url) {
var ID = "";
url = url
.replace(/(>|<)/gi, "")
.split(/(vi/|v=|/v/|youtu.be/|/embed/)/);
if (url[2] !== undefined) {
ID = url[2].split(/[^0-9a-z_-]/i);
ID = ID[0];
} else {
ID = url;
}
return ID;
}
/**
*
*/
function getPosterUrl(url) {
var posterUrl = "https://i.ytimg.com/vi/{videoID}/maxresdefault.jpg";
var videoID = YouTubeGetID(url);
posterUrl = posterUrl.replace(/{videoID}/g, videoID);
return posterUrl;
}
function setPosterUrl(url) {
var videoID, posterUrl, elemContainer, elemAnker, elemImg;
var images = [
/*"maxresdefault.jpg",
"sddefault.jpg",
"hqdefault.jpg",
"mqdefault.jpg",*/
"default.jpg"
];
videoID = YouTubeGetID(url);
var elemOutput = document.getElementById("thumb_video");
elemOutput.innerHTML = "";
images.forEach(function(item, index) {
elemContainer = document.createElement("div");
elemAnker = document.createElement("a");
elemImg = document.createElement("img");
posterUrl = "https://i.ytimg.com/vi/" videoID "/" images[index];
elemAnker.href = posterUrl;
elemAnker.setAttribute("target", "_blank");
elemAnker.setAttribute("rel", "noopener");
elemImg.src = posterUrl;
elemImg.setAttribute("alt", "");
elemAnker.appendChild(elemImg);
elemContainer.appendChild(elemAnker);
elemOutput.appendChild(elemContainer);
});
}
$(document).ready(function() {
var $input = $(".video__input");
var $icon = $(".video__icon");
var valLength;
$input.on("keyup", function(e) {
var newval = "",
$this = $(this);
if ((newval = $this.val().match(/(?|amp;)v=([^amp;#] )/))) {
$this.val(newval.pop());
} else if ((newval = $this.val().match(/(.be/) ([^/] )/))) {
$this.val(newval.pop());
} else if ((newval = $this.val().match(/(embed/) ([^/] )/))) {
$this.val(newval.pop().replace("?rel=0", ""));
}
e.preventDefault();
setPosterUrl($input.val());
$icon.hide();
});
$input.on("input", function() {
valLength = $.trim($(this).val()).length;
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
<input class="video__input" type="text" placeholder="Video URL">
<div class="video__thumb" id="thumb_video"></div>
<div class="video__icon">Test</div>
</div>
<div class="item">
<input class="video__input" type="text" placeholder="Video URL">
<div class="video__thumb" id=""></div>
<div class="video__icon">Test</div>
</div>
Ответ №1:
Две вещи:
-
вы должны перебрать все элементы, которые у вас есть, чтобы каким-то образом узнать, какие принадлежат друг другу. (смотрите код)
var $items = $(".item"); $items.each(function(){ var $input = $(this).children(".video__input"); // .... and more
-
внутри
setPosterUrl()
функции вы просто выбрали другой элемент с идентификатором из ниоткуда, а затем просто перезаписали его. Теперь это изменено, так что вы можете передать элемент (обычный элемент javascript) в функцию, которая является вашим заполнителем изображения…
/**
* Get YouTube ID from various YouTube URL
* @author: takien
* @link https://gist.github.com/takien/4077195
*/
function YouTubeGetID(url) {
var ID = "";
url = url
.replace(/(>|<)/gi, "")
.split(/(vi/|v=|/v/|youtu.be/|/embed/)/);
if (url[2] !== undefined) {
ID = url[2].split(/[^0-9a-z_-]/i);
ID = ID[0];
} else {
ID = url;
}
return ID;
}
/**
*
*/
function getPosterUrl(url) {
var posterUrl = "https://i.ytimg.com/vi/{videoID}/maxresdefault.jpg";
var videoID = YouTubeGetID(url);
posterUrl = posterUrl.replace(/{videoID}/g, videoID);
return posterUrl;
}
function setPosterUrl(onThisElement, url) {
var videoID, posterUrl, elemContainer, elemAnker, elemImg;
var images = [
/*"maxresdefault.jpg",
"sddefault.jpg",
"hqdefault.jpg",
"mqdefault.jpg",*/
"default.jpg"
];
videoID = YouTubeGetID(url);
var elemOutput = onThisElement;
elemOutput.innerHTML = "";
images.forEach(function(item, index) {
elemContainer = document.createElement("div");
elemAnker = document.createElement("a");
elemImg = document.createElement("img");
posterUrl = "https://i.ytimg.com/vi/" videoID "/" images[index];
elemAnker.href = posterUrl;
elemAnker.setAttribute("target", "_blank");
elemAnker.setAttribute("rel", "noopener");
elemImg.src = posterUrl;
elemImg.setAttribute("alt", "");
elemAnker.appendChild(elemImg);
elemContainer.appendChild(elemAnker);
elemOutput.appendChild(elemContainer);
});
}
$(document).ready(function() {
var $items = $(".item");
$items.each(function(){
var $input = $(this).children(".video__input");
var $icon = $(this).children(".video__icon");
var valLength;
$input.on("keyup", function(e) {
var newval = "",
$this = $(this);
if ((newval = $this.val().match(/(?|amp;)v=([^amp;#] )/))) {
$this.val(newval.pop());
} else if ((newval = $this.val().match(/(.be/) ([^/] )/))) {
$this.val(newval.pop());
} else if ((newval = $this.val().match(/(embed/) ([^/] )/))) {
$this.val(newval.pop().replace("?rel=0", ""));
}
e.preventDefault();
setPosterUrl($icon[0], $input.val()); // $icon[0] the "[0]" part is only to convert from jQuery element to plain javascript element!
$icon.hide();
});
$input.on("input", function() {
valLength = $.trim($(this).val()).length;
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
<input class="video__input" type="text" placeholder="Video URL">
<div class="video__thumb" id="thumb_video"></div>
<div class="video__icon">Test</div>
</div>
<div class="item">
<input class="video__input" type="text" placeholder="Video URL">
<div class="video__thumb" id=""></div>
<div class="video__icon">Test</div>
</div>