jQuery:Ajaxを使用してPOST送信でデータ取得

jQueryで画面をリロードせずにデータベース等のデータを取得してページに出力したい場合があります。

Ajaxを使用すればリロードせずにphpファイルを呼び出すことが可能です。

クリックしたり、スクロールしたりするとデータを追加していくようなページなど、
色々な場面で使用できそうです。

下記にjQueryAjaxを使用してphpファイルを呼び出してPOST送信を行い、
データベースからデータを取得した時の方法をメモします。


Ajaxを使用してPOST送信

※知り合いから指摘を受けました。
 POSTデータのチェックやSQLインジェクション対策は必ずしてください。

htmlファイルとphpファイルを用意します。

JS

※index.html

下記は「#btn」をクリックした時にAjaxを使用してます。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {

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

        $.ajax({
            type: "POST",
            url: "ajax.php",
            data: {
                "page": 2
            },
            success: function(j_data){

                // 処理を記述

            }
        });

    });

});
</script>

「type」に”POST”を指定します。(POST送信を行う場合)

「url」にPOST送信を行うファイル名を指定します。

「data」にPOST送信するデータを設定します。

POST送信が成功した時に「success」で指定した引数にphpから渡されたデータが格納されます。
「success」内に必要な処理を記述します。

PHP

※ajax.php

データベースからデータを取得し、取得したデータを返します。

<?php

$data = array();
$page = $_POST['page'];

$conn = mysql_connect('localhost', 'username', 'password');

$db = mysql_select_db('hoge', $conn);

$sql = " SELECT * FROM test WHERE page = " . $page;
$res = mysql_query($sql, $conn);

while ($row = mysql_fetch_array($res)) {
    $data[] = $row;
}

mysql_close($conn);

header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);

?>

「$_POST」にajaxで設定したデータが格納されています。
json_encode()を使用して取得したデータをJSON形式で返します。


jQuery:jQueryで配列をループする「each」

jQueryeachメソッドを使用して配列ループする方法をメモします。

前回、Javascriptで配列をループする方法を記載しました。

Javascript:Javascriptで配列をループする「for」

eachメソッド
繰り返し処理を行う時に使用するjQueryの関数です。
配列以外にもオブジェクトも繰り返し処理を行うことが可能です。

下記にjQueryeachメソッド配列ループし、配列の値を出力した時の方法をメモします。


jQueryで配列をループ

配列を「$.each」にセットします。
コールバック関数の「function(i, value)」に値が格納されます。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {

    var arr = ["a", "b", "c", "d", "e"];

    $.each(arr, function(i, value) {
        $('body').append(i + ':' + value + '<br>');
    });

});
</script>

下記のように出力されます。

0:a
1:b
2:c
3:d
4:e

配列をループする時にfor文を使用してもいいのですが、
jQueryを使う場合はeachメソッドを使用しても良さそうです。

jQuery:ページ最下部までスクロールすると自動でコンテンツを読込む

WEBサイトでページの最下部までスクロールした時にローディング画像を表示し、
次に表示するコンテンツ自動で読込んで出力するようなページを見ることがあります。

jquery.bottom

FacebookTwitterなどは、同じようにページの下までスクロールすると情報を読み込んで出力します。

jQueryの「jQuery.Bottomプラグインを使用すれば同じような動作をさせることが可能です。

下記より、ダウンロードすることができます。

jquery.bottom-1.0.js

下記にjQueryの「jQuery.Bottomプラグインの使用して、ページの最下部までスクロールした時に自動的コンテンツ表示させる時の使用方法をメモします。


「jquery.bottom-1.0.js」プラグインの使用方法

JS

jQueryとjquery.bottom-1.0.jsを読み込みます。
下記はwindowオブジェクトに対して使用するように設定しています。
また、コンテンツに対してbottom.jsを指定することも可能です。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.bottom-1.0.js"></script>
<script type="text/javascript">
$(function() {

    // オプションのproximityでbottom.jsを発生する位置を指定する
    $(window).bottom({proximity: 0.05});
    $(window).bind('bottom', function() {

        var obj = $(this);

        // 「loading」がfalseの時に実行
        if (!obj.data('loading')) {

            // 「loading」をtrueにする
            obj.data('loading', true);

            // ローディング画像を表示
            $('#loadimg').html('<img src="load.gif" />');

            // 追加したい処理を記述
            setTimeout(function() {

                // ローディング画像を削除
                $('#loadimg').html('');

                // 追加するHTMLを指定
                $('#wrap').append('<div class="box">test</div><div class="box">test</div><div class="box">test</div>');

                // 処理が完了したら「loading」をfalseにする
                obj.data('loading', false);

            }, 1500);
        }

    });

    // リロードしたときにページの先頭を表示する
    $('html,body').animate({ scrollTop: 0 }, '1');

});
</script>

proximityオプションでbottom.jsを発生する位置を指定することが可能です。
proximityの数値によってイベントを行う距離を指定します。

イベント時、「loading」がfalseの時に処理を実行するようにしています。
イベントが発生した時に「loading」をtrueにし、ローディング画像を表示します。

setTimeoutに追加するコンテンツの処理を記述します。
ローデング画像を削除し、処理が完了したら「loading」をfalseにします。

