2015年1月9日金曜日

jQueryでの簡易クロス検索的なサンプル

グループがわかれているチェックボックスが複数あって、
チェックが外れたものを隠していくものです。
※グループに対しての登録キーは一応複数想定。ちゃんと動くのか未検証。

HTMLはこんな感じ

 
  • example1
  • example2
  • example3
  • example3

フォーム部分は特に普通ですが、
まず、フォーム側のname属性とdata属性の名前をあわせて行きます。
例:name="group1" のときは data-group1
更に、<input value="">の値が、対応する<li data-foo="">の値と同じように書いていきます。
(キーが複数の時は続けて書いてもカンマorスペース区切りでもOK)

続いてJSです
var $searchBox = $('#search_box');
var $resultBox = $('#result_box');

$searchBox.find('input').change(function(){
 // initialize
 var checkItems = {
  'group1': [],
  'group2': [],
  'group3': []
 };
 
 // checkedチェック
 $searchBox.find('input').each(function(){
  var key = $(this).attr('name');
  if( $(this).prop('checked') ){
   checkItems[key].push( $(this).val() );
  }
 });
 
 // マッチしないものを非表示
 $resultBox.find('li').show();
 for( var key in checkItems ){
  $('[data-'+key+']').each(function(){
   var checkFlg = false;
   for( var i = 0; i < checkItems[key].length; i++ ){
    if( $(this).data(key).match(checkItems[key][i]) ){
     checkFlg = true;
     break;
    }
   }
   if( !checkFlg ) {
    $(this).hide();
   }
  });
 }
});

まず、連想配列を作っておきます。

次にそれぞれのinputがチェックされているかどうか判断して、
チェックされていたら、valを連想配列に追加していきます。

さらに、表示用のリストを一旦全て表示させておき、 チェックされている項目に対して、リストが値を持っていなかったら非表示にする。
ということをやってます。

2014年12月26日金曜日

iPhoneやiPadで撮った写真(縦)をCANVASへdrawimageすると、勝手に回転する現象

「input file="type"」でiPhoneやiPadで写真を撮らせてCANVASへ貼り付けると何故か勝手に横向いてる・・・。
という現象があったので、解決方法です。

まず前提として、iPhoneで撮った写真は縦位置だろうが横位置だろうが、横幅の画像として保存されます。
でも、イメージビューワやブラウザ上でIMGタグで貼り付けた状態で見ると正しく縦位置で表示されます。
何故かと言うと、EXIF情報に画像の回転に対する情報が記述されており、
ビューワー等はそれを読み取って自動的に回転させて表示してくれてるわけです。

ですが、CMS等でサーバで処理したりCANVASへ持ってきたりすると、
EXIF情報が失われたりして横向きに表示されてしまいます。

そんな時、PHPでファイルを一時保存しているのであればできる解決方法です。

$image = ImageCreateFromJPEG($filepath);  //保存した画像を複製
$exif = exif_read_data($filepath);    //画像のEXIF情報取得

if( isset($exif['Orientation']) ){
 $orientation = $exif['Orientation'];
 switch($orientation) {
   case 0:#未定義
      break;
   case 1:#通常
      break;
   case 2:#左右反転
      image_flop($image);
      break;
   case 3:#180°回転
      image_rotate($image,180, 0);
      break;
   case 4:#上下反転
      image_Flip($image);
      break;
   case 5:#反時計回りに90°回転 上下反転
      image_rotate($image,270, 0);
      image_flip($image);
      break;
   case 6:#時計回りに90°回転
      image_rotate($image,90, 0);
      break;
   case 7:#時計回りに90°回転 上下反転
      image_rotate($image,90, 0);
      image_flip($image);
      break;
   case 8:#反時計回りに90°回転
      image_rotate($image,270, 0);
      break;
 }
 ImageJPEG($image ,$filepath);
}

まず「exif_read_data($filepath)」で、EXIF情報を読み込みます。
($filepathは相対パスで記述。URLからの絶対パスは不可みたいです)

