Вызов Jquery AJAX для создания загружаемых файлов, кажется, выполняется дважды - изо всех сил пытаясь понять, почему: o ( - PullRequest
0 голосов
/ 02 февраля 2011

Я использую вызов Jquery Ajax для доставки загрузки файла пользователям сайта.Процесс:

1) Пользователи выбирают различные файлы, которые они хотят, нажав на них 2) Я сохраняю их выбор в базе данных mysql 3) У меня есть панель div в правой части страницы, где перечислены их файлы(как корзина) и предоставляет кнопку загрузки 4) Если они нажимают на кнопку, он запускает jjery ajax-вызов php-файла для создания zip-файла, загружает все выбранные файлы в zip-архив и затем закрывает zip-архив.Наконец, верните имя файла zip в формате json.5) success: затем запускает window.open, чтобы вызвать загрузку

Все это в основном работает, но есть странная проблема, которую я не могу решить, и это убивает меня!

Вот битыкода:

Первый javascript:

//download files in a zip
$("#zipdownload").click(function(){
 $.ajax({
    type: "GET",
    url: "zipdload.php",
    dataType: "json",
    cache: false,
    success: function(data) {

//opens a small window for IE security thing
    window.open(data.archive,'download','left=20,top=20,width=300,height=20,toolbar=0,resizable=0');    
    // then clears all the divs to simulate the bag emptying
        $('#bagCounter').text("Empty!");
        $('#zipdownload').text(""); 
        $('#item-list').text("");           
        }
});

});

Затем макет:

//styled containers to create a sliding panel with a clickable tab
<div id="rightpanelouter">
<div id="rightpanelinner">
<?php if ($_SESSION['username']){
    echo $_SESSION['username'].'<br>Toolbox';
    };
?>

<div id="bagContents">
  <div id="item-list">
            <br> Show Bag
            //PHP to generate list of files
       </div>
       <br><br>
       <div id="zipdownload" style="cursor:pointer;">
           //this element has the action attached to fire function.
               <?php 
           if ($numOfBagDocs != 0){
               echo 'Download';
       }
        ?>
   </div>
</div>

Если кому-то интересно, я тоже могу прикрепить скрипт PHP, но яЯ предполагаю, что это не проблема.

Проблема:

Сценарий запускается дважды (как минимум).

Первоначально я добавил в zip-файл штамп now (), чтобы они всегда были разными.но я иногда замечал, что window.open пытался загрузить файл с меткой now (), равной 1 секунде, отличной от сохраненного файла.

Затем я попытался изменить число на rand (), которое показало два разных случайных числа!

Поэтому я удалил добавление, чтобы имя файла всегда было одинаковым (только добавляется с именем пользователя)и что скачал, но просто продолжал добавлять тот же zip-файл с новыми записями.Все, что нужно сделать, это заставить zip расти и расти.

Так что я попытался вставить ссылку file_exists и unlink, чтобы удалить файл перед созданием zip.Все, что казалось, делало, это удаляло файл ПОСЛЕ создания zip и до начала загрузки jscript !!!: - (

Все это говорит мне, что скрипт вызывается как минимум дважды.

Я видел много записей, похожих на это, но я не могу понять, относятся ли они к моемуОднажды было предложено связать 'unbind' перед функцией click, и это просто перестало работать, так что ничего хорошего.

HTML-код, который я прикрепил, почти сразу после тега body, и нетдругие javascript-вызовы в этом разделе.

Так что извиняюсь, если здесь есть действительно глупая ошибка, но я сейчас провел много часов, прочесывая и просто не могу ее решить.

Я быДЕЙСТВИТЕЛЬНО ценю любую помощь. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Так что я дошёл до сути, не понимая почему.Я полагаю, отсутствие надлежащего образования на языке javascript!Проблема была связана с тем, что я загружал страницу с другой страницы с помощью .load и связывал соответствующий JScript на второй странице.Однако нажатие DIV было внутри начальной страницы (теперь я помню, что переместил его по эстетическим соображениям).

Так что я переместил функцию click в Jscript, вызываемый с самой начальной страницы, и он теперь только делает этосрабатывает один раз!

Так что я не понимаю, почему это будет иметь значение, но это так, поэтому я рад, что могу продолжить.

Спасибо за чтение и надеюсь, что однажды это поможет кому-то еще!

1 голос
/ 25 августа 2015

У меня была такая же проблема. Я решил это, добавив

evt.stopImmediatePropagation();

к функции. Конечно, вы должны добавить evt к функции, например:

$(document).on("click", "a.className", function (evt) {

    evt.stopImmediatePropagation();

    $.fileDownload($(this).prop('href'), {
        preparingMessageHtml: "File prepared...",
        failMessageHtml: "Error!",
    });

    return false;
});

Кажется, это происходит, потому что есть вложенные элементы, которые запускают это событие много раз. См. jQuery. Клик срабатывает дважды при нажатии на ярлык

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