カテゴリー: Ajax

  • GoogleにAjaxページをインデックスしてもらう方法

    WEBサイトを運営していて、Ajaxページを作成した場合、そのページは、Ajaxの未適用の状態でGoogleにインデックスされることがあります。

    しかし、サイト運営者としては、Ajaxを適用した状態でインデックスして欲しい場合もあります。

    そこで、GoogleにAjaxページをインデックスしてもらう方法について覚書しておきます。(お約束ですが、以下の方法の採用は自己責任でお願いします。)

    まずは、Googleの公式ページをよく読む必要があります。あまり難しくはないので必読です。

    【AJAX クロール: ウェブマスターおよびデベロッパー向けガイド】
    https://support.google.com/webmasters/answer/174992

    上記ページでは、主に2つの方法が述べられていますが、ここでは、3.の「ハッシュ フラグメントを使用せずに処理する」を採用します。

    まずは、コンテンツとなるページに、次のmetaタグを含ませます。

    <meta name="fragment" content="!">

    次に、URLをフラグメントに対応するようにします。

    www.example.com?_escaped_fragment_=

    ?以降がAjaxページであることのパラメーターとなります。

    そして、?_escaped_fragment_=がある場合には、PHPなどで、Ajax適用状態のページをレスポンスとして返すようにします。

    ここまでは、とても簡単です。

    ここで問題となるのが、動的にURLを構成するページではどうするかです。

    たとえば、一見、次のURLは、静的に見えます。

    www.example.com/foo/bar

    しかし、実際は、次のように動的にURLを処理している場合もあるでしょう。

    www.example.com?category=foo&page=bar

    こうした場合には、mod_rewrite などを使って処理しているはずなので、「?_escaped_fragment_=」についても動的に処理します。

    .htaccess に次のように記述します。最後の2行は実質1行です。

    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$ 
    RewriteRule ^([a-z]{10})/([a-z]{10})$  
    page.php?category=$1&page=$2&_escaped_fragment_= [L]

    上記の.htaccessの肝は、次の条件文です。クエリに、「_escaped_fragment_=」を含む場合のみRewriteRuleを実行します。

    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$

    そして、次行で実行するRewriteRuleでは、&_escaped_fragment_= を末尾に付けるようにします。

    なお、RewriteRule については、ご自身のサイト構成にあわせて適切に変更してください。

    これで、「きれいな URL を対応する汚い URL に一時的にマッピングします」ということを、mod_rewriteを使って動的に処理することができるようになります。

    (注意点)

    1.mod_rewriteの条件文(RewriteCond)は、続く1行にのみ作用します。そのため、その後の行には影響しません。

    2.RewriteRuleのみを使って処理できるようにも思えますが、RewriteRuleは、?以降のパラメーターを無視するため、RewriteCondで条件を判定しないと処理ができません。

    今回は、この2番でつまづいて、大変でしたが、何とか作業が終了しました。

    【追記】

    一応、上記の設定をした後には、サイトのアクセスログを分析してロボットがAjaxページをきちんと取得したかを確認した方が良いと思います。

    ちなみに、自分の場合には、設定後、数時間ほどで、botがきて、
    「?_escaped_fragment_=」付きのページを取得していきました。
    下は、そのときのログの一部です。(一部伏字及び改変)

    **.249.77.** – – [14/Dec/2013:19:17:48 +0900] “GET /abc/xyz?_escaped_fragment_= HTTP/1.1″ 200 3117 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”

    なお、googlebot以外に、Bingのボットも確認できました。

    以上です。

  • 【JavaScript】JSONのデータを読み込む方法【Ajax】

    AjaxとPHPを連携させていて、複数のデータをPHPからAjax側に送りたい場合、どのようにデータを送ればスマートなのか考えてみた。

    というか、ある本を読んで気づいたのだが、PHP側からJSONのデータ形式でAjaxに送れば良いんじゃないかと。

    今までは単なるテキスト形式で1つのテキストを送っていた。複数のデータを送りたいときは、特定の記号をいれて、その前後でsplitして区切って複数化していた。

    しかし、JSONを使えば、複数のデータをオブジェクト形式でおくれるのではないか。

    ネットで調べてみると、実際、そういう使い方が多くなされているみたい。というかそれが普通なんですね。

    となると、Ajax側では、受けたそのデータをどう扱うのか?

    調べてみると、ibmの記事に次のようにあった。
    http://www.ibm.com/developerworks/jp/web/library/wa-ajaxintro10/

    var people =
      { "programmers": [
        { "firstName": "Brett", "lastName":"McLaughlin" },
        { "firstName": "Jason", "lastName":"Hunter" },
        { "firstName": "Elliotte", "lastName":"Harold" }
       ],
      "authors": [
        { "firstName": "Isaac", "lastName": "Asimov" },
        { "firstName": "Tad", "lastName": "Williams" },
        { "firstName": "Frank", "lastName": "Peretti" }
       ],
      "musicians": [
        { "firstName": "Eric", "lastName": "Clapton" },
        { "firstName": "Sergei", "lastName": "Rachmaninoff" }
       ]
      }

    何も複雑なことはありません。people に、これまで説明してきた JSON フォーマットのデータが含まれるようになっただけです。だたしデータは明らかに便利なフォーマットにはまだなっていないので、この変更に大きな意味はありません。

    データにアクセスする

    一目ではわからないかもしれませんが、上記の長々としたストリングは単なる配列なので、この配列をJavaScript 変数に組み込めば簡単にアクセスできるようになります。配列を区切るには、ピリオド区切り文字を使うだけで済みます。以上のことから、programmersリストの最初のエントリーに含まれる姓にアクセスするには、JavaScript で以下のようなコードを使います。

    people.programmers[0].lastName;

    ここまで引用。

    受け取ったデータを変数に入れ(オブジェクト化)、そうしたら、ピリオド区切りで配列のようにアクセスできるようです。

    これは便利です。ただ、本当にこれで出来るのかな?

    ちなみに、JSONの受け取り方について、レガシーな方法だと、evalを使っていたりする。

    the_object = eval( "(" + http_request.responseText + ")" );

    また、最近では、JSON.parse()メソッドを使う方法もあるみたいです。

    var json = JSON.parse(xhr.responseText);

    ■ 追記

    書いていて気づきましたが、AjaxでPHPから受けるときは、上記ibmの方法だけではダメなようですね。やはり、evalかJSON.parseを使う等するのが定石らしいです。

    なお、PHP側では、json_encodeを使うと、便利なようです。
    http://www.php.net/manual/ja/function.json-encode.php

    //jsonを出力
    header('Content-type: application/json');
    echo json_encode($val); //$valは(連想)配列

    以上です。

  • 【書評】JavaScript&Ajaxレッスンブック

    JavaScript&Ajaxレッスンブック 大津真(著)の書評です。

    良い点

    • 文法など基礎を易しく解説
    • サンプルコード・サンプルアプリが豊富で面白い
    • 解説が分かり易い

    悪い点

    • 前半はフルカラーだが後半は二色刷り

    総評

    JavaScriptの入門書として、1冊目にお勧めできる書籍です。

    前半は、フルカラーで、変数、制御構造、関数、オブジェクトなど易しく解説されています。具体例として、ミニプログラムに沿って解説されるので理解しやすいです。

    ただ、後半は、朱の二色刷りになり、内容も若干レベルが高くなります。DOM、スタイルシートの操作では、4つのサンプルアプリで具体例を交えながら解説されます。パズルの作成など、なかなか実践的なアプリなので、興味をもって取り組めます。

    Ajaxについても取り上げられていますが、基礎的な解説にとどまっています。ただ、ライブラリとして、prototype.jsが取り上げられているので、ここでAjaxについても学べます。

    難を言えば、全部、フルカラーにして欲しいところ。予算の都合なのか、途中で二色刷りに変わってしまうのが残念です。

    ただ、内容的には、初心者から中級者まで役立つ知識が豊富なので一度目を通すと良いと思います。

    JavaScript&Ajaxレッスンブック

  • 【Ajax】ieでonreadystatechangeが動かないエラーの対策

    Ajaxの非同期通信をWEBページに取り入れるべく、コーディングしていたら、ie(インターネットエクスプローラー)だけでエラーが出る現象に直面。

    FireFoxやSafari、Operaなどでは、スイスイ動くのに、なぜかie7では動かない。前日の夜と本日の半日をかけて、ようやく動いたので覚書しときます。

     req.onreadystatechange = function(){
     処理
    }

    結論から言うと、onreadystatechangeの処理の中身がifの入れ子になっていたため動かなかった模様。

    if節のエラーかとも思って確認したところif節にはエラーは確認できず。そもそも、FireFoxなどでは問題なく動くので原因は不明。

    しかし、このif節を単純化し下のようにしたら、なぜかieでも動くように。

    req.onreadystatechange = function(){
      if(req.readyState == 4 && req.status == 200 ){
      var kekka = req.responseText;
       document.getElementById("result").innerHTML = kekka;
       }
     }

    上記だと、ifは一つだけです。単純化できてミスも防げます。

    エラーがでていたコードは、if (){if(){}else{}}else{} のように場合わけしていたのですが、この構文の時には、onreadystatechangeがピクリともせず。
    調べると、キャッシュされていると動かないとか。if節の場合分けの過程で、キャッシュされている可能性があるのかも。

    JavaScriptでエラー箇所を探すには、下のコードを怪しい部分に一行ずつ、ずらしながら入れていくと発見できます。

    alert("アラート");

    onreadystatechangeの下に入れると正常に動く場合には、連続して3回このアラートが出るので動いているかいないかの判断がつきます。

    参考(調べているとき参考になったページ)

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1022889295

  • 【書評】JavaScript中級講座 Ajaxを学ぶ前の基礎知識

    JavaScript 中級講座 ~Ajaxを学ぶ前の基礎知識 藤本壱(著)

    【ポイント】

    この本“JavaScript中級講座”のポイントをあげるなら次の3つ。

    1. JavaScript・DOM・Ajaxの3点をバランス良く解説
    2. 基礎から応用までをカバー
    3. サンプルスクリプトが豊富でダウンロードして使える

    一応、中級講座というタイトルなので、JavaScriptの基礎は必須とも言えますが、この本自体が、JavaScriptの基礎を第1章~4章にかけて丁寧に解説しているので、この本でも基礎を学べます。

    あえて言うなら、この本を読む前に、アンクが出している“JavaScriptの絵本”を一通り読むのがお勧め。絵本を読んで、この中級講座にすすめば理解が早いと思います。

    【良い点】

    1. サンプルスクリプトが豊富
    2. 解説がわかりやすい

    サンプルスクリプトが豊富なのが良いです。
    たとえば、第5章のDOMでは、スタイルシートにアクセスするものとして、タブ切り替えの例などが挙げられています。(YahooJapanトップページニュースのタブ切り替えと同様のものです。)
    第7章のAjaxのサンプルもサーバーで試したらきちんと動きました。

    全体を通して解説もわかりやすく、混乱することなく順次読み進められます。

    【悪い点】

    特に無いです。ただ、このJavaScript中級講座では、Ajaxとサーバーとの連携部分で、Perlが使われているのですが、要望としては、ここをPHPにして、データベースとの連携を解説してくれるとありがたかったです。

    【内容について】

    JavaScript・DOM・Ajaxの3点が揃っています。それに加えて、最後の9章でデバッグを解説しているのがGood。Firebugを使った方法が詳しく解説されています。

    【形式について】

    ボリュームは335ページで適量です。青緑と黒の2色刷り。カラーなら、なお良かったのですが、内容が良いのでそれほど不満点はありません。

    JavaScript 中級講座 ~Ajaxを学ぶ前の基礎知識