<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>さくらたんどっとびーず &#187; GreaseMonkey</title>
	<atom:link href="http://sakuratan.biz/archives/tag/greasemonkey/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>GreaseMonkey からターゲットページのイベントハンドラを呼び出す方法</title>
		<link>http://sakuratan.biz/archives/1090</link>
		<comments>http://sakuratan.biz/archives/1090#comments</comments>
		<pubDate>Wed, 29 Jul 2009 15:37:33 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[GreaseMonkey]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1090</guid>
		<description><![CDATA[さくらです♡こんばんわ☆彡 今日はグリモンスクリプトから対象のウェブページに設定されたイベントハンドラを呼び出す方法を簡単にご紹介したいと思います。 例えば以下のような HTML をグリモンの処理対象とした場合、 &#60;a href="http://www.example.com" id="target">www.example.com&#60;/a> グリモンからウェブページ上の onclick... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1090">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さくらです♡こんばんわ☆彡</p>
<p>今日はグリモンスクリプトから対象のウェブページに設定されたイベントハンドラを呼び出す方法を簡単にご紹介したいと思います。</p>
<p>例えば以下のような HTML をグリモンの処理対象とした場合、</p>
<pre>&lt;a href="http://www.example.com" id="target">www.example.com&lt;/a></pre>
<p>グリモンからウェブページ上の onclick イベントハンドラを、以下のように呼び出すことはできません。</p>
<pre>var obj = document.getElementById('target');
obj.onclick();</pre>
<p>できない理由は <a href="https://developer.mozilla.org/ja/XPCNativeWrapper#Limitations_of_XPCNativeWrapper">XPCNativeWrapper &#8211; MDC</a> に書かれているとおり、XPCNativeWrapper の on* プロパティを設定したり読み込もうとすると例外が送出されるためです。</p>
<p>グリモンスクリプトから on* プロパティを呼び出すには、<a href="http://www.w3.org/TR/DOM-Level-2-Events/">Document Object Model (DOM) Level 2 Events Specification</a> に定義されている方法で、イベントハンドラを呼び出す必要があります。具体的にはこんな感じです。</p>
<pre>var obj = document.getElementById('target');
var e = document.createEvent('MouseEvents');
e.initEvent('click', true, false);
obj.dispatchEvent(e);</pre>
<p>これは JavaScript で obj.onclick() と書くのとほぼ同じことを、DOM Level 2 のイベントを使ってコーディングしてるだけで、id=&#8221;target&#8221; のオブジェクトに対してマウスクリックが発生したことを表すイベントを送出してます。</p>
<p>DOM Level 2 イベントは、</p>
<ol>
<li>document.createEvent を使ってイベントオブジェクトのインスタンスを取得する</li>
<li>イベントオブジェクトは initEvent を使って初期化する</li>
<li>dispatchEvent でイベントを送出する</li>
</ol>
<p>という順で使用します。</p>
<p>createEvent の引数にはイベントオブジェクトの種類を指定します。initEvent で指定する、発生させるイベントの種類により、使用するイベントオブジェクトは変わります。どのイベントを発生させるときにどのイベントオブジェクトが必要かについては <a href="http://www.w3.org/TR/DOM-Level-2-Events/">Document Object Model (DOM) Level 2 Events Specification</a> をご覧ください。</p>
<p>initEvent の第一引数には送出するイベントの種類を指定します。イベントの種類には onclick なら &#8216;click&#8217; 等、JavaScript のイベントハンドラと対応した名前が付いてます。こちらも詳しくは <a href="http://www.w3.org/TR/DOM-Level-2-Events/">Document Object Model (DOM) Level 2 Events Specification</a> をご覧ください。第二引数にはイベントバブルの可否を指定します。true なら可です。第三引数にキャンセル可否を指定します。こちらも true なら可です。</p>
<p>DOM Level 2 イベントを使うと、イベント発生を伴う JavaScript での処理をグリモンにより自動化することができます。</p>
<p>使い道は色々あると思いますが、さくら的には例えば田代とか、正確に言えば田代砲とか、いずれにしてもロクな利用方法は思いつきませんでしたww</p>
<p>まあウェブアプリのテストとかなら使えるような気もしますけど、テストツールならもっと良いアドオンがあったと思いますので、やっぱりロクな利用方法が(ry</p>
<p>さくら</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1090/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GreaseMonkey プログラミング、始めました。</title>
		<link>http://sakuratan.biz/archives/1086</link>
		<comments>http://sakuratan.biz/archives/1086#comments</comments>
		<pubDate>Fri, 24 Jul 2009 17:34:23 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[GreaseMonkey]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1086</guid>
		<description><![CDATA[さくらです♡こんばんわ☆彡 個人的なアレでちょろっと GreaseMonkey のスクリプト書いてみたんだけどすごいハマっちゃったりしました。なんでこれから GreaseMonkey を始める方に、あまりハマらずに GreaseMonkey プログラミングを始めるためのネタを書いときたいと思います。 まあ GreaseMonkey 始めたのが昨日の今日なんで、内容に多少問題があるかもしれませんがご... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1086">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さくらです♡こんばんわ☆彡</p>
<p>個人的なアレでちょろっと GreaseMonkey のスクリプト書いてみたんだけどすごいハマっちゃったりしました。なんでこれから GreaseMonkey を始める方に、あまりハマらずに GreaseMonkey プログラミングを始めるためのネタを書いときたいと思います。</p>
<p>まあ GreaseMonkey 始めたのが昨日の今日なんで、内容に多少問題があるかもしれませんがご了承をww</p>
<p>とりあえずインスコしてない人は<a href="https://addons.mozilla.org/ja/firefox/addon/748">こちら</a>からどうぞ。</p>
<h2>GreaseMonkey でできること</h2>
<p>GreaseMonkey を使ったことがある方なら大体のイメージは沸くと思いますが、プログラミングする側から見ると GreaseMonkey は特定の URL に対して保存しておいた JavaScript を自動的に実行するためのアドオンというような感じになります。</p>
<p>たぶんブックマークレットがイメージ的に GreaseMonkey と近いと思いますが、ブックマークレットを実行するにはブラウザからブックマークレットを呼び出したり URL として入力しないといけないのに対して、GreaseMonkey では特定の URL に対してアクセスがあると JavaScript が自動的に実行されます。</p>
<p>GreaseMonkey の JavaScript は、若干の制限があることを除き普通の JavaScript です。</p>
<p>ですので JavaScript を知っていれば、簡単にスクリプトを作ることができると思います。また GreaseMonkey でできることも、普通に HTML に JavaScript 埋め込む時と同じようなことになります。</p>
<p>JavaScript を多少ご存知の方は結構いらっしゃると思いますが、その辺の知識があれば簡単に使うことができると思います。</p>
<h2>プログラミングする前にブクマしといた方がいい URL</h2>
<p>基本的には JavaScript なので、その辺をご存知の方から見ればそんな難しいものでは無いと思いますが、ご多分に漏れず GreaseMonkey 特有のハマる要素がありますので、とりあえず困ったときの参考資料を用意しておいた方がいいと思います。さくらが参考にしたのはこの辺です。</p>
<ol>
<li><a href="http://firefox.geckodev.org/index.php?Greasemonkey">Greasemonkey &#8211; Mozilla Firefox まとめサイト</a><br />
実を言うとわざわざ自分で記事を書かなくても、だいたいのことはここに載ってるという感じなのですが、それを言い出すと書くこと何にも無くなっちゃうのでご勘弁をw<br />
つーことで GreaseMonkey の基本的なことは、だいたいこちらのサイトに載ってますです。</li>
<li><a href="https://developer.mozilla.org/ja/DOM">DOM &#8211; MDC</a><br />
FireFox の DOM 実装に関する説明です。基本的に GreaseMonkey スクリプトでは DOM を使ってコーディングしていくことになりますので、FireFox でどのように実装されているかを調べる必要がたまに出てきます。</li>
<li><a href="http://www.w3.org/DOM/DOMTR">Document Object Model (DOM) Specifications</a><br />
W3C の DOM のリファレンスへの目次です。FireFox の DOM は割と W3C の DOM に忠実に実装されていたと思いますので、リファレンス目的で調べるにはこちらも便利だと思います。</li>
</ol>
<h2>とりあえず書いてみる</h2>
<p>習うより慣れろということで、GreaseMonkey のサンプルスクリプトを作ってみました。</p>
<p>新しくネタを考えるの面倒なので、<a href="http://sakuratan.biz/archives/889">【無料版】はてな自動リンクブックマークレット</a>の GreaseMonkey 版にしてみました。ページ上のすべてのリンクに被はてブ数を表示する GreaseMonkey スクリプトです。</p>
<pre>// ==UserScript==
// @name Hatebu Num
// @description Display number of hatena bookmarks for all links in the page.
// @include http://*
// @include https://*
// /==UserScript==

var b = 'http://b.hatena.ne.jp/entry/';
var vec = [];
var i;

for (i = 0; i < document.links.length; ++i) {
    vec.push(document.links.item(i));
}

for (i = 0; i < vec.length; ++i) {
    var e = vec[i];
    var a = document.createElement('a');
    a.href = b + e.href;
    a.innerHTML = '<img src="' + b + 'image/' + e.href + '" style="border:0;height:13px;width:auto;"/>';
    e.parentNode.insertBefore(a, e.nextSibling);
}</pre>
<p>実際に動かすとこんな感じ。このスクリプトによって、ページ上のリンクの横にはてブしてるユーザー数が埋め込まれます。</p>
<p><img src="http://sakuratan.biz/blog/wp-content/uploads/2009/07/hatebunum.png" alt="hatebunum" title="hatebunum" width="335" height="189" class="alignnone size-full wp-image-1088 capture" /></p>
<p>実際に使ってみたい人は、GreaseMonkey をインスコしてから <a href='http://sakuratan.biz/blog/wp-content/uploads/2009/07/hatebunum.user.js'>hatebunum.user.js</a> をクリックするとスクリプトがインスコされます。ただ対象のページによってはかなり重いんでご注意を。</p>
<p>JavaScript 自体は普通の JavaScript だしかなり短いんで見りゃ分かると思うから説明は省略して、上のスクリプトにも含まれている GreaseMonkey スクリプトとしての必須要件について説明します。</p>
<ol>
<li>まず GreaseMonkey スクリプトのファイルの拡張子は .user.js です。単なる .js だと GreaseMonkey が GreaseMonkey スクリプトだと認識しません。</li>
<li>次に GreaseMonkey スクリプトには // ==UserScript== で始まり // /==UserScript== で終わるヘッダを含めることができます。ヘッダは無くても構いませんが、スクリプトを実行対象にする URL の制限を @include 等で行えますので、とりあえず中身無くても付けといた方が良いと思います。ヘッダのちゃんとした説明は <a href="http://greasemonkey.mozdev.org/authoring.html">mozdev.org &#8211; greasemonkey: authoring</a> をご覧ください。</li>
</ol>
<p>以上の二点を満たすと、その JavaScript ファイルは、GreaseMonkey スクリプトとなります。長々と説明しましたが、要は拡張子を .user.js にしろってことで、長官たんww</p>
<h2>GreaseMonkey スクリプトの制限</h2>
<p>最初にすごいハマったと書いたんですが、GreaseMonkey にはスクリプト中で使用可能な JavaScript に制限があって、その辺のことが原因でトラブってたもんで解決するのにえらい時間がかかってしまいました。具体的な話はまた今度書きたいと思いますが、とりあえず今日は GreaseMonkey スクリプトの制限について簡単にご説明を。</p>
<p>GreaseMonkey に制限があるというよりも、FireFox が特権（chrome）モードで動くスクリプトに対して制限をかけており、それが GreaseMonkey にも適用されると言う方が正確なのですが、いずれにせよ普通のウェブサイトに置くような JavaScript とまったく同じスクリプトを書くと実行できないことがあります。</p>
<p>まず FireFox が chrome モードで動くスクリプトに対して課す制限について。FireFox は ウェブページの DOM オブジェクトに対する chrome モードからのアクセスは <a href="https://developer.mozilla.org/ja/XPCNativeWrapper">XPCNativeWrapper</a> を経由してのアクセスに制限します。XPCNativeWrapper はセキュリティ上の理由で実装されており、この辺の理由等については <a href="https://developer.mozilla.org/ja/Safely_accessing_content_DOM_from_chrome">Safely accessing content DOM from chrome &#8211; MDC</a> をご覧ください。</p>
<p>XPCNativeWrapper を経由して対象 DOM オブジェクトへアクセスすると、DOM レベル 0 で定義されているインタフェース以外はアクセスできなくなります（何が DOM 0 かは上の DOM のページをご覧ください）。また単に DOM 0 以外のアクセスできないだけでなく<a href="https://developer.mozilla.org/ja/XPCNativeWrapper#Limitations_of_XPCNativeWrapper">他の制限</a>もあります。これに関する<a href="http://www.oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html?page=3">Greasemonkey スクリプトから利用する観点からの説明</a>もあります。</p>
<p>とりあえず DOM 0 相当のコードを書いておけばオッケーと覚えとくのが良いかと思いますが、イベント回りは <a href="http://www.w3.org/TR/DOM-Level-2-Events/">DOM 2 event</a> 相当が<a href="https://developer.mozilla.org/ja/DOM/event">実装されている</a>ようですので、こっちはそっちに合わせとかないといけないような感じでなかなかカオスな感じですww</p>
<p>まあこの辺の制限にひっかかるのは、単にウェブページの見た目を変えるだけでは無いようなスクリプトを書いたときだと思いますので、いきなり問題が発生する方がまれかもしれませんが、そういう制限があるということを頭の片隅に入れておくと、トラブった時の問題の切り分けがだいぶ簡単になると思います。</p>
<p>ということで皆様も、GreaseMonkey であんなことやこんなことを自動化されると色々イイ感じだと思いますので、お暇があればぜひ一度お試しをwww</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1086/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
