Во-первых, давайте исправим HTML.Вам не нужны атрибуты name
или id
для вашей кнопки, и они не будут уникальными, потому что вы пишете их в цикле.Просто замените их на class="converter"
.Для тега <input>
не требуется закрывающая кнопка </input>
.
Тип submit
имеет поведение по умолчанию (которое не нужно сочетать с запросом ajax).Вы можете использовать e.preventDefault();
как this или изменить тег на что-то, что не вызывает отправку формы.
Непроверенные коды:
js
$(document).ready(function () {
$("input.converter").click(function (e) {
e.preventDefault();
let btn = $(this);
btn.val("Converting").attr("disabled", "true");
$.ajax({
cache: false,
type: "POST",
dataType: "json",
data: {id: btn.data('id')},
url: "convert.php",
success: function(response) {
btn.val(response.message).attr("disabled", response.message == "Converted" ? "false" : "true");
},
error: function (jqXHR, status, err) {
console.log("Request failed: " + status);
},
complete: function (jqXHR, status) {
console.log("Done. No matter the outcome");
}
});
return false;
});
});
php
if (empty($mp4_files[$_POST['id']])) {
exit(json_encode(['message' => 'Failed']);
}
$f = $mp4_files[$_POST['id']];
$parts = pathinfo($f);
switch ($parts['extension'])
{
case 'mp4' :
$filePath = $src_dir . DS . $f;
system('C:\ffmpeg\bin\ffmpeg.exe -i ' . $filePath . ' -map 0:2 -ac 1 ' . $destination_dir . DS . $parts['filename'] . '.mp3', $result);
exit(json_encode(['message' => 'Converted']);
}
exit(json_encode(['message' => 'Invalid File Type']);
Вот небольшая демонстрация (проверена локально на работу):
main.php
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
$("button").click(function (e) {
e.preventDefault();
let btn = $(this);
btn.html("Converting...").attr("disabled", "true");
$.ajax({
cache: false,
type: "POST",
dataType: "json",
data: {id: btn.data('id')},
url: "convert.php",
success: function(response) {
btn.html(response.message)
.attr("disabled", response.message != "Bad"); // re-enables if Bad
}
});
});
});
</script>
</head>
<body>
<?php
for ($i = 0; $i < 3; ++$i) {
echo "<div>{$i}: <button data-id=\"{$i}\">Convert</button></div>";
}
?>
</body>
</html>
convert.php
<?php
$lookup = [
'Good',
'Bad'
];
sleep(1);
echo json_encode(['message' => $lookup[$_POST['id']] ?? 'Error']);
Как это работает:
------------------------------------------- включено -> отключено ...... -> отключено
- Кнопка # 1 Прогрессирование текста: Преобразовать -> Преобразование ... -> Хорошо
- Кнопка # 2 Последовательность текста: Преобразовать -> Преобразование ... -> Плохо (включено)
- Кнопка # 3 Последовательность текста: Преобразовать -> Преобразование ... -> Ошибка