六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

エディット機能

六帖webアプリ
kickzone/TrainNavi2 · GitHub
線路のエディット機能を追加。実質、googleマップに合わせて線路の形を整えるための機能となった。1日で300行ちょいのコードを書いた。
上手くいかなかったことはたくさんある。まず、canvasにmousemoveのイベントをかましていると、要素のmousemoveのイベントが動作しない。駅オブジェクトをドラッグして位置を変更したいのに、クリックイベントは発生するものの、mousemoveが動作しないため何も起こらない。おそらくcanvasに吸い取られてしまっているのだろう。この場合、canvasのイベントは消し去っておく必要がある。

//stationというオブジェクトがcanvas上にあるとする
function OnStationMouseDown(evt){
	var canvas = $("canvas")[0];
	//canvasのイベントを捨てる
	canvas.removeEventListener('mousemove', OnCanvasMouseMove, false);
	canvas.removeEventListener('mouseup', OnCanvasMouseUp, false);
	//新たにイベントを登録する
	canvas.addEventListener('mousemove', OnStationMouseMove, false);
	canvas.addEventListener('mouseup', OnStationMouseUp, false);
}

function OnStationMouseMove(evt){
	//mousemoveイベントの処理
}
function OnStationMouseUp(evt){
	//mousemoveイベントの処理

	//イベントハンドラを元に戻す
	canvas.removeEventListener('mousemove', OnStationMouseMove, false);
	canvas.removeEventListener('mouseup', OnStationMouseUp, false);
	canvas.addEventListener('mousemove', OnCanvasMouseMove, false);
	canvas.addEventListener('mouseup', OnCanvasMouseUp, false);
}

さらに、JavaScriptPHPにPOSTを使って値を受け渡しするとき、配列の個数が1000を超えると、1000を超えたものから削除されていく、という恐ろしいPHPの仕様にぶつかった。
参考
この仕様を知らなかったので、大きなデータを保存したら一部が消えてしまってびっくらこいた。1時間くらいの作業が吹っ飛んだので非常にまいった。配列の受け渡しはやめて、半角スペースなどのセパレータをつけてPHPでpreg_splitを使って分解するように変更した。