javascript
Google サジェストを組み込む その2(サーバーサイドにGAE-Python)
前回投稿したサジェスト組み込みに比べサーバーへの負荷がかなり減った。と、いうのも、今まではキーが押されるたびにサーバーへ問い合わせを行っていた(単に手抜きしただけ)。これを0.5秒間入力待ちが続いたときにサーバーへ問い合わせるように変更した。ソースコードを添付しておく。
|
Google サジェストを組み込む(サーバーサイドにPHP)
Javascript
var mTemplateHeader ='<table style="width:100%;">'; var mTemplateRecord ='<tr>' +'<td style="padding:4px;cursor:hand;" onclick="fSuggestSelectItem(\'#TEXT#\');" onmouseover="fSuggestOnMouseOver(this);" onmouseout="fSuggestOnMouseOut(this);">' +'#TEXT#' +'</td>' +'</tr>'; var mTemplateFooter='</table>'; var mSuggest; var mSuggestTarget; function fSuggestOnMouseOver(s){ s.style.backgroundColor="#EEEEEE"; } function fSuggestOnMouseOut(s){ s.style.backgroundColor="#FFFFFF"; } /* サジェストのレスポンス処理 取得したXMLデータを解析してHTMLで表示する */ function fSuggestShowResponse(originalRequest) { if (!mSuggest){ var o=$(mSuggestTarget); var offsetTop = 0; var el = o; if (Prototype.Browser.IE){ offsetTop=0; do { offsetTop += el.offsetTop || 0; el = el.offsetParent; } while (el); }else{ offsetTop=o.offsetTop; } var offsetLeft = 0; var el = o; if (Prototype.Browser.IE){ offsetLeft=0; do { offsetLeft += el.offsetLeft || 0; el = el.offsetParent; } while (el); }else{ offsetLeft=o.offsetLeft; } mSuggest=document.createElement("div"); mSuggest.style.position="absolute"; mSuggest.style.border="solid 1px gray"; mSuggest.style.left=(offsetLeft)+"px"; mSuggest.style.top=(o.offsetHeight+offsetTop)+"px"; mSuggest.style.width=(o.offsetWidth)+"px"; mSuggest.style.backgroundColor="#FFFFFF"; o.parentNode.appendChild(mSuggest); } var xml=originalRequest.responseXML; var CompleteSuggestions=xml.getElementsByTagName("CompleteSuggestion"); var mhtml=""; var imax=CompleteSuggestions.length; if (imax==0){ }else{ for (var i=0; i<imax; i++){ var suggestions=CompleteSuggestions[i].getElementsByTagName("suggestion"); var t=suggestions[0].getAttribute("data"); mhtml+=mTemplateRecord.replace(/#TEXT#/g, t); } } mSuggest.innerHTML=mTemplateHeader+mhtml+mTemplateFooter; } /* ターゲットがフォーカスをロストした際に呼び出される */ function fSuggestFin(){ setTimeout(fSuggestClose, 250); } /* サジェスト非表示 */ function fSuggestClose(){ if (mSuggest){ mSuggest.innerHTML=""; var o=$(mSuggestTarget); o.parentNode.removeChild(mSuggest); mSuggest=undefined; } } /* サジェスト初期値設定 */ function fSuggest(id){ mSuggestTarget=id; var o=$(mSuggestTarget); if (o.addEventListener){ o.addEventListener('blur', fSuggestFin, false); } else if (o.attachEvent){ o.attachEvent('onblur', fSuggestFin); } } /* 入力されている文字を送信してサジェストの候補リストを取得する */ function fSuggestSubmit(){ var url="http://localhost/sample/index.php"; var pars="p="+encodeURI($(mSuggestTarget).value); var myAjax = new Ajax.Request( url, { method: 'post', parameters: pars, onComplete: fSuggestShowResponse }); } /* キー入力があった際に表示される */ function fSuggestOnChange(){ fSuggestSubmit(); } /* サジェストが選択されたときの処理 選択された文字をテキストへ入れる */ function fSuggestSelectItem(v){ var o=$(mSuggestTarget); o.value=v; fSuggestClose(); } /* サジェスト初期設定 */ window.onload=function(){ fSuggest("in_text"); } HTML
<div> <input type="text" id="in_text" value="" onkeyup="fSuggestOnChange();" /> <input type="button" id="in_submit" value="検索" /> </div>
参考にしたサイト
参考 http://code.google.com/intl/ja/more/ PHP で HTTP リクエスト 参考 http://u823.net/wordpress/archives/330 ie だけ表示位置がおかしい、offsetTopの値を取得 参考 http://phpspot.org/blog/archives/2007/04/javascriptie1.html ie かどうかの判別 |
Ajaxで日本語をサーバーへ送信(GET/POST)する際にエラー???
escape を入れているので大丈夫だと思っていたのだが、なぜかPHPで送信したPOSTの要素を参照するとそこでプログラムが止まってしまう。原因は送信前に行っていたescape にあり、ここで利用しなければならないのはescape ではなくencodeURI だった。encodeURI は& が変換対象に含まれないのは有名なところなので、以下のような処理を実行しPOSTに加えるようにしたところ、正常にサーバーサイドでも動作するようになった。
(xhtmlにはあらかじめ送信したい文字列が格納されている)
xhtml=encodeURI(xhtml).replace(/&/g , "%26") /&/g は正規表現と呼ばれるパターンマッチ文になり、「文字列中に含まれているすべての&を対象とする」という意味を示す。 |
HT-03A:Google Phone(Android) でAjax
Google Phone でもPC版コーディングのままで Ajax が利用可能。 使い方も非常に簡単。prototype.js を使うだけ。 <script language="javascript" charset="UTF-8" src="/js/prototype.js"></script> <script> <!-- window.onload=function(){ var act=new Ajax.Request('./3594/env.xml', { "method":"get", "onComplete":fRecv }); } function fRecv(res){ try{ mXML=res.responseXML; [あとは普通にコーディングできます。] }catch(e){ alert(e.description); } } |
ページにソースコードを表示する
無料で利用できるスクリプトがいろいろあるようですが、imomushi.com では Google Code でも公開されているprettifyを使います。
ページにソースコードを掲載する際、色分けが非常に面倒です。 とは言うものの、ソースコードを掲載することがあるのだろうか疑問。
|
1-6 of 6