давай по-порядку
>> каптча
1) выводишь каптчу и поле для ввода каптчи
2) выводишь тригер проверки каптчи, чаще всего это какая-нибудь кнопка (например "Скачать трек")
3) в момент нажатия кнопки (или исполнения тригера), проверяешь каптчу. Тригером может быть что угодно, например event "blur", который срабатывает, когда теряется фокус с поля ввода каптчи..
4) если плохой результат показываешь ошибку
5) если все ок, значит делаешь действие
>> как мне сделать так, чтобы когда я нажал на "submit" формы, произошел запрос к серверу и в случае верной капчи отдал на скачивание файл а при ошибке вывел ошибку, но текущей странице, без обновления.
1) делаешь кнопку (можно без формы), пусть это будет "Скачать"
2) на кнопку вешаешь функцию:
$('#btn').click(function(){
....
// проверка каптчи
// показ ошибки или скачивание файла
....
});
3) при нажатии на кнопку проверяешь каптчу
4) если ошибка, показываешь сообщение, обновляешь каптчу и выходишь из функции:
$('#btn').click(function(){
....
if (!valid_captcha()) return false;
// показ ошибки или скачивание файла
....
});
function valid_captcha(){
var ret = false;
// проверка каптчи
return ret;
}
5) делаешь ajax запрос к скрипту на php, например к file.php , передаешь параметры какие-надо
скрипт возвращает тебе путь к файлу на который ты переходишь с помощью метода:
при отдаче файла, посылаешь заголовоки вида:
Content-Type application/octet-stream
чтобы форсировать вызов диалога "Сохранить как"
сделатьэто можно как на стороне php так и на стороне веб-сервера, если редирект будет напрямую на mp3 файл
>> Как мне запретить нажимать submit, если не введена капча, если капча была уже введена и кто-то нажимает снова на submit.
P.S. Если все таки решил делать в форме, то тогда в случае ошибок ты можешь остановить выполнение вернув false в submit event-е, т.е.:
<form action="http://google.com">
<input type="submit">
</form>
<script>
$('form').first().submit(function(){
if (!confirm('Submit form?')) return false;
});
</script>