えろげサンプル画像ローダー。18禁。
読み込み待ちのストレスをjQueryアニメーションで軽減というのが良い。
原画スタッフの名前で検索できなかったのがちょっと残念ではあるけど、まあ、それはそれ。
というかDMMのラインナップ、偏ってるなあ。
追記
ブランド・原画家からも検索できるようになっていた。
Enjoy everything.
えろげサンプル画像ローダー。18禁。
読み込み待ちのストレスをjQueryアニメーションで軽減というのが良い。
原画スタッフの名前で検索できなかったのがちょっと残念ではあるけど、まあ、それはそれ。
というかDMMのラインナップ、偏ってるなあ。
ブランド・原画家からも検索できるようになっていた。
$gを更新した。
それ絡みで気付いたことのメモ。
tmp = xp.snapshotItem(i); ret[i] = tmp.nodeValue || tmp.textContent;
第3引数にtypeofがobjectとなる引数を与えた場合の挙動を改良。
//a/@hrefのようにしてAttribute Nodeを集めたとき、それらのnodeValueプロパティを参照すると属性値(href属性の値)が得られる。
Element Nodeのときはnullになるので、この場合はtextContentをみる。
$g('//a', document, {})
// -> アンカーテキスト
// ["mayokara note", "Older >", ...]
$g('//a/@href', document, {})
// -> href属性値
// ["http://mayokara.info/note/", "http://mayokara.info/note/1", ...]
で、こういうことができる。
ただしa要素のhrefプロパティから取得した場合とは違い、Absolute URIにはならない。
Relative URIで書かれているものは、そのまま。
var doc = context.ownerDocument || context, defaultNamespaceURI = (/xml$/).test(doc.contentType) ? doc.documentElement.getAttribute("xmlns") : "";
var resolver = function(prefix){
return doc.createNSResolver(context).lookupNamespaceURI(prefix) || defaultNamespaceURI;
};
XHTMLのみを対象とするのならhttp://www.w3.org/1999/xhtml決め打ちで良いのだけど、RSS 1.0を(GM_)XMLHttpRequestで取得してDOMParserに食わせたものにXPathを使いたいときはhttp://purl.org/rss/1.0/を返す必要がある。
Atomであればhttp://www.w3.org/2005/Atom。
そういうときのための修正。
デフォルトリゾルバは XML 文書のデフォルト名前空間を処理しません。
Introduction to using XPath in JavaScript - MDC # XML 文書のデフォルト名前空間を実装する
createNSResolverはdcやらrdfやらに引っ掛らなかったときにデフォルト名前空間のURIを返さない。nullが返る。
なので、documentElementのxmlns属性を見て、それを返すようにする。
namespaceURIプロパティは、RSS 1.0のようにdocumentElementのnodeNameがrdf:RDFのときxmlns:rdfのURIを返してくるので使えない。
デフォルト名前空間を含め、名前空間の接頭辞は宣言している要素とその子孫で有効ですが、子孫要素で同じ接頭辞(あるいはデフォルト)の名前空間が宣言されると、その内部では新しい宣言によって結びつきが上書きされます。
XML名前空間の簡単な説明 # デフォルト名前空間
厳密にはcontextから(取得されるノードから?)遡って調べなければならないのだけど、手を抜いた。
やるとすれば、contextの兄弟ノードとして適当なノードをinsertして、それのnamespaceURIプロパティを取るのが楽そう。
ついでに、きちんとcreateNSResolverを使うようにした(dc:dateなどのため)。
RSS 1.0を食わせたとき、documentElementの子要素以下のノードが取れない。
Bugzillaにあたってみたけど、探すのに不得手なせいで見つけられなかった。
Firefox3だとちゃんと取れる模様。
DocumentFragmentとdisplay:none、documentに直接追加する場合の速度比較 - 素人がプログラミングを勉強するブログ
Array.forEach(document.getElementsByTagName("a"), function(v){
v.addEventListener("mouseover", function(){alert(1);}, false);
});
var df = document.createDocumentFragment();
df.appendChild(document.body);
document.documentElement.appendChild(df);
// (mouseover) -> alert
Array.forEach(document.getElementsByTagName("a"), function(v){
v.addEventListener("mouseover", function(){alert(1);}, false);
});
var df = document.createDocumentFragment();
df.appendChild(document.body.cloneNode(true));
document.documentElement.replaceChild(df, document.body);
// (mouseover) -> none
Array.forEach(document.getElementsByTagName("a"), function(v){
v.addEventListener("mouseover", function(){alert(1);}, false);
});
var r = document.createRange();
r.selectNode(document.body);
document.documentElement.appendChild(r.extractContents());
// (mouseover) -> none
Array.forEach(document.getElementsByTagName("a"), function(v){
v.addEventListener("mouseover", function(){alert(1);}, false);
});
var r = document.createRange();
r.selectNode(document.body);
document.documentElement.replaceChild(r.cloneContents(), document.body);
// (mouseover) -> none
Firefox2(Win)でのみの結果。
Range#extractContentsだとイベントリスナが消えるが、df.appendChildで一旦移して戻すやり方なら消えず、問題なく使えるということらしい。
これは知らなかった。
このやり方と比較してどうこう言っていたわけではないし、Jintrickさんの指摘がこれを指していたとは思わないけど、これを知らなかったために不正確な発言になっていたという点については訂正します。
あなたの勝手な思い込み・勘違いを私の間違いにされては困りますし、迷惑で不愉快です。
Re: 間違いを指摘 - mayokara note
と書いたら
基本、agendaは「不愉快」だから。エンターテイメントじゃないんだし愉快な文章なんて書いていられるか。
(糞)議論について (agenda)
と、ブログ自身あるいは文体について不愉快だと書いたことになっている。
「あなたの勝手な思い込み・勘違いを私の間違いにされては」「困る」「迷惑」「不愉快だ」って書いたんですけど。
別に伝言ゲームじゃないんですけどねえ。
他にも
include *で使う限り何回再描画が行なわれるかは「不明」だ。
「不明」だから「たとえば」と書き、具体的な回数を出したのですが。
何なら「不明なほど多くの回数の修正に対して」と置き換えてもらっても構いませんよ。文意は変わりません。
歓迎しているが、歓迎するというのは、肯定するということではないし、必ず反応するということでもない。そして「聞く耳」というのは、何でもかんでも肯定することではない。
「肯定しろ」とも「必ず反応しろ」とも書いていません。
「聞く耳を持て」と書いただけで「何でもかんでも肯定しろ」なんて一言も言っていません。
というか、言われなくてもわかっています。誰に言っているんですか?
「聞く耳を持て」という言葉の意味がきちんと伝わっているのか疑問です。
そんなカテゴリはない。
『「意見交換、批判等」が正しいカテゴリ名だ』という指摘を、そんな堂々と言われても。
「揚げ足取り」という言葉の意味に合意が取れているのかも疑問です。
わざとやってるんですかね。
冒頭の件のように私が言っていないことを私の瑕疵として非難されるのが「不愉快」と書いたのであって、別に文体だのタイトルの「Re:」だの「agenda」の運営方針だのには一言も触れた覚えはないのですが。
どうも私の答えではなく自分の期待する答えに対して演説しているようですが、そんなものは相手をおいて議論をする以前の問題では?
で、結局元の文章をどう修正すればあなたのような人間にケチをつけられない文章になったんですかね。
「ドキュメントに修正を加えるならば」のくだりは文全体にかかっています(日本語にブレースがないのが残念)。
「修正」の意味に合意が取れていない可能性を考え、その点補足も入れましたし、どんな場合でも代替しうるものではないことも強調しました。
これは『「ビューとの分離」と書いているので~』
の点に対する補足のつもりだったんですけどねえ。
リンクについては「無断リンク禁止」と同程度に「無断リンクなし言及禁止」をしょうもないものだと思っているし、「リンクを張る自由」と同じように「あえてリンクを張らない自由」もあるという立場なので、そこを非難されてもという感じ。
から張らなかっただけで。
「俺様に口出しする輩は許さん」ってのならわかります。そう書いてもらえれば。
あと、別記事にして非難たらたらってのもダサくてかっこわるいと思いますよ、私は。
言いたいことはリンクして言えといいながら、一般論に託けてブツクサ言うのは支離滅裂としか思えない。
「曖昧な文章でぼそぼそっと批判されるのは腹立つ」
と曖昧な文章でぼそぼそっと批判している。
これが、あなたの言う「笑える芸」というやつなんですかね。自虐芸も含むのでしょうか。
私はあなたの勘違いのせいで「読めていない」
だの「間違いを指摘」
だの「愉快な文章なんて書いていられるか(以下略)」
だの言われるのが嫌なだけなんですけどねえ。
どうして言ってもいないことを次から次へと私の不理解にされなければならないのでしょうか。
突っ込まれているのに答えていない箇所があったので追記。
この文章から、1回2回の違いにこだわる点を"「神経質すぎるし、本末転倒」"と書きましたを読み取れということらしい。
Re: 間違いを指摘 (agenda)
文章力がなくてすみませんね。
これは書いた時点では違う意味で、私としては「修正する場面において、bodyの中身を全部入れ替えるようなやり方は~」という意図でした。
じゃあ何で「後出しで」回数を出しているんだという話ですが、これは「間違いの指摘」が「2回よりは1回のほうがいい」
だというのを受け、あなたが補足を読んでいるのを前提に、当初の意図に加え「回数を比較することを考えても同じように考えている」と説明するのが指摘に対して求められている回答であると考えたためです。
書いた時点では回数について(認識してはいましたが)重要視していたわけではなく(回数の話をそもそも出していない)、ゆえにあなたが回数を話に出してもそれが私の「間違いの指摘」であるとは判断できませんでした。
なので実際に「修正するという状況においてはbody要素の総入れかえ自体を否定(個人的な印象として本末転倒であると表現)」しています。
で、あなたがスクリプトを持ち出したくだりを見て強調部が伝わっていないものと思い、補足で「破棄するのなら置き換えれば良い」「どんな場合でもというわけではない」と付けたのですが、理解するのが無理というのならそうなのでしょう。
これだけ書けば理解できる文になりますかね。
間違いを指摘(※)
※body要素書き換え (agenda)の前半ね。詳しく書いたほうが良かったか?
どこが間違いの指摘になっているのかさっぱりわかりませんでした。
詳しく書いたほうがあなたには良かったようなので、詳しく書いておきます。
以下「あなた」はJintrickさんを指します。
「ドキュメントに修正を加えるならば~」の前置きを読みましたか?
「間違いを指摘」などと言われても困りますし、何故一方的に「読めていない」と判断しているのかがそもそも不明です
「神経質すぎるし、本末転倒」と書きました
「イベントハンドラに依存しているときもこの方法をとるべきでない」とされています
「文書ツリーの変更は, まず再フローにつながる」とも書かれています
「反論、ちゃちゃ入れは歓迎する」と口では言いながら、聞く耳を持たないのでは話になりません
あなたの勝手な思い込み・勘違いを私の間違いにされては困りますし、迷惑で不愉快です。
議論ごっこに興味はないのですが、補足だけ。
1) コンテンツの構造を全書き換えし、かつ 2) 専用のインターフェイスを作るのに、
body要素書き換え (agenda)
ドキュメントに修正を入れるんであれば、
つれづれ 2008.07.17 - mayokara note
DOMツリーを破棄する前提であれば置き換えれば良いと思いますが、そのケースは私のいう「修正」の意図するところではありません。
文書ツリーを多数回変更するときはDocument Fragmentを経由する (agenda)を読んで、文書ツリーを多数回変更するときは、どんな場合でもDocument Fragmentを使うべきだ、と思い込んでしまった方がいたとしたら申し訳ないことをしたし、配慮が足りていなかったと思う。
Re: 僕があまりDocumentFragmentを使っていない理由 (agenda)
とあるのと同じように、どんな場合でもDocument Fragmentを避けるべきだとは言っていません。あくまで
この事例でDocument Fragmentを経由する
文書ツリーを多数回変更するときはDocument Fragmentを経由する (agenda)
やり方を好まないと言っただけです。
やたらそこに拘るのは何なんだろう。
body要素書き換え (agenda)
適切でない例だからではないでしょうか。
Greasemonkey: tinyshell.user.js - mayokara note
$ pwd http://www.hatena.ne.jp/ $ find . -type d company/ guide/ help/ info/ rule/ $ find . -type d -print0|xargs -0 open # -> 全部開く $ cat slinks http://q.hatena.ne.jp/1216560689 http://q.hatena.ne.jp/1216596677 http://q.hatena.ne.jp/1216665689 http://q.hatena.ne.jp/1216745310 http://q.hatena.ne.jp/1216623542 $ cat slinks|open # -> 全部開く(xargs使わなくてもできる)
selected-links、selected-textはコマンド名が長い上に補完が効かないので適当に略すかも。
略した。もっと直感的なコマンド名ないかなあ。
sort uniq cut less head tail overrideMimeTypeでwget?
cygmonkeyとかにすればよかったな……いや、名前負けするからダメか。
あとは行数制限……
マイクロソフト製品ならびにサービスにおける外来語カタカナ用語末尾の長音表記の変更について
javascript:document.body.innerHTML=document.body.innerHTML.replace(/([ァ-ヶー]{2,}[ァ-ヶ])ー?/g,"$1ー");undefined
スタッフーがエディターにコピペー。
-er/-or/-arで終わってるとき限定だからアレだなあ。
Greasemonkey: tinyshell.user.js - mayokara note
コマンド文字列とどう接すればいいのかわからないよ。
// コマンド関数内で実行、argumentsにはSTDIN,ARGV,$0が入っている
// echo -abc -d 20 --long-option1 --long-option2 40 --long-option3=60 value1 value2
var [options, values] = window.TinyShell.getopts(arguments, ["-d", "--long-option2", "--long-option3"]);
/* ->
options === {
"-a": true,
"-b": true,
"-c": true,
"-d": "20",
"--long-option1": true,
"--long-option2": "40",
"--long-option3": "60",
}
values === [
"value1".
"value2",
]
*/
Core JavaScript 1.5 Reference:Global Objects:String:split - MDC
String.prototype.splitの罠 - 素人がプログラミングを勉強するブログ
String#splitの挙動と後方参照を利用すればできそう。
matchだとgフラグ立てたとき括弧の中身まで取れない。
正攻法だとRegExp#execでgフラグ立ててwhileなんだろうけど、while使いたくないし一時変数も用意したくないし1個1個pushとかもいや。
yフラグも同上。
var str = "grep \"ho\\\"ge\" 'fu\\'ga' piyo \"hello work!\"";
str
// -> "grep "ho\"ge" 'fu\'ga' piyo "hello work!""
str.split(/(["']?)((?:\\.|[^\\])*?)\1(?:\s+|$)/)
.filter(function(v,i){ return (i%3 === 2); })
.map(function(v){ return v.replace(/\\(["'\\])/g, "$1"); })
// -> ["grep", "ho"ge", "fu'ga", "piyo", "hello work!"]
$ echo he\llo hello $ echo "he\llo" he\llo $ echo he\"llo he"llo $ echo 'he\"llo' he\"llo
Cygwinでやってみたんだけど、何か上のじゃだめっぽい……