• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Po podmianie ścieżki pliku audio, plik audio jest odtwarzany ze starej ścieżki

Object Storage Arubacloud
+1 głos
243 wizyt
pytanie zadane 25 marca 2023 w JavaScript przez Mateusz Analityk Stary wyjadacz (13,710 p.)
edycja 25 marca 2023 przez Mateusz Analityk

Funkcja tworząca obiekt audio i odtwarzająca dźwięk, zmienna audio jest globalna ustawiona na null

let audio = null; // deklarujemy zmienną, w której będziemy przechowywać obiekt Audio

function playSoundOnce(path) {
  //audio = document.getElementById("myAudio"); // pobranie starym obiektu audio
  //audio.pause(); // zatrzymanie odtwarzania
  //audio.src = path;   
  // funkcja przyjmuje ścieżkę do dźwięku jako argument
  // audio = document.getElementById("myAudio"); 
  if (audio !== null) { // sprawdzamy, czy dźwięk jest już odtwarzany
    audio.pause(); // jeśli tak, przerywamy odtwarzanie
    audio.currentTime = 0; // ustawiamy czas odtwarzania na początek
  }

  audio = new Audio(path); // tworzymy nowy obiekt Audio z podaną ścieżką
  audio.src = path;
  audio.load();
  audio.play(); // odtwarzamy dźwięk
  audio.remove();
}

W pliku html ścieżki są zamieniane według następującego przykładu, jednak dźwięk jest odtwarzany tylko z pierwszej ścieżki, po odświeżeniu strony wszystko wraca do normy, problem w tym, że chciałbym bez odświeżania strony odtwarzać dźwięk z drugiej ścieżki

<div class="word1 wrong" data-audio-path="files/words/mp3/burn.mp3">
<div class="word1 checked" data-audio-path="files/words/mp3/tie.mp3">

<!-- Jeśli kliknie się klasę word2 -->
<div class="word2 wrong" data-audio-path="files/words/mp3/cat.mp3">
<div class="word2 wrong" data-audio-path="files/words/mp3/dog.mp3">

<!-- Jest analogicznie odtwarza się tylko pierwsza ścieżka -->

Tutaj jeszcze element kodu, myślę nieznaczący w tym wypadku, ale daje dla lepszego podglądu sytuacji

 for (let i = 0; i < 6; i++) {
                      let audioPath = data[i];
                      $('.word'+i).each(function() {
                         $('.word').removeAttr('data-audio-path');
                          $(this).attr('data-audio-path', audioPath);
                      });
                      $('.word'+i).click(function() {
                        let audioPath = $(this).data('audio-path');
                        playSoundOnce(audioPath);
                      });
                    }

 

Myślę, że przyczyną problemu jest to, że element audio zostaje w pamięci przeglądarki, próbowałem dawać audio = null; audio.remove(); nie skutkowało, w jaki sposób można usunąć stary obiekt audio, abym mógł odtworzyć dźwięk z nowej ścieżki pliku, która została dodana bez odświeżania strony?

komentarz 25 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)

Gdzie deklarowana jest zmienna i, której używasz do pobrania audioPath oraz do tworzenia selektora klasy przy konkatenacji '.word' + i?

komentarz 25 marca 2023 przez Mateusz Analityk Stary wyjadacz (13,710 p.)

@Don Matteo, Deklarowana jest w pętli for, której tutaj nie dawałem, to z niej pochodzą ścieżki, które są umieszczane w tagach HTML, to po prostu zmienna PATH. To literacja po wierszach tabeli mysql, gdzie są przechowywane ścieżki

komentarz 25 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)

W pętli for w JavaScript-cie? Pokaż nagłówek tej pętli.

komentarz 25 marca 2023 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
edycja 25 marca 2023 przez Mateusz Analityk
 for (let i = 0; i < 6; i++)

Wielkie dzięki za pomoc, problem nie był w pętli for, spojrzałem teraz na ten kod jeszcze raz świeższym okiem, zamiast audio-path powinno być data-audio-path

komentarz 25 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)

zamista audio-path  powinno być data-audio-path

Hmm, jesteś pewien? Bo jQuery-owa metoda .data() przy odczycie sama dokleja "data-" do nazwy atrybutu. Więc wywołanie .data( 'audio-path' ) powinno zwrócić wartość atrybutu o nazwie "data-audio-path".


$('.word'+i).each(function() {
  $('.word').removeAttr('data-audio-path');
  $(this).attr('data-audio-path', audioPath);
});
$('.word'+i).click(function() {
  let audioPath = $(this).data('audio-path');
  playSoundOnce(audioPath);
});

Czy zamiast selektora '.word' (wewnątrz .each()) nie powinieneś użyć this?

Wykonsoluj audioPath wewnątrz .click() i upewnij się, że ścieżka jest prawidłowa (wskazuje na nowy plik zamiast starego).

komentarz 25 marca 2023 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
// let audioPath = $(this).data('audio-path');

Zrobiłem tak i działa prawidłowo, ta linia nie jest potrzebna, powoduje ona błąd, this słuszna uwaga, powinno się tam znaleźć, let audio-path po konsolowaniu to po prostu audio-path

Teraz kod działa także się cieszę :)

1 odpowiedź

0 głosów
odpowiedź 29 marca 2023 przez VBService Ekspert (253,340 p.)
edycja 29 marca 2023 przez VBService

Proponuję zastosować Event Delegation co IMHO upraszcza znacząco kod.

Przykład on-line: [ 1 ]  [ 2 ].

<div class="audio-container">
  <div class="word1 wrong" data-audio-path="burn.mp3"></div>
  ...
</div>
const URL = 'files/words/mp3/';
const audio = new Audio();

const words = document.querySelector('.audio-container-demo');
words.addEventListener('click', playSoundOnce);

function playSoundOnce(e) {
  const word = e.target;
  if (word.matches('[data-audio-path]')) {
    audio.pause();
    if (word.dataset.audioPath.trim() !== '') {    
      audio.src = URL + word.dataset.audioPath;
      audio.play();
    }
  }
}

 

Podobne pytania

0 głosów
1 odpowiedź 378 wizyt
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 18 czerwca 2017 w Grafika i multimedia przez Agatapu Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 1,372 wizyt
pytanie zadane 18 lipca 2016 w JavaScript przez Alterwar Dyskutant (7,650 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...