【问题标题】:Big task - problems with page refresh and ajax大任务 - 页面刷新和 ajax 问题
【发布时间】:2012-11-10 23:05:56
【问题描述】:

我有一个通过 ajax 动态加载内容的导航。但是,如果我刷新页面或访问另一个 url 并返回当前内容,我会在第一个菜单选项卡下看到旧内容。

现在我必须解决这个问题。

index.php 包括元素 header_registrated.inc.php、navigation.inc.php 和 main_container.inc.php

index.php:

<?php include("inc/incfiles/header_registrated.inc.php"); ?>
<?php
if (!isset($_SESSION["userLogin"])) {
echo "<meta http-equiv=\"refresh\" content=\"0; url=http://localhost/project\">";
}
else {
echo "";
}
?>
<?php include("inc/incfiles/navigation.inc.php"); ?>
<?php include("inc/incfiles/main_container.inc.php"); ?>
<?php include("inc/incfiles/footer.inc.php"); ?>

header_registrated.inc.php:

<?php
include ("inc/scripts/mysql_connect.inc.php");
session_start();
$user = $_SESSION["userLogin"];
?>




<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>title</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<script language="JavaScript" src="js/framework/jquery.js"></script>
<script language="JavaScript" src="js/dropdown/window.js"></script>
<script language="JavaScript" src="js/navigation/navigation.js"></script>
</head>
<body>
</body>

navigation.inc.php:

  <div class="navigation">

    <ul>
        <li id="1">
            <div id="menuImage1" class="menuImage"></div>
            <div class="menuText"><p>Punkt 1</p></div>

            <div class="navigationDart"></div>
        </li>
        <li id="2">
            <div id="menuImage2" class="menuImage"></div>
            <div class="menuText"><p>Punkt 2</p></div>
        </li>
        <li id="3">
            <div id="menuImage3" class="menuImage"></div>
            <div class="menuText"><p>Punkt 3</p></div>
        </li>
        <li id="4">
            <div id="menuImage4" class="menuImage"></div>
            <div class="menuText"><p>Punkt 4</p></div>
        </li>
        <li id="5">
            <div id="menuImage5" class="menuImage"></div>
            <div class="menuText"><p>Punkt 5</p></div>
        </li>
        <li id="6">
            <div id="menuImage6" class="menuImage"></div>
            <div class="menuText"><p>Punkt 6</p></div>
        </li>
    </ul>

</div>

main_container.inc.php:

<div class="mainContainer">

    <div class="containerHeader">

        <div class="contentHeader">


        </div>

    </div>

    <div class="contentContainer">

        <div class="content">

        </div>

        <div class="advertisement">

        </div>


    </div>

</div>

现在 div 内容、cnotentHeader 和广告(在文件 main_content.inc.php 中)通过 ajax 填充。导航也有一些 jquery 效果,页面刷新后也必须相同。

navigation.js:

