2012年11月11日日曜日

XPathで複数のクラス名が付いている要素取得時の注意点

参考:
http://d.hatena.ne.jp/ksmemo/20090815/p1
http://feed.designlinkdatabase.net/feed/outsite_102424.aspx

<div class="aaa bbb ccc"></div>

このような要素は

//div[@class='aaa']

では取得できず、空白を含めてクラス名をそのまま指定しなくてはいけない

//div[@class='aaa bbb ccc']

ひとつだけ指定してやる場合は

//div[contains(concat(" ",@class," "), " aaa ")]

のようにします。(前後の空白は必要みたい)

さらにクラス名はスペースや改行も含めていいという仕様なので
normalize-space()を使って余計なスペースを除去したほうが良いようです。

//div[contains(concat(" ", normalize-space(@class), " "), " aaa ")]

 normalize-spaceは前後のスペースを削除し、連続したスペースをひとつのスペースにしてくれます。
 
 


2012年10月25日木曜日

数字に3桁区切りでカンマを入れるいろいろな方法

var num = "1234567890";
document.write( num.split(/(?=(?:\d{3})+$)/).join() + "\n");
document.write( num.split(/(?=(?:\d{3})*$)/).join(",") + "\n");
document.write( num.replace(/(\d)(?=(\d{3})+$)/g,'$1,') + "\n");
document.write( num.replace(/\B(?=(?:\d{3})+$)/g, ',') + "\n");

どれがいいのかは知らない

Chrome Extension でmanifest.jsonにアクセスする方法

backgroundでのみ可能


var d = chrome.app.getDetails();
console.dir(d); // 例: バージョンを取得
var version = chrome.app.getDetails().version;


http://stackoverflow.com/questions/9973489/how-do-i-use-the-version-information-from-manifest


ContentScriptからは

function getManifest() {
    var manifestObject = false;
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            manifestObject = JSON.parse(xhr.responseText);
        }
    };
    xhr.open("GET", chrome.extension.getURL('/manifest.json'), false);

    try {
        xhr.send();
    } catch(e) {
    }
    return manifestObject;
}

2012年10月19日金曜日

Firefox拡張機能で日本語含むUTF-8文字列&JSONを保存する

setCharPref()はASCIIのみで日本語を含む文字列やJSONは保存できない
私はASCIIとUTF-8で分けるのは面倒なので全部UTF-8で保存している

setPref("json", JSON.stringify({ json: "あああ" }));



var Cc = Components.classes, Ci = Components.interfaces;
var gBranch = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.[your_extensions_name].");

保存:
function setPref(prefName, value) {
  if (typeof value === 'boolean') {
    gBranch.setBoolPref(prefName, value);
  } else if (typeof value === 'number') {
    gBranch.setIntPref(prefName, value);   // -2,147,483,648~2,147,483,647
  } else if (typeof value === 'string') {
    var ustr = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
    ustr.data = value;
    gBranch.setComplexValue(prefName, Ci.nsISupportsString, ustr);
    // gBranch.setCharPref(prefName, value);    // ASCII only 日本語はムリ
  }
}

取得:
function getPref(prefName, defValue) {
  var type = gBranch.getPrefType(prefName);
  const nsIPrefBranch = Ci.nsIPrefBranch;
  switch (type) {
  case nsIPrefBranch.PREF_STRING:
  default:
    return gBranch.getComplexValue(prefName, Ci.nsISupportsString).data;
    // return gBranch.getCharPref(prefName); // ASCII only

  case nsIPrefBranch.PREF_INT:
    return gBranch.getIntPref(prefName);

  case nsIPrefBranch.PREF_BOOL:
    return target.getBoolPref(prefName);
  }
  return defValue;
}

2012年10月18日木曜日

JavaScriptでメンバへのアクセス方法の名前

var obj = { a: 1, b: 2, c: 3, d: 4 };
//括弧記法
alert(obj["a"]);
//ドット記法alert(obj.a);

どちらも同じだが括弧記法は変数で指定できる
var name = "a";
alert(obj[name]);
 

リファラ(Referer)を付けずにリンクする方法

