ajax函数成功时刷新音频源

Ric*_*ich 5 ajax jquery audio-streaming ajaxform html5-audio

在我的 WordPress 网站上,我有一个使用 AJAX 和 PHP 将文本转换为音频的表单。更新转换后的文本时,文件名保持不变,只是重新创建文件。

一切似乎都工作正常,除了当我更新文本时要播放的音频源没有重新加载/刷新。

默认下载按钮为我提供更新的文件,如果我刷新整个页面,我只能听到更新的文件播放。

我的代码(为了相关性而简化)--

jQuery(document).on('click', '#savetext', function(e) {
  e.preventDefault();
  var myVideo = $('#player');
  var path = $("#path").val();
  myVideo.src = path;

  $.ajax({
    data: {
      action: 'polly_pros',
      pollytext: txt,
      rate: rate,
      voice: voice
    },
    type: 'post',
    url: polpro.ajax_url,
    cache: false,
    success: function(data) {
      console.log(data);
      myVideo.load();
      myVideo.get(0).play();
    },
    error: function() {
      console.log("Error");
    }
  });
});
Run Code Online (Sandbox Code Playgroud)
<audio id="player" controls>
  <source id="audiosource" src="<?php echo $thepath; ?>" type="audio/mpeg">
  Your browser does not support the audio element.
</audio>

<textarea name="pollytext" id="pollytext"></textarea>
<button type="submit" id="savetext" name="savetext">save text</button>
Run Code Online (Sandbox Code Playgroud)

我怎样才能使文件更新时播放的音频也更新?

更新

我尝试了以下建议,但它没有解决问题 -

 $.ajax ({        
         data: {
          action: 'polly_pros', 
          pollytext: txt,
          rate: rate,
          voice: voice
        },
         type: 'post',
         url: polpro.ajax_url,
         cache: false,
       success: function(data) {
           console.log(data);
 myVideo.src = path+"&rnd="+new Date().getTime();
myVideo.load();
myVideo.get(0).play();
        },
          error: function() {
            console.log("Error");            
        }
            });
Run Code Online (Sandbox Code Playgroud)

Krz*_*ski 1

很可能是因为 Ajax 调用的函数仅重新加载文件,但不保存新文件。所以浏览器不会重新加载该文件。

这是一个解决方案

您必须在文件名末尾添加随机字符串,以便浏览器认为这是一个不同的文件并重新加载它

jQuery(document).on('click', '#savetext', function(e) {
  e.preventDefault();
  var myVideo = $('#player');
  var path = $("#path").val();
  myVideo.src = path + "?" + new Date().getTime();

  $.ajax({
    data: {
      action: 'polly_pros',
      pollytext: txt,
      rate: rate,
      voice: voice
    },
    type: 'post',
    url: polpro.ajax_url,
    cache: false,
    success: function(data) {
      console.log(data);
      myVideo.load();
      myVideo.get(0).play();
    },
    error: function() {
      console.log("Error");
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

时间戳是您确定的数字,每次都会不同。

编辑

如果有时有效,有时无效,则可能意味着 Ajax 有时更快,有时更慢。这应该有帮助

jQuery(document).on('click', '#savetext', function(e) {
  e.preventDefault();
  var myVideo = $('#player');

  $.ajax({
    data: {
      action: 'polly_pros',
      pollytext: txt,
      rate: rate,
      voice: voice
    },
    type: 'post',
    url: polpro.ajax_url,
    cache: false,
    success: function(data) {
      console.log(data);
      var path = $("#path").val();
      myVideo.src = path + "?" + new Date().getTime();
      myVideo.load();
      myVideo.get(0).play();
    },
    error: function() {
      console.log("Error");
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 我做到了。这只是文件名末尾的随机字符串。浏览器获取不同的文件名并重新加载它。如果它获得相同的名称,则无需重新加载文件。我不知道为什么会延迟,可能是因为 Ajax?问号与浏览器 url 中使用的问号相同,因此这只是一个变量。这就是为什么它并没有真正改变任何东西。只是浏览器认为这是一个不同的文件。 (2认同)
  • `new Date()` 使用当前日期时间创建新的日期对象。`getTime()` 从日期对象获取时间戳。所以它看起来可能像“1527167853296”这样平滑。不一定是约会,但这样你就可以确定每次的约会都是不同的。 (2认同)