Что-то заставляет мою страницу выполнять вызов Ajax несколько раз ... [читай: я никогда не был так разочарован чем-то настолько «простым» в моей жизни] - PullRequest
1 голос
/ 22 мая 2010

ПРИМЕЧАНИЕ. Это длинный вопрос. Я объяснил все «основы» сверху, а затем есть некоторая дополнительная (необязательная) информация, если вам это нужно.

Привет, ребята

Прошлой ночью это началось примерно в 9 вечера, когда я пытался реструктурировать свой код, чтобы сделать дизайнера более привлекательным для добавления нескольких битов. Я пытался исправить это до 2 утра, после чего я сдался. Вернулся к нему сегодня утром, все еще сбитый с толку.

Я буду честен с вами, я довольно плохой разработчик Javascript. С момента запуска этого проекта Javascript был совершенно новым для меня, и я только учусь по ходу дела. Поэтому, пожалуйста, прости меня, если моя структура кода действительно плохая (возможно, дайте пару советов о том, как ее улучшить?).


Итак, к проблеме: чтобы воспроизвести это, посетите http://furnace.howcode.com (это далеко не завершено). Эта проблема немного сбивает с толку, но я бы очень признателен за помощь.

  1. Итак, во втором столбце вы увидите три вкладки
  2. По умолчанию выбрана вкладка «Новейшие». Прокрутите вниз, и через Ajax будут динамически извлекаться еще 3 результата.
  3. Теперь нажмите на вкладку «Лучшие». Вы увидите все результаты, но упорядочены по рейтингу
  4. Прокрутите до нижней части «Лучшие оценки». Вы увидите возвращенные результаты SIX.
  5. Вот где все идет не так. Должны быть возвращены только еще три (всего 18 записей). Если вы внимательны, вы заметите два «блока» из 3-х.
  6. Первый блок - это вторая страница результатов на вкладке «Новейшие». Второй блок - это то, что я просто хочу вернуть .

Это имело смысл? Не бери в голову!

Так что я проверил это в Firebug. Происходит следующее: со страницы «Очистить» (первая загрузка ничего не делается) он вызывает ONE POST-запрос к http://furnace.howcode.com/code/loadmore.

Но каждый раз, когда вы загружаете новую вкладку, он делает ДОПОЛНИТЕЛЬНЫЙ POST-запрос каждый раз, когда обычно должен быть только ОДИН.

Так, вы можете мне помочь? Я действительно ценю это! В этот момент вы можете начать независимое расследование или прочитать дополнительную (дополнительную) информацию.

Спасибо!

Jack


Дополнительная информация (может быть неактуальной, но здесь для справки):

Это похоже на то, что есть какой-то код Javascript или что-то еще, что дублирует его каждый раз. Я подумал, что это может быть этот код, который я использую, чтобы определить, когда браузер прокручивается вниз:

var col = $('#col2');
    col.scroll(function(){
        if (col.outerHeight() == (col.get(0).scrollHeight - col.scrollTop()))
            loadMore(1);
    }); 

Итак, я подумал, что код остался позади, и поэтому каждый раз, когда вы прокручиваете # col2 (который содержит разные данные для каждой вкладки), он обнаруживает это и добавляет его для #newest. Итак, я сделал каждый щелчок вкладки, чтобы дать # col2 динамический класс - .newestcol, .featuredcol или .topratedcol. А потом я динамически изменил var col=$('.newestcol');, чтобы он обнаруживал его только для каждой вкладки (что-то вроде ?!). Но эй, это ничего не сделало.