$(document).ready(function() {
    $.get('inc/incfiles/content_container/header/1.php', function(data) {
        $('.contentHeader').html(data);
    }); 

    $.get('inc/incfiles/content_container/content/1.php', function(data) {
        $('.content').html(data);
    }); 

    $.get('inc/incfiles/content_container/advertisement/1.php', function(data) {
        $('.advertisement').html(data);
    }); 
    var current = '1.php';
    $(".navigation li").click(function() {
        var quelle = $(this).attr('id') + ".php";

        // the current content doesn't load again
        if(current === quelle) {
            return;
        } 

        current = quelle;

        // content
        $(".content").fadeOut(function() {
            $(this).load("inc/incfiles/content_container/content/" + quelle).fadeIn('normal');
        })

        // advertisement
        $(".advertisement").fadeOut(function() {
            $(this).load("inc/incfiles/content_container/advertisement/" + quelle).fadeIn('normal');
        })

        // header
        $(".contentHeader").fadeOut(function() {
            $(this).load("inc/incfiles/content_container/header/" + quelle).fadeIn('normal');
        })

    });

    $(".navigation li").click(function() {
        $(".menuImage").removeClass("menuImageActive1");
        $(".menuImage").removeClass("menuImageActive2");
        $(".menuImage").removeClass("menuImageActive3");
        $(".menuImage").removeClass("menuImageActive4");
        $(".menuImage").removeClass("menuImageActive5");
        $(".menuImage").removeClass("menuImageActive6");
    });

    $("#1").mousedown(function() {
        $("#menuImage1").addClass("menuImageClick1"); // new class on mouse button press
    });

    $("#1").mouseup(function() {
        $("#menuImage1").removeClass("menuImageClick1");  //remove class after mouse button release
    });

    $("#1").click(function() {
        $("#menuImage1").addClass("menuImageActive1");
    });



    $("#2").mousedown(function() {
        $("#menuImage2").addClass("menuImageClick2"); // new class on mouse button press
    });

    $("#2").mouseup(function() {
        $("#menuImage2").removeClass("menuImageClick2");  //remove class after mouse button release
    });

    $("#2").click(function() {
        $("#menuImage2").addClass("menuImageActive2");
    });



    $("#3").mousedown(function() {
        $("#menuImage3").addClass("menuImageClick3"); // new class on mouse button press
    });

    $("#3").mouseup(function() {
        $("#menuImage3").removeClass("menuImageClick3");  //remove class after mouse button release
    });

    $("#3").click(function() {
        $("#menuImage3").addClass("menuImageActive3");
    });



    $("#4").mousedown(function() {
        $("#menuImage4").addClass("menuImageClick4"); // new class on mouse button press
    });

    $("#4").mouseup(function() {
        $("#menuImage4").removeClass("menuImageClick4");  //remove class after mouse button release
    });

    $("#4").click(function() {
        $("#menuImage4").addClass("menuImageActive4");
    });



    $("#5").mousedown(function() {
        $("#menuImage5").addClass("menuImageClick5"); // new class on mouse button press
    });

    $("#5").mouseup(function() {
        $("#menuImage5").removeClass("menuImageClick5");  //remove class after mouse button release
    });

    $("#5").click(function() {
        $("#menuImage5").addClass("menuImageActive5");
    });



    $("#6").mousedown(function() {
        $("#menuImage6").addClass("menuImageClick6"); // new class on mouse button press
    });

    $("#6").mouseup(function() {
        $("#menuImage6").removeClass("menuImageClick6");  //remove class after mouse button release
    });

    $("#6").click(function() {
        $("#menuImage6").addClass("menuImageActive6");
    });

    $("#1").click(function(){

        $(".navigationDart").animate({ 
            top: "16px"
                }, 500 );
        });
    $("#2").click(function(){
        $(".navigationDart").animate({ 
            top: "88px"
                }, 500 );
        });
    $("#3").click(function(){
        $(".navigationDart").animate({ 
            top: "160px"
                }, 500 );
        });
    $("#4").click(function(){
        $(".navigationDart").animate({ 
            top: "232px"
                }, 500 );
        });
    $("#5").click(function(){
        $(".navigationDart").animate({ 
            top: "304px"
                }, 500 );
        });
    $("#6").click(function(){
        $(".navigationDart").animate({ 
            top: "376px"
                }, 500 );
        });
    });

我的想法是使用 if(isset($_SESSION['ajaxresponse'])) 但我不知道该怎么做。

请帮助我。我感觉我已经搜索了整个网络以找到答案。

