honjarake blog

自分用にテキトーにまとめる

JavaScript 要素の絶対座標

function getElemAbsolutePosition(ctrl){
  try {
    var rect = (function (elem) {
      var html = document.documentElement;
      var rect = elem.getBoundingClientRect();
      var left = rect.left - html.clientLeft;
      var top = rect.top - html.clientTop;
      return {
        left: left,
        top: top
      };
    }) (ctrl);
    _CONTROLS.top = rect.top;
    _CONTROLS.left = rect.left;
  } catch (e) {
  }
}

保存ボタンを押したときの結果tooltip表示位置に使用
スクリプトが形になってきた!

視力減退 視力回復トレーニング

視力が異様に落ちた。スマホが原因だろうか
メガネをかけてディスプレイをみるのは始めてで目が疲れる

とりあえず、目のトレーニングをやってみる

立体視も試してみた
交差法と平行法があるけど、交差法しかうまくいかない

アプリや画像も試す
スマホでトレーニングというのもなんとなく変な感じだけど

他にも何かグッズとかあれば使っていきたいと思う

JavaScript HTMLエスケープとHTMLデコード

JavaScript 文字列のエスケープについて - honjarake blog
前回の件の続き
結局、デコードは凝ったことをやめ、replaceした
特殊記号エスケープはCSSセレクタ用にピンポイントで使う

/* escape */
// HTMLエスケープ
function NNSH_escapeHTML(str) {
  return str.replace(/[&"<>,']/g, function (c) {
    console.log('esc:' + c);
    return {
      '&': '&amp;',
      '"': '&quot;',
      '<': '&lt;',
      '>': '&gt;',
      ',': '&#044;',
      '\'': '&#039;'
    }[c];
  });
}
// 特殊記号エスケープ
function NNSH_escapeEx(str) {
  return str.replace('\\', '\\\\')
  .replace('\'', '\\\'')
  .replace('"', '\\"');
}
/* decode */
function NNSH_decodeHTML(str) {
  return str .replace(/&lt;/g, '<') .replace(/&gt;/g, '>') .replace(/&quot;/g, '"') .replace(/&#039;/g, '\'') .replace(/&#044;/g, ',') .replace(/&amp;/g, '&');
}

GM_getValueが動かない?

@grant GM_getValue 宣言したのにis not defined エラーが出る

公式からのコピペだし、表記は間違っていない
途中、何回もデバッグを繰り返していたら
デバッガの調子がおかしくなったのかログがでなくなった
その後も、期待通りの動きをしていない

window.load前のhtmlタグみたいに、GM関数のロードのタイミングの問題とか?
とりあえず、try catch してデバッグ用の値で動かしている。(エラー、正常の両方でconsole.log 出してあるが表示されない)

今日は、もう疲れた。ソースもう少しまとめよう・・・

追記

後日、開いてみると、@grant noneに戻っていた
他の部分は修正後の状態だった
宣言だけ修正したら、今後はちゃんと動いたので、ひとまず解決
firefoxの再起動を行って、駄目ならOS再起動したほうが吉

再追記

またエラー出た…もういやだ
自分で作ったsetValue,getValue関数で代用した
greasemonkey データの保存 - honjarake blog

最初からこうすれば良かった

JavaScript 文字列のエスケープについて

escapeHTML についてここを参考
escapeHTML の実装 3 パターン (ベンチマーク付き) - (new Hatena).blog()

これは特殊文字「変換」に当たるかな

まずは、区切り記号をエスケープする前に、区切り記号を何にするか…
CSVのイメージで「,」を使おうと思っていたけど、エスケープする関数とデコードする関数必要だ
上の参考サイトのソースにちょっと足せばいいんだけどさ…
区切り記号を上のescapeHTMLで変換しているものにすればいいんじゃないかって気がしてきた(>とか<とか)
そうすると不備が出るパターンあるかなあ…
エスケープする順番さえ間違えなければいけるだろうか

あと、cssセレクタに使う場合はソースコード上のエスケープが必要ってことでこれも必須
クオーテーションで囲んだ中に入る文字列なので
基本は「'」「"」「\」の前に「\」付与すればいけるんじゃないかと思う

JavaScript textareaから読み出し と、これから実装する機能まとめ

[JavaScript]textareaを1行づつ処理する

これを参考に読み出してサニタイジング、改行コードを区切り記号(カンマ等)に変換して保存かな
逆に読み出すときは区切り記号でsplitしてから文字列に戻してクオート等をエスケープして…

とりあえず、目的からまとめてみようと思う

目的
  • textareaはNGワードの記入(改行区切り、複数指定)に使用
  • 保存ボタンが押されたとき、textareaの内容を文字列データとして保存
  • NGワードを元に、あるhtml内の要素を捜査、要素の中にNGワードを含む場合
    要素を非表示/背景と同じ文字色にする
  • NGワードを元に、div[title=*" + %NGワード% + "] の形式で非表示用のスタイルを生成する
保存するとき
  • 区切り記号と同じ文字列をエスケープ(カンマなら「&#44;」する処理必須
  • それ以外は出力前にエスケープすることで問題ないか(要確認)
読み出すとき
  • CSSセレクタとして使う場合と、文字列一致チェックのときに元に戻す必要があると思う。エスケープも必須
  • エスケープした記号はどのように解釈されるのか(要確認)

JavaScript デバッグについて

※操作を間違って保存失敗したため、短めにまとめ
デバッグについて

デバッグツール WebInspector

デバッガが吐き出すエラーについて

要点:
JavaScriptはブラウザによっても挙動が違うため、デバッグが複雑である
デバッグツールは色々ある(FirefoxにはアドオンFirebugが)
consoleにはconsole.log以外にも色々なメソッドが用意されている
IE9では、console.dirが便利そう