また、スクロールの位置がイベントを発生する位置にある時にリロードすると
追加する要素が連続で表示してしまうので下記を追加してます。

$('html,body').animate({ scrollTop: 0 }, '1');

CSS

cssで出力する要素のスタイルを指定します。

<style type="text/css">
#wrap {
    width: 800px;
    margin: 0 auto;
}
.box {
    width: 150px;
    height: 150px;
    margin: 10px;
    padding: 10px;
    border: 3px dashed #CCCCCC;
    float: left;
}
#loadimg {
    padding-top: 50px;
    clear: both;
    text-align: center;
}
</style>

HTML

最初に表示する要素を記述します。
下までスクロールすると最初に表示している要素の後に追加されます。

<div id="wrap">
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
    <div class="box">test</div>
                ・
                ・
                ・
            (省略)
</div>

<div id="loadimg"></div>

最初に表示している要素が全て画面に表示されている状態だと
bottomイベントが発生しないので注意です。


追加するコンテンツをajaxなどでデータを取得するようにすれば、
データベースの情報などを出力できていいと思います。

また、表示する最大件数を設定する場合などは
追加した数をカウントして制限をかける必要があります。

jQuery:画面の位置を自動で調整する「windows.js」

jQueryの「windows.jsプラグインを使用してみました。
windows.js」プラグインは画面のスクロール位置自動調整してくれるプラグインです。

jquery_windows_1

スクロール位置が中途半端な場合、指定した位置まで画面が移動して自動補正します。

下記のような画面の途中でスクロールを止めます。

jquery_windows_2

指定した秒数が経過したら、位置が自動でスクロールするのです。

jquery_windows_3

windows.js」プラグインは下記よりダウンロードできます。

http://nick-jonas.github.io/windows/

下記にjQueryの「windows.jsプラグインの使用して、
画面のスクロール位置自動補正させた際の使用方法をメモします。


「windows.js」プラグインで画面位置を自動調整

JS

jQueryとwindows.jsファイルを読み込みます。
windows.jsを使用するように設定します。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="js/jquery.windows.js"></script>
<script type="text/javascript">
$(function() {
    $('.window').windows({
        snapping: true,
        snapSpeed: 500,
        snapInterval: 1000,
        onScroll: function(s){},
        onSnapComplete: function($el){},
        onWindowEnter: function($el){}
    });
});
</script>

snapping:自動スクロールするかを指定します。
snapSpeed:スクロールする速度を指定します。
snapInterval:自動スクロールするまでの時間を指定します。

CSS

CSSでセクションごとのbackgroundと位置を指定します。
backgroundは画像を指定してもOKです。

<style type="text/css">
html, body {
    margin: 0;
    padding: 0;
    height: 100%;
}

.window {
    width: 100%;
    height: 100%;
    position: absolute;
}

#area1 {
    background: #d5d7dd;
    top: 0%;
}

#area2 {
    background: #1babb7;
    top: 100%;
}

#area3 {
    background: #6ab29f;
    top: 200%;
}
</style>

HTML

セクションに「class=”window”」を指定します。

<section id="area1" class="window"></section>
<section id="area2" class="window"></section>
<section id="area3" class="window"></section>

上記の設定をすると、中途半端な位置にスクロールがある場合、
画面位置を自動で調整してくれるようになります。

jQuery:マウスオーバーした画像をメインの画像に反映

jQueryサムネイル画像マウスを置いた場合、メイン画像差し替えて表示したい場合があります。

jQuery_image_hover

ショップシステムなどの商品画像の表示で見かけることが多いです。
また、写真などのギャラリーページなどでも同じような表示の仕方をしていることがあります。

jQueryを使用すれば簡単にサムネイル画像とメイン画像を入れ替えることが可能です。

下記にjQueryの「hover」を利用してサムネイル画像マウスオーバーした際に、メイン画像差し替えて表示する方法を記述します。


マウスオーバーした画像をメインの画像に反映

HTML

メイン画像とサムネイル画像を表示します。
「mainImage」の箇所に最初に表示する画像を設定します。

<div id="mainImage">
    <img src="sample1.jpg" />
</div>

<div id="imageList">
    <ul>
        <li><img src="sample1.jpg"></li>
        <li><img src="sample2.jpg"></li>
        <li><img src="sample3.jpg"></li>
        <li><img src="sample4.jpg"></li>
        <li><img src="sample5.jpg"></li>
    </ul>
</div>

CSS

<style type="text/css">
div#imageList ul {
    margin: 10px;
    padding: 0;
}
div#imageList li {
    float: left;
    list-style-type: none;
    margin-left: 5px;
}
div#imageList li img {
    width: 50px;
    height: 50px;
}
</style>

JS

jQueryを読み込み、マウスオーバーした場合の処理を記述します。
サムネイル画像をマウスオーバーした場合、マウスオーバーしている画像の「src」をメイン画像の「src」に反映させています。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){

    // 「imageList」内の「img」をマウスオーバーした場合
    $('#imageList img').hover(function(){

        // マウスオーバーしている画像をメインの画像に反映
        $('#mainImage img').attr('src', $(this).attr('src'));

    });

});
</script>

上記の設定をし、サムネイル画像をマウスオーバーするとメイン画像が入れ替わって表示されます。