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

2013年9月23日月曜日

bloggerにSyntax Highlighterを導入する。(JavaScript, CSS)

新生FF14の岩神タイタンが全く倒せなかった白魔導士Lv36です。あれ、もうみんなで攻略見たうえで挑まないと全く歯が立たないです。落ちるわ、岩に閉じ込められるわで、ボロボロの90分間でした。装備を整えてから、再挑戦しようと思っています。

さて、ソースコードをブログに掲載する時に便利なSyntax Highlighterですが、私は今まであるサイトでソースコードをHTMLに変換したものをブログに貼付けていたんですが、先日PHPのコードを貼付けた際に配色が気に入らなかったのと、日本語が文字化けしてしまったので、Syntax Highlighterに移行する事を決めました。
以下、bloggerでSyntax Highlighter(version3)を導入する為の忘備録です。

1. Syntax Highlighterのサイトで埋め込み用のスクリプトをGenerate
まず、下記のサイトでbloggerに記載すべきスクリプトを生成します。
link: Syntax Highlighter Scripts Generator
テーマと、使うであろう言語を選択してgenerateボタンを押すだけです。
私が選択したテーマはdefaultを使用しました。


2. bloggerのテンプレート編集で、headタグに生成したスクリプトを追記する
bloggerのテンプレート画面から"HTMLの編集"で、headタグ内の下の方に生成したスクリプトを貼付けて適用するだけです。とりあえず、これでSyntax Highlighterの導入は出来ています。ブログ記事の中で、ソースコード記載箇所をpreタグで囲みclass属性に"brush:php"のように言語名を指定します。もし無効な言語を指定した場合、実行時にアラートで警告が出てくれます。
echo "Hello!\n"; 


3. Syntax Highlighterのカスタム
手順2までの状態だと右上に?マークが出ていたり、表示領域にborderがなかったりと素のままなので、 自分の好きなようにCSSを設定しましょう。出来たのが下記の画像のようなものです。枠と角を丸くしたものと内側に影を落としています。


下記が、最終的にheadタグ内に追加したスクリプトの全容です。























iOSのSafariだと、自動でフォントサイズが調整されるため、行番号の表示が崩れてしまいます。-webkit-text-size-adjust: 100%; を指定する事で抑止できます。
?マークを消す記述は SyntaxHighlighter.defaults['toolbar'] = false; で行っています。

2013年9月1日日曜日

スマートフォンでタップイベントの反応を良くする。(JavaScript)

新生FF14やってます、楽しいですね。…しかし、ログインできないっ!金曜日はいけたのに、土日はまったくログインできないです。(涙)ネット上ではログインする事が目的になってしまったログインオンラインなんて言われてますw。待っても待ってもログインできないので、ブログ書きます。

ここから本題。

clickイベントにイベントハンドラを設定すると、スマホではタップしたときの反応が鈍い感じになってしまいます。click周りのイベントには、click, touchstart, touchend, mousedown, mouseupなどがありますが、スマホではtouchstart, またはtouchendで判定するようにするとレスポンスを早くする事が出来ます。

ただ、touchstartイベントで処理を書くとスクロールしようとする時にも反応してしまいます。スクロールする必要のない場合は、ここで処理しても良いでしょう。
また、touchendイベントの場合も、他の要素に触れた状態で、指を滑らせてから離すと反応してしまい本来のタップ判定とは異なるものになるでしょう。

そこで、touchstart時にフラグを持たせ、touchend時に判定する処理が必要になります。 
※下記サンプルコード参照。
$(function(){
    // イベント登録
    $('li').on('touchstart touchmove touchend', function(event){
        // タッチスタートでフラグを設定
        if ('touchstart' == event.type){
            $(this).attr('data-touchstarted', '');
            return;
        }

        // タッチムーブが発生したら、フラグを消す。(タップと判定させない為)
        if ('touchmove' == event.type){
            $(this).removeAttr('data-touchstarted');
            return;
        }

        // タッチエンド時にフラグがあれば、タップと判定する。
        if ('undefined' != typeof $(this).attr('data-touchstarted')){

            // ここでタップ時のイベントハンドラを呼び出す。
            onListItemTapped.call(this, event);

            // フラグを削除
            $(this).removeAttr('data-touchstarted');
        }
    });

    // PCからのクリックにも対応
    $('li').on('click', function(event){
        onListItemTapped.call(this, event);
    });
});


/*
* タップ、クリック時の処理
*/
function onListItemTapped(event){
    event.preventDefault();

    // TODO: タップ時の処理
    console.log( event.type );
}

サンプルはli要素にタップイベントを付与するものです。
touchstart時にフラグを属性として持たせています。touchmoveが発生した場合はタップとは判定しないようにフラグを消します。touchendが発生した時にフラグが残っていればタップしたと判定できます。

mouseup, mousedownイベントでも、同じ処理をすれば出来ますがclickイベントと同じように反応が鈍くなってしまいます。

イベントハンドラをcallメソッドで呼んでいるのは、thisをハンドラ関数に引き継ぐためです。また、PCでも動作するようclickイベントも登録しているので、スマホの場合ハンドラ関数が2回呼ばれます。preventDefault()を呼ぶ事で、それらの処理ダブりを防止できます。