【问题讨论】:

    标签: php jquery ajax session page-refresh


    【解决方案1】:

    如果您需要动态加载的选项卡,请尝试jQuery UI tabs,它内置了 AJAX 支持。

    如果你想支持 AJAX 事件的后退/前进,试试 jQuery 地址插件。

    这里有一个关于如何使用jQuery UI tabs with back/forward history的好答案:

    【讨论】:

      【解决方案2】:

      我建议使用通过 AJAX 将 PHP 与 jQuery 联系起来的库,这样可以大大缓解您的问题。图书馆是 phery http://phery-php-ajax.net 只是对您的 navigation.js 文件进行了一些优化:

      您需要将 AJAX 集中(或不集中)在一个文件中,以使其更容易。 它可以放在你的 index.php 的顶部

      function load($data){
        $r = new PheryResponse;
      
        if (!isset($_SESSION["userLogin"])) {
          return $r->redirect('http://localhost/project');
        }
      
        $path = 'inc/incfiles/content_container/';
      
        if (isset($data['id'])){
          $id = $data['id']. '.php';
        } else {
          if (!empty($_SESSION['id'])){
            $id = $_SESSION['id'];
          } else {
            $id = '1.php';
          }
        }
      
        $_SESSION['id'] = $id; // save the current ID and will load next time the person refreshes the page
      
        ob_start();
        include $path.'content/'.$id;
        $content = ob_get_clean();
      
        ob_start();
        include $path.'advertisement/'.$id;
        $ads = ob_get_clean();
      
        ob_start();
        include $path.'header/'.$id;
        $header = ob_get_clean();
      
        $r
          ->jquery('.advertisement')->html($ads)
          ->jquery('.contentHeader')->html($header)
          ->jquery('.content')->html($content)
          ;
        // etc
      
        return $r->this()->find('.menuImage')->addClass('menuImageActive'); // set the current menuImage of the LI element to menuImageActive
      }
      
      session_start();
      
      Phery::instance()->set(array(
        'load' => 'load'
      ))->process();
      

      由于你的 JS 现在性能不佳,我重做了:

      $(function() {
        phery.remote('load');
        var menu_image = $(".menuImage");
      
        $(document)
        .on('click', '.navigation li', function(event){
          menu_image.removeClass("menuImageActive");
          var top;
          switch (event.currentTarget.id){
            case '1':
              top = "16px";
              break;
            case '2':
              top = "88px";
              break;
            case '3':
              top = "160px";
              break;
            case '4':
              top = "232px";
              break;
            case '5':
              top = "304px";
              break;
            case '6':
              top = "376px";
              break;
          }
      
          $(event.currentTarget)
          .find(".navigationDart").animate({ top: top }, 500);
        })
        .on('mousedown', '.navigation li', function(event){
          $(event.currentTarget).addClass('menuImageClick');
        })
        .on('mouseup', '.navigation li', function(event){
          $(event.currentTarget).removeClass('menuImageClick');
        });
      });
      

      你的navigation.inc.php 必须是:

      <div class="navigation">
      
      <ul>
          <li id="1" data-remote="load" data-args="{'id':1}">
              <div id="menuImage1" class="menuImage"></div>
              <div class="menuText"><p>Punkt 1</p></div>
      
              <div class="navigationDart"></div>
          </li>
          <li id="2" data-remote="load" data-args="{'id':2}">
              <div id="menuImage2" class="menuImage"></div>
              <div class="menuText"><p>Punkt 2</p></div>
          </li>
          <li id="3" data-remote="load" data-args="{'id':3}">
              <div id="menuImage3" class="menuImage"></div>
              <div class="menuText"><p>Punkt 3</p></div>
          </li>
          <li id="4" data-remote="load" data-args="{'id':4}">
              <div id="menuImage4" class="menuImage"></div>
              <div class="menuText"><p>Punkt 4</p></div>
          </li>
          <li id="5" data-remote="load" data-args="{'id':5}">
              <div id="menuImage5" class="menuImage"></div>
              <div class="menuText"><p>Punkt 5</p></div>
          </li>
          <li id="6" data-remote="load" data-args="{'id':6}">
              <div id="menuImage6" class="menuImage"></div>
              <div class="menuText"><p>Punkt 6</p></div>
          </li>
      </ul>
      
      </div>
      

      看起来你的 CSS 是为了你的 HTML 的简单而复杂的。而且您不应该使用数字作为 ID,ID 必须是在这种情况下您应该重用 css 类,例如

       .menuImageActive {
         /* common styles */  
       }
       .menuImageClick {
         /* common styles */  
       } 
       /* apply per ID */  
       #menuImage1.menuImageActive {
       }
       #menuImage1.menuImageClick {
       }
      
       #menuImage2.menuImageActive {
       }
       #menuImage2.menuImageClick {
       }
      
       #menuImage3.menuImageActive {
       }
       #menuImage3.menuImageClick {
       }
      
       #menuImage4.menuImageActive {
       }
       #menuImage4.menuImageClick {
       }
      
       #menuImage5.menuImageActive {
       }
       #menuImage5.menuImageClick {
       }
      
       #menuImage6.menuImageActive {
       }
       #menuImage6.menuImageClick {
       }
      

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 1970-01-01
        • 2011-05-13
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多