HTML:
<a onclick="return noReferer(this);" href="http://www.teria.com/~koseki/memo/referrer/view.php">http://www.teria.com/~koseki/memo/referrer/view.php</a>


JavaScript:
function noReferer(a) {
  var w = window.open();
  w.document.write('<meta http-equiv="refresh" content="0;url='+a.href+'">');
  w.document.close();
  return false;
}

参考リンク:
http://www.teria.com/~koseki/memo/referrer/
http://qootas.org/blog/archives/2004/11/referrer.html

2012年10月13日土曜日

XULでテキストリンクを表示する

ボタンではなくリンクスタイルで表示する方法
https://developer.mozilla.org/ja/docs/XUL/Style/text-link

使い方:  <label class="text-link" value="Google" href="http://www.google.co.jp" />



2012年10月5日金曜日

Firefox拡張でURL操作

http://d.hatena.ne.jp/thorikawa/20080604/1212561182

cookieに書き込み

引用元会社 : ポンパレ
/*******************************************************************************
関数名前  : WriteLHistory
処理機能  : cookieに書き込み
引数      : cookie名, 値
作成日    : 2011/4/1
*******************************************************************************/
function WriteLHistory(name, value) {
 var dt = new Date(2037, 11, 31);

 document.cookie = name + "=" + value + ";expires=" + dt.toGMTString() + ";path=/;";
}

指定した名前のcookieを取得

引用元: ポンパレ
function get_cookie(name){
var nameOfCookie = name + "=";
var x = 0;
while ( x <= document.cookie.length ){
  var y = (x+nameOfCookie.length);
  if ( document.cookie.substring( x, y ) == nameOfCookie ) {
   if ( (endOfCookie=document.cookie.indexOf( ";", y )) == -1 ) {
    endOfCookie = document.cookie.length;
   }
   return unescape( document.cookie.substring( y, endOfCookie ) );
  }
  x = document.cookie.indexOf( " ", x ) + 1;
  if ( x == 0 )
   break;
 }
 return "";
}

2012年3月30日金曜日

アドオンからWebページのHTMLを書き換える

最初、innerHTML で書き換えてたのですがAMOの事前審査でセキリュティリスクがあると言われて拒否されました。。

https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion

そこで一旦HTMLからDOMを作り、それをWebページに追加する形にしたところ無事通過しました。


function HTMLParser(doc, aHTMLString)
{
        var html = doc.implementation.createDocument("http://www.w3.org/1999/xhtml", "html", null);
        var body = doc.createElementNS("http://www.w3.org/1999/xhtml", "body");
        html.documentElement.appendChild(body);

        body.appendChild(Components.classes["@mozilla.org/feed-unescapehtml;1"].getService(Components.interfaces.nsIScriptableUnescapeHTML).parseFragment(aHTMLString, false, null, body));

        return body;
}

2012年3月26日月曜日

Dreamweaverのテンプレート使用時に付くコメントタグを消す方法

単ページだけ消したいなら、コマンド→HTMLのクリーンアップ→Dwの特殊マークアップにチェックで
サイト全体なら、修正→テンプレート→マークアップを省略して書き出しで別ファイルとして保存されるよー
http://toro.2ch.net/test/read.cgi/hp/1329102823/473

Google Analyticsで外部リンクのURLとクリック数をカウントするコード

 通常イベントを記録するには<a>タグ全てにonclick="_gaq.push(['_trackEvent', 'OutLink', 'Click', 'http://********/']);"を設定しなければいけないのですがこちらのコードでは全ての外部リンクに自動的に設定できます。


取得するコード

必ずGoogle Analyticsトラッキングコードの下に配置してください。(非同期タイプ用) 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(function($) {
  $.each($("a[href^='http://'], a[href^='https://']"), function() {
    $(this).click(function() {
      _gaq.push(['_trackEvent', 'OutLink', 'Click', $(this).attr('href')]);
    });
  });
});
</script>



レポートの見方

コンテンツ > イベント > サマリーでイベントラベルを選択することによってクリックされたリンク先が分かります。

 ※ コードは http://syousei.wordpress.com/2011/01/20/google-analytics-event-tracking/ とそのコメント欄の方の転載です。