запуск ссылки href для скачивания и событие .click с $ .post () с помощью jquery - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь получить одну ссылку для загрузки файла и одновременно отправить форму сообщения через ajax. вроде выглядит так:

<form action="" method="post" id="form">
    <input type="text" name="email" id="email" value="" />
    <input type="hidden" name="subscriber" id="subscriber" value="newsletter" />
    <a href="/files/application.exe" id="download">trial download</a>
</form>
<script type="text/javascript" src="jquery"></script>
<script type="text/javascript">
    // prevent default submit action caused by enter key etc.
    $("#form").bind('submit',function(event){event.preventDefault();});
    $('#download').click(function(){
        $.post(location.href, $('#form').serialize(), function(){
             $('#form').hide();
        });
    });
</script>

проблема заключается в том, что загрузка запускается, и отображается диалоговое окно загрузки - что является правильным - оно также запускает событие click и даже ведет журнал консоли внутри функции события click, оно даже запускает запрос post, но запрос post никогда заканчивается на сервере. У меня был файл журнала доступа в tail -f, и он показывает только GET для application.exe, но не POST из $ .post (). в firebug он показывает POST http://ip/folder/, заданный location.href, и помечен красным с небольшим X и пустым полем ответа. похоже на то, что его отправили на сервер ...

Мое объяснение этому заключается в том, что href извлекает из $ .post () ветер и до его запуска перенаправляет браузер на загружаемый файл. не изменяет саму страницу, но останавливает действие публикации через XHR ...

кто-нибудь знает хороший обходной путь для этого? мне действительно нужна собственная ссылка href на приложение, чтобы IE не вызывал эту глупую строку предупреждения о загрузке файлов, и в то же время мне нужен ajax для отправки формы ...

спасибо!

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Выполните рефакторинг следующим образом, возвращая false, чтобы предотвратить поведение по умолчанию по ссылке:

$('#download').click(function(){
    var href = $(this).attr('href');
    $.post(location.href, $('#form').serialize(), function(){
         $('#form').hide();
         document.location.href= href;
    });
    return false;
});
0 голосов
/ 23 ноября 2010

, чтобы дать один ответ, который работает на мой собственный вопрос:

$('#download').click(function(){
    setTimeout(function(){
        $.post(location.href, $('#form').serialize(), function(){
             $('#form').hide();
        });
    },1000);
});

тайм-аут запускает .post после запуска запроса на загрузку ... sortof работает ... но я не знаю, если этохорошее решение или если это может не сработать в 50% случаев и браузер ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...