2

私は最近、ページネーションに関して、私がやりたいことを正確に実行しているサイトに出くわしました。見つけたサイトと同じ基本設定です。

ポートフォリオをナビゲートするための前のリンクと次のリンクが必要です。各プロジェクトは別々のファイル(1.php、2.php、3.phpなど)にあります。たとえば、1.phpページを表示していて、[次のプロジェクト]をクリックすると、2に移動します。 php。

私が参照しているサイトは、javascriptでこれを実現しています。私はそれがjQueryではないと思います:

function nextPg(step) {
  var str = window.location.href;
  if(pNum = str.match(/(\d+)\.php/i)){
    pNum = pNum[1] * 1 + step+'';
    if ((pNum<1) || (pNum > 20)) { pNum = 1; }
    pNum = "".substr(0, 4-pNum.length)+pNum;
  window.location = str.replace(/\d+\.php/i, pNum+'.php'); 
}
}

そしてHTML:

<a href="javascript:nextPg(+1)" class="nextProject">Next Project</a>

上記のコードを実際に解読することはできませんが、スクリプトが現在のページを検出し、現在のページより1つ大きい次のページリンクに番号を挿入すると思います。

このコードをコピーできると思いますが、最善の解決策ではないようです。phpでこれを行う方法はありますか(javascriptがオフになっている人向け)?そうでない場合、このスクリプトをjQueryで使用するために変換できますか?

また、phpで実行できる場合、ダーティURLなしで実行できますか?例えば、http://www.example.com/index.php?next=31

リンク能力を維持したい。

私はこのトピックでstackoverflowを検索しました。ページ内のページネーションについては多くの質問がありますが、私が見つけた別のページへの移動については何もありません。

4

2 に答える 2

2

URL の構造に影響を与えることなく、これを行うことができます。

ajax 呼び出しを使用して、ページ フローを制御する関数を作成する

function changePage(page){
  $.ajax({ 
    type: 'POST',
    url: 'myPaginationFile.php',
    data: 'page='+page,
    success: function(data){
      //work with the returned data.
    }
  });  
}

この関数は、グローバル関数として作成する必要があります。

ここで、ページの読み込み時に関数を呼び出して、常に最初のページに到達するようにします。

changePage('1');

次に、リクエストを処理し、必要なものを出力するためのページネーション ファイルを作成する必要があります。

<?php
  //include whatever you need here. We'll use MySQL for this example



  $page = $_REQUEST['page'];
  if($page){ 
    $q = $("SELECT * FROM my_table");

    $cur_page = $page; // what page are we on

    $per_page = 15; //how many results do we want to show per page?

    $results = mysql_query($q) or die("MySQL Error:" .mysql_error()); //query 

    $num_rows = mysql_num_rows($result); // how many rows are returned

    $prev_page = $page-1 // previous page is this page, minus 1 page.
    $next_page = $page+1 //next page is this page, plus 1 page.

    $page_start = (($per_page * $page)-$per_page); //where does our page index start
    if($num_rows<=$per_page){
      $num_pages = 1;
      //we checked to see if the rows we received were less than 15. 
      //if true, then we only have 1 page.
    }else if(($num_rows % $per_page)==0){
      $num_pages = ($num_rows/$per_page);
    }else{
      $num_pages = ($num_rows/$per_page)+1;
      $num_pages = (int)$num_pages;
    } 

    $q. = "order by myColumn ASC LIMIT $page_start, $per_page";
    //add our pagination, order by our column, sort it by ascending 

    $result = mysql_query($q) or die ("MySQL Error: ".mysql_error());
    while($row = mysql_fetch_array($result){
      echo $row[0].','.$row[1].','.$row[2];
      if($prev_page){
        echo '<a href="#" id="prev-'.$prev_page.'"> Previous </a>';
        for(i=1;$i<=$num_pages;$i++){
          if($1 != $page){
            echo "<a href=\"JavaScript:changePage('".$i."');\";> ".$i."</a>";
          }else{
            echo '<a class="current_page"><b>'.$i.'</a>';
          }
        }
        if($page != $num_pages){
          echo "<a class='next_link' href='#' id='next-".$next_page."'> Next </a>';
        }
      }
    }          
  }

次の関数と前の関数を明示的に定義することにしました。ここでは jQuery を使用します。

$(".prev_link").live('click', function(e){
  e.preventDefault();//not modifying URL's here.
  var page = $(this).attr("id");
  var page = page.replace(/prev-/g, '');
  changePage(page);              
});

$(".next_link").live('click', function(e){
 e.preventDefault(); // not modifying URL's here
 var page = $(this).attr("id");
 var page = page.replace(/next-/g, '');
 changePage(page);
});

最後に、最初に作成した changePage 関数に戻り、データの移動先 (できれば DOM 内に既に存在する DIV) を設定します。

...
success: function(data){
  $("#paginationDiv").html(data);
}

これにより、URL バーを変更せずに ajax と php を使用してページネーションを実行する方法について、少なくともある程度の洞察が得られることを願っています。

幸運を!

于 2012-02-28T20:52:59.163 に答える
2

あなたの質問から、何ページになるかがわかります。このことから、ページ自体のコンテンツはハードコードされており、データベースから動的にロードされないことを意味します。

これがあなたが取ろうとしているアプローチである場合は、JavaScript で同じコースを取ることができます: 要求するファイル名で配列を設定し、次にイベント ハンドラーを前/次ボタンにアタッチして、配列を循環させます。 . また、「現在の」ページを追跡し、現在のページをインクリメント/デクリメントしてもページ配列の範囲外に出ないことを確認する必要があります。

以下の私のソリューションは、AJAX を介して次のページの読み込みを行い、ブラウザーの実際の場所を変更しません。これは私にはより良いアプローチのように思えますが、状況は異なる場合があります。その場合は、関連する AJAX 呼び出しをwindow.location = pages[curPage]ステートメントに置き換えるだけです。

jQuery: (未テスト)

$(function() {
    var pages = [
        '1.php',
        '2.php',
        '3.php'
    ];
    var curPage = 0;

    $('.next').bind('click', function() {
        curPage++;
        if(curPage > pages.length)
            curPage = 0;
        $.ajax({
            url: pages[curPage],
            success: function(html) {
                $('#pageContentContainer').html(html);
            }
        });
    });

    $('.prev').bind('click', function() {
        curPage--;
        if(curPage < 0)
            curPage = (pages.length -1);
        $.ajax({
            url: pages[curPage],
            success: function(html) {
                $('#pageContentContainer').html(html);
            }
        });
    });

});

HTML:

<div id = "pageContentContainer">
    This is the default content to display upon page load.
</div>
<a class = "prev">Previous</a>
<a class = "next">Next</a>

このソリューションを、ページ自体をハードコードせずに外部データベースからロードするソリューションに移行するには、JSON でエンコードされたページの配列を出力する PHP スクリプトを記述し、AJAX を介してそのスクリプトを呼び出し、JSON を解析します。上記のページ配列を置き換えます。

var pages = [];
$.ajax({
    url: '/ajax/pages.php',
    success: function(json) {
        pages = JSON.parse(json);
    }
});
于 2012-02-28T20:37:37.557 に答える