次に「$exif['Orientation']」で、回転情報を取得します。
Orientationの数値に対して、それぞれの回転や左右反転を設定していきます。
(読み込んでいるfunctionについては下記を参照
 http://www.glic.co.jp/blog/archives/88

最後に「ImageJPEG($image ,$filepath)」で画像を上書き保存して終了です。
(保存先を変えれば複製画像を保存できます。)


これをJSでやろうと思うと「Javascript Load Image」ってプラグインを使えばいいみたいです。
http://am-yu.net/2014/04/11/load-image-js/
https://github.com/blueimp/JavaScript-Load-Image


(参考)
http://blog.diginnovation.com/archives/1104/

2014年12月15日月曜日

モーダルウィンドウで、コンテンツ以外のところをクリックしたらモーダルを非表示にする

以前「要素全体のclickイベントで、クリックした要素の種類で処理をわける」ってのを書いたのですが、 それと似たようでちょっと違う方法。

モーダルウィンドウを表示したあと、コンテンツと閉じるボタンが表示されるとして、 コンテンツエリア以外をクリックしたらモーダルウィンドウを閉じるにはどうすればいいんだろ。 と思っていたんですが、めちゃくちゃ簡単でした。

$('.modal').click(function(){
 if( $('.foo:hover').length == 0 ){
  $('.modal').hide();
 }
});

すごく単純なことなのに悩んでました。。。

2014年12月11日木曜日

bloggerにsyntaxhighlighterいれる方法

自分への備忘録

</head>前に以下挿入
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type='text/css">
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css">

JSに関しては、使うプログラムによって読み込み変える
ここ参考
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

CSSに関しては、色変更できる。 ここ参考
http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

</body>前に以下挿入


実際にコード書くときはこんな感じ

function foo(){
}

GAイベント・ページビューのPUSH

Ajax使ったページやパララックスサイトなんかで、ページは切り替わらないけど、GAタグでそれぞれ計測させたい!って時の実装方法です。

ページビュー送信したいとき

ga('send', 'pageview', {
  'page': 'ページURL',
  'title': 'ページタイトル'
});

イベント送信したいとき

ga('send', 'event', 'Category ', 'Action ', ('Label'), ('Value'));
Categoryには、タグ要素何かを入れます。(例:button)
Actionにはイベントを入れます。(例:click)
Label(省略可)はイベントの分類に使うようです。(例:nav button)
Value(省略可) は・・・いまいちよくわかってません。

実際の使い方はこんな感じ。だと思う
ちなみに、飛び先のURLにページがなくても下層ページビューとしてアナリティクスにカウントされていきます。 (ハッシュの場合はイベント使った方がいいのかな)
$('a#foo').click(function(){
  var target = $(this).attr('href');
  ga('send', 'pageview' , {  'page': target,  'title': '次画面のタイトル' };
  return false;
});
参考
https://developers.google.com/analytics/devguides/collection/analyticsjs/events?hl=ja
https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#send

フォームデータをAjax(jQuery)でサーバ(PHP)へPOST

フォームデータをjQueryの$.ajaxを使ってPHPへポスト紙、戻り値を取得する方法の備忘録です。

htmlはこんな感じ

javascriptはこんな感じ
$('#foo').submit(function(){
 if(window.FormData) {
  formdata = new FormData($('#foo').get(0));

  $.ajax({
   url: 'example.php',
   type: 'POST',
   data: formdata,
   processData: false,
   contentType: false,
   dataType: 'json',
   success: function( data ) {
    console.log(data);
   }
  });
 } else {
  // IE8用
 }
});

PHPはこんな感じ
 $size[0],
              'height' => $size[1],
              'type' => $type
    );
     
    header('Content-type: text/html');
    echo json_encode($data);
}
?>

FormDataはIE10以上でしか使えないので要注意。
if(window.FormData){}で分けておいて、
elseの方にiframeへ出力させるものを書いておいて、それを引っ張ってくる方法を取るみたいです。

PHPは$dataに入れた連想配列をjson形式で戻しています。
successの後のconsole.log(data)では、
{
“width”:”画像の幅”,
“height”:”画像の高さ”,
“type”:”ファイルタイプ(image/jpeg等)”
}

が返ってきます。
$_FILES[‘file’]の’file’は対象inputのname属性が入ります

参考
http://www.koikikukan.com/archives/2014/09/30-013333.php

iPhone6発売されてからの、スマホのシェアがおもしろい

TechCrunchによく掲載されている「http://www.kantarworldpanel.com/」の国別スマホ利用統計情報ですが、10月のシェアは「Android 48.1%, iOs 48%」になってます。

これが、9月だと
Android 64.5%
iOS 31.3%

発売前の8月だと
Android 70.2%
iOS 27.1%

制作を行う上で、Androidってないがしろにしがちなので、気をつけねばですね。。。

http://www.kantarworldpanel.com/global/smartphone-os-market-share/