Если переменная var
вводится пользователем, eval
не следует использовать для расширения тильды с использованием
eval var=$var # Do not use this!
. Причина в том, что пользователь может случайно (или по назначению ) типа var="$(rm -rf $HOME/)"
с возможными катастрофическими последствиями.
Лучшим (и безопасным) способом является использование расширения параметра Bash:
var="${var/#\~/$HOME}"
В ваших функциях this
относится к элементу, к которому вы привязали функцию.
Вот демонстрация:
$("video").attr("poster", function() {
console.log("This refers to: " + this);
console.log(this);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<video></video>
Но кажется, что вы хотите получить атрибут id
из содержащего <div>
для каждого поста.
Я предлагаю вам назначить каждому посту <div>
класс «post».
Затем вы можете выбрать нужный пост из ваших функций, используя jQuery closest()
.
<div class="post" ... >
Я рекомендую использовать атрибут данных , например, data-id
, а не id
,
, так как атрибут id
имеет свое специальное назначение .
<div class="post" data-id="1/1/8/2/1/4/4/5c5417cfefafd-677" ... >
Я рекомендую удалить элементы <a>
и привязать обработчик click
непосредственно к элементам .thumb
. Таким образом, вы упростите структуру HTML и вам не понадобятся встроенные атрибуты onclick=""
.
Вот рабочий пример:
$("video").attr({
'poster': function() {
var id = $(this).closest('.post').data('id');
return "https://WebSite" + id + "-.jpg";
},
'src': function() {
var id = $(this).closest('.post').data('id');
return "https://WebSite" + id + "-preview.mp4";
}
});
$(".thumb").on('click', function(e) {
e.preventDefault();
var id = $(this).closest('.post').data('id');
changeVideo(id);
});
function changeVideo(id) {
console.log('Changing Video: ' + id);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h2>first post</h2>
<div class="post" title="First Post" data-id="1/1/8/2/1/4/4/5c5417cfefafd-677">
<div class="thumb">
<video muted poster="" onmouseover="this.play()" onmouseout="this.pause()">
Your browser does not support HTML5 video.
</video>
</div>
</div>
<h2>second post</h2>
<div class="post" title="Second Post" data-id="a-different-video-id">
<div class="thumb">
<video muted poster="" onmouseover="this.play()" onmouseout="this.pause()">
Your browser does not support HTML5 video.
</video>
</div>
</div>
Это приводит к такой структуре: [ 1146]
<div class="post" title="First Post" data-id="1/1/8/2/1/4/4/5c5417cfefafd-677">
<div class="thumb">
<video muted="" poster="https://WebSite1/1/8/2/1/4/4/5c5417cfefafd-677-.jpg" onmouseover="this.play()" onmouseout="this.pause()" src="https://WebSite1/1/8/2/1/4/4/5c5417cfefafd-677-preview.mp4">
Your browser does not support HTML5 video.
</video>
</div>
</div>
И jQuery связал обработчик click
с каждым .thumb
, который передаст соответствующий data-id
в функцию changeVideo()
.
Я думаю, что ключевой момент здесь состоит в том, чтобы перебрать все .post
... И для каждого есть 3 атрибута.
См. Комментарии в коде.
// Loop through each post
$(".post").each(function(){
// Get the id
var id = $(this).data("id");
// Set the anchor's onclick
$(this).find("a").attr("onclick","changeVideo('" + id + "');");
// Set the poster and src
$(this).find("video").attr({
"poster":"https://WebSite" + id + "-.jpg",
"src":"https://WebSite" + id + "-preview.mp4"
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h2>first post</h2>
<div class="post" title="First Post" data-id="1/1/8/2/1/4/4/5c5417cfefafd-677">
<a onclick="">
<div class="thumb">
<video muted poster="" onmouseover="this.play()" onmouseout="this.pause()">
Your browser does not support HTML5 video.
</video>
</div>
</a>
</div>
<h2>second post</h2>
<div class="post" title="Second Post" data-id="A-DIFFERENT-ID-FOR-FUN">
<a onclick="">
<div class="thumb">
<video muted poster="" onmouseover="this.play()" onmouseout="this.pause()">
Your browser does not support HTML5 video.
</video>
</div>
</a>
</div>
Поиск id
находится в атрибуте data-
в [ 115] разметка элемента. Он также является родителем элемента, который вы хотите «обновить» ... Так что это хорошая отправная точка для получения id
и .find()
потомков. Цикл .each()
- лучший способ правильно их обработать.