ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2015年1月12日月曜日

インスタント検索

Google検索で、文字入力するたびに勝手に検索する機能について、
ちょっと調べたのでメモ。

実装自体は非常に単純で、JavaScriptでkeyupイベントを取得してajaxで検索処理を実行して
結果を表示するだけ、サーバサイドはPHPでもJavaでも好きなものを使って良いです。

ただし、何も考えずこのまま実装すると文字を入力するたびに検索処理が走ってしまい
非常に重たいページになってしまう。
そのため、以下のような工夫が必要になる。
・前回のキー入力から一定時間経っている場合のみ検索結果を取得
・カーソルキーやタブキーに反応しないよう、前回の入力内容と比較して同じなら処理中止

こういった注意点を突き詰めていかないと、使いづらくて重いだけのものになってしまい、
誰も使いたくないものができあがるんだろうなーと思った。

2014年5月16日金曜日

WYSIWYGエディタで画像アップロード

WYSIWYGエディタで画像アップロードできるようにしたい!!!

■CKEditor
CKEditorに画像アップロード機能を追加する設定メモ。
KCFinderと連携させる場合、phpでgdを有効化しておく必要がある。

手順などの参考リンク
CKEditorに画像アップロード機能を追加する
CKFinder からKCFinderに乗り換え
CKEditorとKCFinderの最新版がうまく動かないと聞いたので検証

ただし、そのままだとサーバのアップロードディレクトリを直接触るようなイメージになる。
そのため、以下のような懸念がある
・アップロードされた画像がそのまま残る
・他人のアップロード画像を使用したり編集できる
・削除された場合は表示できる画像がなくなる

KCFinderを使わず、画像アップロード機能を自作する場合に参考にできそうなブログ
CKEditor でオリジナルの画像ブラウザを作る的な

■TinyMCE
TinyMCEというエディタ。
解説しているブログを見る感じだと、やりたいことに近いのはこれかも。
CKEditor同様、プラグインで機能拡張するタイプみたい。

TinyMCE エディタ上で画像をアップロードしながら貼り付けられる jbimages プラグインを使ってみた


■その他
プラグインなどを使用せず、アップロード機能を別に作って
エディタ内に挿入する方法だとこんなのがある。
CLEditorとの連携になっているけど、他のエディタとでも連携できるように思う。

CLEditor + jQuery.upload Sample

jQuery.uploadの公式サイトがリンク切れているぽい。
こっちからはダウンロードできる。

jQuery.upload

2014年4月2日水曜日

Google Maps API をとりあえず使う

Google Maps APIのサンプルを作ったのでメモ。
とりあえず動くものにしてある。
おもしろそうな機能があれば更新する予定。
文字コードはUTF-8にすること。

■GoogleMapsAPIサンプル.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps API サンプル</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?libraries=places&sensor=false&language=ja"></script>
<script type="text/javascript" src="js/map.js"></script>
</head>
<body>
<p>Google Maps APIを使ったサンプルです。</p>
X座標:<input type="text" id="locationX" value="35.709984" />&nbsp;
Y座標:<input type="text" id="locationY" value="139.810703" />&nbsp;
<input type="button" onClick="mapCreate(map_canvas, latlng, locationX, locationY);" value="地図表示" />&nbsp;
<input type="button" onClick="mapUpdate(locationX.value, locationY.value);" value="地図更新" /><br />
住所:<input type="text" id="address" />&nbsp;
<input type="button" onClick="setLatlngZip(address.value, locationX, locationY);" value="座標取得" /><br />
キーワード:<input type="text" id="keyword" />&nbsp;
<input type="button" onClick="setLatlngKeyword(keyword.value, locationX, locationY);" value="座標取得" /><br />
<div id="map_canvas" style="width:500px; height:300px"></div>
<p id="latlng"></p>
</body>
</html>


■js/maps.js
var map=null;
var marker=null;
var latlngLabel=null;
var locationXText=null;
var locationYText=null;

