2012-02-17 24 views
11

Tôi đang sử dụng Chrome và đây là mã của tôi:HTML5 Audio - Sound chỉ đóng một lần

<audio id="letter_audio" src="audio/bomb.mp3" type="audio/mp3" preload="auto"></audio> 

    $('.sound').live('click', function() { 

     var sound = $("#letter_audio")[0]; 

     sound.pause(); 
     sound.currentTime = 0; 
     sound.play(); 

     return false; 
    }); 

Tại sao âm thanh đóng lần đầu tiên tôi nhấp vào chơi. sau đó khi tôi nhấp một lần nữa, nó tạm dừng, giống như mã đi. nhưng nó justs vẫn tạm dừng? tôi muốn nó để chơi, sau đó khi tôi bấm vào nó một lần nữa, quay trở lại 0 và chơi một lần nữa như trong mã?

+0

hi, bạn có tìm thấy giải pháp không? – Lloyd

+0

giải pháp nào đang hoạt động –

+0

Giải pháp của Tom để thêm sound.load() làm việc cho tôi – kronuus

Trả lời

3

hãy thử điều này .. về cơ bản, đặt lại thuộc tính src phải đặt lại âm thanh như mong muốn.

$('.sound').live('click', function() { 

    var sound = $("#letter_audio")[0]; 

    sound.src = "audio/bomb.mp3"; 
    sound.play(); 

    return false; 
}); 
+1

Cảm ơn! này hoạt động, nhưng ... có vẻ như nó gửi một yêu cầu cho mp3 mỗi khi bạn "thay đổi" src. Vì vậy, đó là một ít tốn kém – Harry

+1

Nó không đắt tiền - nó rẻ .. chỉ nhấp chuột đầu tiên instigates bất kỳ hoạt động mạng .. nhấp chuột tiếp theo truy cập mp3 trực tiếp trong bộ nhớ cache đĩa địa phương - không có chi phí ở tất cả .. xem cho chính mình trong Chrome Dev Tools , Tab mạng – Lloyd

+1

có, nhưng anh ấy đúng. mọi lúc bạn * thay đổi * src nó sẽ gửi một yêu cầu. – kr1

23

Tôi đã có vấn đề tương tự phát lại âm thanh, nhưng quản lý để giải quyết nó bằng cách gọi phương thức load() trước play() gọi. Hãy thử điều này:

$('.sound').live('click', function() { 
    var sound = $("#letter_audio")[0]; 

    sound.load(); 
    sound.play(); 

    return false; 
}); 

Tôi nghĩ rằng đây là tốt hơn so với đặt lại thuộc tính src vì hai lý do:

  1. Giữ giá trị src trong nội dung trang, chứ không phải là trong JavaScript
  2. trình khi bạn nhúng nhiều phần tử <source> của các định dạng âm thanh khác nhau:

    <audio id="letter_audio"> 
        <source src="audio/bomb.mp3" type="audio/mp3" preload="auto"/> 
        <source src="audio/bomb.ogg" type="audio/ogg" preload="auto"/> 
    </audio> 
    
+0

làm việc cho tôi! Cảm ơn! – kronuus

+1

Đây là một giải pháp tốt, nhưng tôi ước tôi hiểu nguyên nhân của vấn đề tốt hơn. '.load()' có vẻ như quá mức cần thiết dựa trên [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#Methods) và [WHATWG] (https: // html. mô tả spec.whatwg.org/multipage/media.html#loading-the-media-resource). Nếu tôi xuất ra 'sound.error' sau khi cố gắng' play() ', thông báo là" không gửi gói âm thanh để giải mã ". Điều đó nghe có vẻ như là một lỗi đối với tôi, nhưng tất cả những gì tôi có thể tìm thấy là một thứ liên quan rất lỏng lẻo. '.load()' không cần thiết cho các tệp OGG. – Vince

0

có vẻ như thời điểm hiện tại thuộc tính currentTime là chỉ đọc (và vào năm 2011 nó đã có một wont-fix status)

Tuy nhiên, sau khi cài đặt src trên nghe đối tượng của bạn (một lần nữa) - như cũng đề xuất bởi @Lloyd - thuộc tính currentTime có thể được cài đặt (ít nhất là trên phiên bản chrome hiện tại cho Linux (24.0.1312.69)).

điều này có nghĩa bằng cách thêm dòng lạ

audio.src = audio.src 

dụ bạn làm những gì nó là vụ phải.

đầy đủ:

$('.sound').live('click', function() { 

    var sound = $("#letter_audio")[0]; 
    sound.src = sound.src; 
    sound.pause(); 
    sound.currentTime = 0; 
    sound.play(); 

    return false; 
}); 

vì nó là đủ thiết lập src một lần, bạn có thể muốn gọi nó là ở đâu đó trong quá trình thiết lập.

0

bạn có thể sử dụng php để thêm truy vấn ở cuối url với thời gian();

<source src="URLtoTrack.mp3?<?php echo time(); ?>" />

làm việc cho tôi.

Các vấn đề liên quan