【发布时间】:2018-08-23 17:55:18
【问题描述】:
在我的页面上,我有一个 ajax 脚本,它有一系列 ajax 调用嵌套在彼此的成功函数中,以便执行下一个。例如——
$.ajax({
data: {
action: 'polly_pros',
pollytext: text
},
type: 'post',
url: polpro.ajax_url,
cache: false,
success: function(data) {
$('#player')[0].pause();
$('#player')[0].load();
var aud_dur = $('#aud_dur').val();
// NEXT AJAX CALL
$.ajax({
data: {
在我的表单上我的隐藏输入--
<input type="hidden" name="aud_dur" id="aud_dur" value="" />
在我的页面上,每当加载音频文件时更新我隐藏的音频文件输入,我使用 --
var Aud = $('#player');
var aud_dur = $('#aud_dur');
Aud[0].addEventListener('loadeddata', function() {
aud_dur.val($('#player')[0].duration);
});
在我的 php 脚本中,我试图这样检索值 --
$aud_dur = $_POST['aud_dur'];
我的隐藏输入在我的表单上更新得很好,但新值没有被发回,以便我可以在下一个 ajax 调用中使用它。现在似乎没有从变量发送任何数据。
有什么建议吗?
编辑
我的 ajax 代码中有几个调用在前一个调用成功后执行。
polly_pros ajax 调用创建一个音频文件,下面的 ajax 调用假设从那里获取音频持续时间,我也将其放入隐藏输入中。
如果文件已经存在,我可以获得持续时间,但如果动态创建文件(就像我需要做的那样),我无法获得持续时间值。
这是我的完整 ajax 代码(删除无关变量以简化)---
jQuery(document).on('click', '#make-vid', function(e) {
e.preventDefault();
var aud_dur;
var pollytext = $('#pollytext').val();
var path = $('#path').val();
var post_id = $('#post_id').val();
// AJAX CALL
$.ajax({
url: vformpro.ajax_url,
data: {
action: 'vform_pros',
post_id: post_id,
},
type: 'POST',
success: function(data) {
console.log(data);
var audio = $("#player");
var post_id = $("#post_id").val();
var aud_dur = $("#aud_dur").val();
var tune_dur = $("#tune_dur").val();
// AJAX CALL
$.ajax({
data: {
action: 'polly_pros',
post_id: post_id
},
type: 'post',
url: polpro.ajax_url,
cache: false,
success: function(data) {
console.log(data);
$('#player')[0].pause();
$('#player')[0].load(function() {
// HERE I AM TRYING TO GET THE AUDIO DURATION UPON SUCCESS OF THIS AJAX CALL SO // THAT I CAN PASS IT TO THE FOLLOWING AJAX CALL
var Aud = $('#player');
var aud_dur = $('#aud_dur');
Aud[0].addEventListener('loadeddata', function() {
aud_dur.val($('#player')[0].duration);
console.log(aud_dur);
});
});
// AJAX CALL
$.ajax({
data: {
action: 'mvid_pros',
post_id: post_id,
aud_dur: aud_dur,
tune_dur: tune_dur
},
type: 'post',
url: mvidpro.ajax_url,
cache: false,
success: function(data) {
console.log(data);
$("#video-preview")[0].pause();
$("#video-preview")[0].load();
},
error: function() {
$('.load-text').text('Error on making Video.');
}
});
},
error: function(data) {
console.log(data);
},
});
}
});
});
更新
这是一个link to the full code (WIP),可以为我的问题提供更好的背景。
【问题讨论】:
-
您的第二个 ajax 调用在您的播放器的加载数据事件之前开始,因此
var aud_dur = $('#aud_dur').val();行获取之前的值。尝试将var aud_dur = $('#aud_dur').val();和您的第二个 ajax 调用放在 loaddeddata 事件处理程序中。 -
当您调用 Ajax 调用时,JS 会在将值分配给 HTML 中的隐藏变量之前立即运行。有一种方法,如果你想在调用下一个ajax调用前加上一秒的settimeout(1000, passtheAJAXfunction(aud_val)),单独编写ajax调用函数,在第一次ajax调用成功时调用。
-
@vbRocks 请查看我更新的问题
-
无论谁否决了我的问题,至少应该解释一下原因。
-
那么我想我来对地方学习了,不是吗?我绝对不是 JS 开发人员,这是我第一次不得不一个接一个地运行 ajax 调用。
标签: javascript jquery ajax html5-audio