// マップの作成
function mapCreate(canvasObject, latlngLabelObject, positionX, positionY) {
// 座標を設定
var latlng = new google.maps.LatLng(positionX.value, positionY.value);
locationXText = positionX;
locationYText = positionY;
// マップオブジェクトのオプションを設定
var opts = {
zoom: 15,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// マップを作成し、対象のオブジェクトへ描画
map = new google.maps.Map(canvasObject, opts);
// マーカーを作成
markerCreate();
// 情報ウインドウを作成
infoWindowCreate();
// 地図のドラッグイベントに各座標を表示
latlngLabel = latlngLabelObject;
google.maps.event.addListener(map, 'drag', dispLatLng);
return;
}

// マップの座標更新
function mapUpdate(positionX, positionY) {
if(map != null) {
var latlng = new google.maps.LatLng(positionX, positionY);
// マップの座標更新
map.setCenter(latlng);

// マーカーの再作成
markerCreate();

// 情報ウインドウの再作成
markerCreate();
}
return;
}

// ドラッグ時に座標を表示
function dispLatLng(latlngObject){
var latlng = map.getCenter();
var str = "[中心座標]=[" + latlng.lat() + ", " + latlng.lng() + "]<br />";

var latlngBounds = map.getBounds();
var swLatlng = latlngBounds.getSouthWest();
str = str + "[南西端座標]=[" + swLatlng.lat() + ", " + swLatlng.lng() + "]<br />";

var neLatlng = latlngBounds.getNorthEast();
str = str + "[北東端座標]=[" + neLatlng.lat() + ", " + neLatlng.lng() + "]";
locationXText.value = latlng.lat();
locationYText.value = latlng.lng();

latlngLabel.innerHTML = str;
return;
}

// マーカーを作成
function markerCreate() {
var latlng = map.getCenter();
if(marker != null) {
marker.setMap(null);
}
marker = new google.maps.Marker({
position: latlng,
map: map,
clickable : true
});
}

// 情報ウインドウを作成
function infoWindowCreate() {
var latlng = map.getCenter();
var iwopts = {
content: 'Hello',
position: latlng
};

var infowindow = new google.maps.InfoWindow(iwopts);
    infowindow.open(map);

}

// 住所から座標を取得
function setLatlngZip(address,locationX, locationY) {
//ジオコードオブジェクト
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
address: address,
region: 'jp'
},
function(results, status){
if(status==google.maps.GeocoderStatus.OK){
//処理
locationX.value = results[0].geometry.location.lat();
locationY.value = results[0].geometry.location.lng();
}
});
}

// キーワードから座標を取得
function setLatlngKeyword(keyword,locationX, locationY) {
// 位置情報オブジェクト
var service = new google.maps.places.PlacesService(map);
service.textSearch({
location: map.center,
radius: '500',
query: keyword
},
function(results, status){
if(status==google.maps.places.PlacesServiceStatus.OK){
//処理
locationX.value = results[0].geometry.location.lat();
locationY.value = results[0].geometry.location.lng();
}
});
}

2013年9月8日日曜日

jQuery入門

Webシステムの開発で欠かせないのがJavaScript。
さらに発展した使い方をしたいときはjQueryを使うことが多いなーと感じる。
半分フレームワークだし、あまり好きではないけど便利なものは使わないともったいない。
ということでjQueryの入門。
※これも随時更新の予定

jQuery日本語リファレンス

jQuery事始め・コピペに頼らず、基礎知識を理解して実際に動かしてみる

2011年12月14日水曜日

子画面から親画面に値をセットする(JavaScript)

コードマスタなどの値をポップアップ画面で検索してセットということを
今まで携わったWebシステムではよくやっていた。
JavaScriptだけでサンプルが作れたのでメモ。
window.open で子画面を開き、window.opener で親画面にセットする流れ。
ついでに close して子画面も閉じる。

======================================================================

parent.html(親画面)
<html>
<head>
<title></title>
<script type="text/javascript">
    function windowOpen(controlName) {
        window.open("child.html?controlid=" + controlName,"new");
    }
</script>
</head>
<body>
子画面から選択した値を入れる
<input type="button" value="open" onclick="windowOpen('txtParent');">
<input type="text" id="txtParent">
</body>
</html>

======================================================================

======================================================================

child.html(子画面)
<html>
<head>
<title></title>
<script type="text/JavaScript">
    function setParentValue(){
        var controlId = getQuerystring("controlid");
        window.opener.document.getElementById(controlId).value = document.getElementById("txtValue").value;
        self.close();
    }
   
    function getQuerystring(key) { 
        var keyName = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
        var regex = new RegExp("[\\?&]" + keyName + "=([^&#]*)");
          
        var qs = regex.exec(window.location.href);
        if(qs == null) {
            return ""; 
        } else {
            return qs[1];
        }
    }
</script>
</head>
<body>
<input type="text" id="txtValue">
<input type="button" value="親画面に反映" onclick="setParentValue();">
</body>
</html>
======================================================================

Getで親画面のセット先のコントロールIDを渡すようにしているけど、
PHPとか.Net使うならセッションで管理するのがいいと思う。
上の例だとクエリストリングの取得サンプルも書けた。

JavaScriptでのクエリストリングの取り方