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

2014年3月11日火曜日

特定の文字に色を付ける

ドキュメントから test を探し<span></span>で囲んでcssを付けてます。
function setWordHighlight (word) {
  var doc = document,
      df = doc.createDocumentFragment(),
      span = doc.createElement('span'),
      texts = doc.evaluate('descendant::text()[normalize-space(.)]', doc.body, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 
  span.className = 'high-light';
  span.appendChild(doc.createTextNode(word));
 
  for (var i = 0, l = texts.snapshotLength, stringsLength, textNode; i < l; ++i) {
    textNode = texts.snapshotItem(i);
    strings = textNode.data.split(word);
    stringsLength = strings.length;

    if (stringsLength > 1) {
      df.appendChild(doc.createTextNode(strings[0]));

      for (var j = 1; j < stringsLength; ++j) {
        df.appendChild(span.cloneNode(true));
        df.appendChild(doc.createTextNode(strings[j]));
      }
     
      textNode.parentNode.replaceChild(df, textNode);
    }
  }
}

setWordHighlight('test');

css:
.high-light { color: black; background-color: yellow; font-weight: bold; }

http://jsfiddle.net/3F4Wa/
http://toro.2ch.net/test/read.cgi/hp/1386098775/898


2013年11月6日水曜日

ループの高速化

全要素を走査し順番に意味が無い場合、若干ですが高速化できます。
 
for (var i = 0; i < list.length; i++) {
   console.log(list[i]); 
}

毎回、.lengthを参照するのは無駄ですので予め変数に入れておきます。

for (var i = 0, len = list.length; i < len; i++) {
    console.log(list[i]); 
}

順番に意味がないのなら、最後から走査することでさらに簡略化できます。
 
var i = list.length - 1;
for (; i >= 0; i--) {
   console.log(list[i]); 
}


2013年10月14日月曜日

配列かどうかを見分けるにはarray instanceof Arrayでは不十分

array instanceof Array
では不十分なので
Array.isArray(obj)
を使用する 
 
古いブラウザでは↓を追加しとく
 
if (!Array.isArray) {  
  Array.isArray = function (vArg) {  
    return Object.prototype.toString.call(vArg) === "[object Array]";  
  };  
}
 

2013年9月21日土曜日

末尾の文字を取り除く方法

文字列末尾に / があった時に取り除く方法

s = s.replace(/\/$/,'');

// ↑より高速
if ('/' === s.charAt(s.length - 1))
  s.slice(0, -1);


// ES6から
if (s.endsWith('/'))
  s.slice(0, -1);

2013年9月11日水曜日

リファラを消す

a.onclick = function () {

     //remove referer

    this.href = "data:text/html;charset=utf-8," + encodeURIComponent('<script>\x3c!--\ndocument.write(\'<meta http-equiv="refresh" content="0;url=' + this.href + "\">');//--\x3e\x3c/script>")

}

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");

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

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月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 "";
}