#javascript #jquery
#javascript #jquery
Вопрос:
Я хочу изменить аудио src при нажатии на каждый тег a, например, когда я нажимаю на первый тег a, должен воспроизводиться только первый src в массиве и так далее. Я написал этот код, но при нажатии на теги src будет меняться каждый раз (я хочу, чтобы первый src был только для первого тега a, а второй для второго …);
$(function () {
const sources = [
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10'
];
for (var i = 0; i < $('a').length; i ) {
$('a').eq(i).on('click', function () {
if (i <
sources.length ) {
i ;
} else {
i = 0;
}
$('#music').attr('src', sources[i]);
$('#music').get(0).play();
})
};
});
Комментарии:
1. Почему вы изменяете
i
заголовок цикла и сам цикл?
Ответ №1:
Если я вас правильно понял, вы можете использовать $.index()
, чтобы получить источник для выбранного <a>
элемента.
.index()
/.index( selector )
/.index( object )
Описание: Поиск заданного элемента из числа совпадающих элементов.
Возвращаемые значения
Если методу не передается аргумент.index()
, возвращаемое значение представляет собой целое число, указывающее положение первого элемента в объекте jQuery относительно его родственных элементов.Если
.index()
вызывается для коллекции элементов и передается элемент DOM или объект jQuery,.index()
возвращает целое число, указывающее положение переданного элемента относительно исходной коллекции.Если строка селектора передается в качестве аргумента,
.index()
возвращает целое число, указывающее положение первого элемента в объекте jQuery относительно элементов, соответствующих селектору. Если элемент не найден,.index()
вернет -1.
$(function() {
const sources = [ '1','2','3','4','5','6','7','8','9','10' ],
anchors = $("a");
anchors.on('click', function(ev) {
ev.preventDefault();
const indexOfClickedAnchor = anchors.index(this),
source = sources[indexOfClickedAnchor];
console.log(indexOfClickedAnchor, source);
/*
$('#music').attr('src', source)
.get(0)
.play();
*/
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="">1</a><a href="">2</a><a href="">3</a><a href="">4</a><a href="">5</a>
<a href="">6</a><a href="">7</a><a href="">8</a><a href="">9</a><a href="">10</a>
Комментарии:
1. «только первый звук (src) приостанавливается, а не остальные» — есть только один
#music
элемент o.O
Ответ №2:
i
переменная поднята, поэтому вы должны объявить ее как let (если ES2015 возможен) или использовать для этого замыкание. Кроме того, вам, вероятно, не следует вносить изменения i
внутри цикла, как вы это делали, чтобы вам не нужно было учитывать случай бесконечного цикла. Лучшим циклом было бы:
const a = $('a');
for (let i = 0; i < a.length; i ) {
a[i].on('click', function () {
$('#music').attr('src', sources[i % sources.length]);
$('#music').get(0).play();
})
};
Комментарии:
1. Возможно, вы захотите сохранить результат
$('a').length
в переменной. В противном случае это будет запрашивать DOM на каждом раунде цикла для каждого<a>
элемента (который, надеюсь, не изменится, поскольку это может привести к дальнейшим проблемам).2. Это не сработало, возможно, я написал это неправильно, мой JS / Jquery пока не очень хорош. Кстати, спасибо.