Еще одна полезная новость: вот PHP для http://furnace.howcode.com/code/loadmore:

   $kind  = $this->input->post('kind');

            if ($kind == 1){        // kind is 1 - newest

                $start  = $this->input->post('currentpage');
                $data['query']  = "SELECT code.id AS codeid, code.title AS codetitle, code.summary AS codesummary, code.author AS codeauthor, code.rating AS rating, code.date,
                    code_tags.*, 
                    tags.*, 
                    users.firstname AS authorname, 
                    users.id AS authorid,
                    GROUP_CONCAT(tags.tag SEPARATOR ', ') AS taggroup
                    FROM code, code_tags, tags, users
                    WHERE users.id = code.author AND code_tags.code_id = code.id AND tags.id = code_tags.tag_id
                    GROUP BY code_id
                    ORDER BY date DESC
                    LIMIT $start, 15  "; 

                $this->load->view('code/ajaxlist',$data);

            } elseif ($kind == 2) {     // kind is 2 - featured

Так что мой код jQuery отправляет переменную kind. Если это 1, он выполняет запрос для Новейших и т. Д. И т. Д.

PHP-код для stop.howcode.com/code/ajaxlist:

<?php // Our query base
    // SELECT * FROM code ORDER BY date DESC
    $query = $this->db->query($query);  

    foreach($query->result() as $row) {
?>


<script type="text/javascript">
    $('#title-<?php echo $row->codeid;?>').click(function() {
        var form_data = {
            id: <?php echo $row->codeid; ?>
        };

        $('#col3').fadeOut('slow', function() {
            $.ajax({
                url: "<?php echo site_url('code/viewajax');?>",
                type: 'POST',
                data: form_data,
                success: function(msg) {
                    $('#col3').html(msg);
                    $('#col3').fadeIn('fast');
                }
        });
        });
    }); 
</script>

<div class="result">

    <div class="resulttext">

        <div id="title-<?php echo $row->codeid; ?>" class="title">
            <?php echo anchor('#',$row->codetitle); ?>
        </div>

        <div class="summary">
            <?php echo $row->codesummary; ?>
        </div>

        <!-- Now insert the 5-star rating system -->
        <?php include($_SERVER['DOCUMENT_ROOT']."/fivestars/5star.php");?>

        <div class="bottom">

            <div class="author">
                Submitted by <?php echo anchor('auth/profile/'.$row->authorid,''.$row->authorname);?>
            </div>

            <?php 
            // Now we need to take the GROUP_CONCATted tags and split them using the magic of PHP into seperate tags
            $tagarray = explode(", ", $row->taggroup);
            foreach ($tagarray as $tag) {
            ?>

            <div class="tagbutton" href="#">
                <span><?php echo $tag; ?></span>
            </div> 
                <?php } ?>                      
        </div>

    </div>

</div>

<?php }

echo "&nbsp;";?>

<script type="text/javascript">
var newpage = <?php echo $this->input->post('currentpage') + 15;?>;
</script>

Так что это все в PHP. Остальное вы сможете просматривать с помощью Firebug или путем просмотра исходного кода. Я поместил все биты Tab / click / Ajaxloading в тегах в самом низу. Есть комментарий, прежде чем все это начнется.

Большое спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 22 мая 2010

Я думаю, вы правы, подозревая этот блок кода:

var col = $('#col2');
    col.scroll(function(){
        if (col.outerHeight() == (col.get(0).scrollHeight - col.scrollTop()))
            loadMore(1);
    }); 

Я предполагаю, что вы продолжаете добавлять дополнительные обработчики событий (по сути, дубликаты) каждый раз, когда запускаете этот код. Вам нужно удалять (отменять привязку) существующие обработчики событий при каждом нажатии вкладки, чтобы вы могли быть уверены, что он запускается только один раз:

$('#col2').unbind();

var col = $('#col2');
    col.scroll(function(){
        if (col.outerHeight() == (col.get(0).scrollHeight - col.scrollTop()))
            loadMore(1);
    }); 

Или что-то в этом роде. Смотри http://api.jquery.com/unbind/

1 голос
/ 22 мая 2010

$('.featurecol');, $('.topratedcol'); и $('.newestcol'); все относятся к одному и тому же столбцу и разделу (<div>). Таким образом, всякий раз, когда вы переключаете страницы, вам необходимо отменить привязку старой прокрутки перед повторной привязкой нового обработчика прокрутки. (Или же вы добавите другой обработчик прокрутки и получите несколько запросов, как сейчас)

Вы можете сделать это, добавив unbind следующим образом:

  var col = $('.newestcol');
  col.unbind('scroll');
  col.scroll(function(){
  if (col.outerHeight() == (col.get(0).scrollHeight - col.scrollTop()))
      loadMore(1);
  }); 

Это необходимо сделать для всех столбцов при загрузке (code/newest, code/toprated и code/featured).

0 голосов
/ 22 мая 2010

Это также может быть

$('#col3').fadeOut('slow', function() {

когда ajax загружается туда ... n раз, когда он исчезает, он вызывает другой запрос ajax.

не говорит, что это ответ защитника, но что-то изучает ...

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