2010年7月16日金曜日

JavaScript文字列検索のバリエーション

indexOfメソッドか正規表現(RegExpオブジェクト)を使う。

RegExpオブジェクトはnewせずにリテラルをスラッシュで囲む方法もある(静的な正規表現)。

for (var i = 0; i < 3000; i++) {
    //var m = str.indexOf('item:9999');           // (1) indexOf
    //var m = /item:9999/.exec(str);             // (2) 静的な正規表現
    //var m = new RegExp('item:9999').exec(str); // (3) 動的生成の正規表現
    //var m = /item:9999$/.exec(str);             // (4) 正規表現 (3/31 追加)
}

4番目は、わざと正規表現のメタキャラクタを入れて最適化を無効にしている。

RgeExpに関しては、存在確認だけならexecよりtestを使うほうが行儀がいい。

GoogleAdwords経由かどうか判定

クッキーの「__utmz」を利用して、どうにか判定できる。"organic"が含まれていたら普通のリンク、そうでなければAdwordsのリンク(たぶん)

        var __utmz = $.myGetCookie('__utmz');
        if(__utmz && __utmz.indexOf('organic') >= 0){
          return 'Google-Organic';
        }else{
          return 'Google-Adwords';
        }

2010年7月15日木曜日

jQueryユーティリティ関数を追加するプラグイン例

extend関数を使って追加する。
実行は jQuery.f() の形式。

プラグインのコード

(function($){
  $.extend({
    // get cookie
    myGetCookie: function(name){
      var regexp = new RegExp('; ' + name + '=([^;]*);');
     var match  = ('; ' + document.cookie + ';').match(regexp);
     if(match){
      return match[1];
     }
    },
    // set cookie
    mySetCookie: function(key, val, validFunc){
      var flg = true;
      if(validFunc){
        if(!validFunc(val)){
          flg = false;
        }
      }
      if(flg){
        document.cookie= key + '=' + encodeURIComponent(val) + ';path=/;';
      }
    },
    // referrer -> key
    classifyReferrer: function(ref){
      if('affiliate-b.com/'.indexOf(ref) >= 0){
        return 'アフィリエイト';
      }else if('google.co.jp/'.indexOf(ref) >= 0){
        return 'Google-Organic';
      }else if('google.com/aclk'.indexOf(ref) >= 0){
        return 'Google-Adwords';
      }else if('yahoo'.indexOf(ref) >= 0){
        return 'Yahoo-Organic';
      }else if('overture.com'.indexOf(ref) >= 0){
        return 'Yahoo-Overture';
      }else{
        return 'その他';
      }
    }
  });
})(jQuery);

呼び出し元

/* conversion tracking */
  var CONVERSION_COOKIE_NAME = 'xx_ref';
  var CONVERSION_INPUT_NAME  = 'xx_ref';
  // exec.
  if($('body#form-idx').length){
    var c;
    if(c = jQuery.myGetCookie(CONVERSION_COOKIE_NAME)){
      $('form').append('');
    }
  } else {
    if(document.referrer) {
      jQuery.mySetCookie(CONVERSION_COOKIE_NAME,
                         jQuery.classifyReferrer(document.referrer),
                         function(val){
                           return (location.hostname.indexOf(val, 0) < 0);
                         });
    }
  }

2010年7月14日水曜日

JavaScriptでCookie処理

ポイント

  • リファラーの取得
  • クッキーの取得(パースするのが少し煩わしい)
  • encodeURIComponent.encode()
  • 高階関数(値に応じて保存するかどうかを判断する)

/* conversion tracking */
  var CONVERSION_COOKIE_NAME = 'ones_style_ref';
  // get cookie
  function myGetCookie(name){
    var regexp = new RegExp('; ' + name + '=([^;]*);');
   var match  = ('; ' + document.cookie + ';').match(regexp);
   if(match){
    return match[1];
   }
  }
  // set cookie
  function mySetCookie(key, val, validFunc){
    var flg = true;
    if(validFunc){
      if(!validFunc(val)){
        flg = false;
      }
    }
    if(flg){
      document.cookie= key + '=' + encodeURIComponent(val) + ';path=/;';
    }
  }
  // exec.
  if($('body#form-idx').length){
    var c;
    if(c = myGetCookie(CONVERSION_COOKIE_NAME)){
      $('form').append('');
    }
  } else {
    if(document.referrer) {
      mySetCookie(CONVERSION_COOKIE_NAME,
                  document.referrer,
                  function(val){
                    return (location.hostname.indexOf(val, 0) < 0);
                  });
    }
  }

参考

日時の形式

インターネットで日常的に見かけるのはたったの3種類。暗記してしまいたい。

1. ISO8601 - 日付と時刻の表記に関する国際規格 -
1-1. UTCの場合 - Zを付ける
例: 2010-07-14T15:27:46Z
1-1. UTC以外の場合
例: 2010-07-14T15:27:46+01:00
2. RFC822
電子メールに関するRFC(よって日時以外のデータに関する決まりも含む)。
現在はRFC2822が発行されたためRFC822は破棄されたが、日付の形式は現在でも使われている。
例: Wed, 14 Jul 2010 09:53:48 +0900

2010年7月9日金曜日

印刷&印刷プレビューでJavaScript

IEに限って、onbeforeprintとonafterprintイベントが使える。

たとえば

flashなどのobjectを含むhtmlを印刷した場合にレイアウトが乱れることがあるので、印刷前にhtmlからobjectを削除して解決(代替画像に差し替える、といったこともできると思う)。

    // このコードはjQueryに依存します

    // object要素を除去した印刷用html
    //(dhtml的に変化するページなので初めに印刷用htmlを記録しておく)
    var htmlStripped = $('body').html().replace(/<object.*<\/object>|<script.*<\/script>/ig, '');

    // 関数定義
    function fbef(){
      // 印刷するにあたって、記録しておいた印刷用htmlを復活
      $('body').html(htmlStripped);
    };
    function faft(){
      // キャッシュからリロード(これが無いと、
      // サーバーからリロードしたhtmlが印刷されて
      // しまって"fbef"の処理が無意味になる)
      location.reload(false);
    };

    // イベントハンドラを設定
    window.onbeforeprint = fbef;
    window.onafterprint  = faft;

2010年7月1日木曜日

Perlメールの文字化け

Encode::encode()でjis変換すると化ける文字がある。

そういうときはtrで強引にやる。

for my $key (keys %values) {
    #YEN SIGN, WAVE DASH, MINUS SIGN
    $values{$key} =~ tr/\x{00a5}\x{ff5e}\x{ff0d}/\x{005c}\x{301c}\x{2212}/;
}
...
$body = makemailbody($template, \%values);
$body = Encode::encode('jis', $body);