<?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; mailto</title>
	<atom:link href="http://plusb.jp/blog/?feed=rss2&#038;tag=mailto" rel="self" type="application/rss+xml" />
	<link>http://plusb.jp/blog</link>
	<description>今更なことをそれでもつらづらと書くブログ</description>
	<lastBuildDate>Tue, 07 May 2013 09:06:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>mailto: のスパム対策</title>
		<link>http://plusb.jp/blog/?p=456</link>
		<comments>http://plusb.jp/blog/?p=456#comments</comments>
		<pubDate>Tue, 23 Mar 2010 16:47:58 +0000</pubDate>
		<dc:creator>M. K.</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[mailto]]></category>

		<guid isPermaLink="false">http://plusb.jp/blog/?p=456</guid>
		<description><![CDATA[ページにメールアドレスを書く必要に迫られてスパムメール対策について調べてみました。 調査結果 まあ一般的には下記の対策までのようです。というかサーバー側のフィルターが発達して、もう誰も気にしないのでしょうか・・・ 画像を &#8230; <a href="http://plusb.jp/blog/?p=456">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ページにメールアドレスを書く必要に迫られてスパムメール対策について調べてみました。</p>
<h3>調査結果</h3>
<p>まあ一般的には下記の対策までのようです。というかサーバー側のフィルターが発達して、もう誰も気にしないのでしょうか・・・</p>
<ul>
<li>画像を使用する</li>
<li>アドレスをエンコードする</li>
<li>JavaScriptを使用する</li>
</ul>
<p><span id="more-456"></span><br />
しかし、JavaScritpを使用していてもアドレス収集RobotにWebKit等のエンジンを搭載してしまえば全然関係無い気がします(画像による対策はコピペしようとして騙された感があったりして今ひとつです）。</p>
<p>そんななか<a href="http://www.nikkei-azabu10.com/smail.html">スパムメール対策(迷惑メール)実験室</a>と言うページを見つけました（ここも2006年が最終更新のようですがorz)。このサイトで「３秒後に表示する」というアイデアが提示されていました。<br />
確かに動的な要素まではRobotも相手にしなさそうです。このアイデアから着想を得て私もひとつスパム収集対策スクリプトを作成してみました。</p>
<h3>mouseoverでmailtoを表示する</h3>
<ul>
<li><a href="/dq/js/showMT.js">DOWNLOAD</a></li>
<li><a href="http://plusb.jp/dq/samples/mailto_demo.html">DEMO</a></li>
</ul>
<p><small>デモは追って用意しますが、実際に使用している<a href="/kitankai/index.html">ページ</a>があります。そちらのコードを参照してください。</small><br />
例えば最初は画像でメールアドレスを示しておいて、マウスを持っていくとmailtoへ変更します。画像アドレスでは無くメールアイコンにしておいて、マウスカーソルを重ねるとメールアドレスがスライドしてもかっこよいかもしれません（逆にうっとうしいか?)。<br />
まずは、シンプルに<code>mouseover</code>で切り替える方法です。</p>
<h4>元の表示</h4>
<p>本来はdivタグの中身を画像などにします。</p>
<pre>&lt;div id="to"&gt;to address&lt;/div&gt;
</pre>
<h4>入れ替えスクリプト</h4>
<pre>function showMT1(name, a) {
    a.m = ['m', 'a', 'i', 'l', 't', 'o', ':'].join('');

    var
    t = document.getElementById(name),
    l = document.createElement("a"),
    b = t.firstChild;

    t.onmouseover = append;

    function append() {
        var v = [a.n.join(''), a.d.join('')].join('@');

        l.style.display = 'block';
        l.href = a.m + v;
        l.firstChild &amp;&amp; l.removeChild(l.firstChild);
        l.appendChild(document.createTextNode(v));
        t.replaceChild(l, t.firstChild);
        t.onmouseover = null;
        l.onmouseout = rm;
        return true;
    }
    function rm() {
        t.replaceChild(b, t.firstChild);
        t.onmouseover = append;
    }
}
</pre>
<p>どうでも良い事ですが、div要素の子要素をa要素に切り替えてしまうことで<code>mouseout</code>と<code>mouseover</code>が発生して期待通りに動作しないため、一見すると冗長なコードになっています。<br />
簡単にポイントを説明しておくと、まずurlエンコード自体はたいした効果がないようなので使用せず、JavaScriptの実行無しにはメールアドレスが特定できないように&#8217;@'との分離とアドレスの配列化を実施しています。<br />
後は、DOMへのmailtoの書き出しを遅延することでスパムメール対策としています。</p>
<h4>呼び出し</h4>
<pre>window.onload = function() {
    showMT1('to', { n: ['m', 'a', 'i', 'l'], d: ['a', 'd', 'd', 'r', 'e', 's', 's'] });
}
</pre>
<p>次に<code>mouseover</code>でフェードイン、<code>mouseout</code>でフェードアウトします(ここからはjQueryが必要になります)。</p>
<h4>コード</h4>
<pre>function showMT(name, a) {
    a.m = ['m', 'a', 'i', 'l', 't', 'o', ':'].join('');
    var
    t = $('#' + name),
    b = t.html(),
    tid = -1,
    ak,
    ap = function () {
        if (ak &amp;&amp; ak.css('display') != 'none') {
            tid != -1 &amp;&amp; clearTimeout(tid);
            return;
        }
        var v = [a.n.join(''), a.d.join('')].join('@');
        ak = $('')
        .attr('href', a.m + v)
        .text(v)
        .hide()
        .fadeIn(function () {
            setTimeout(function () {
                ak.bind('mouseout', rm);
            }, 1);
        })
        .mouseover(function () {
            tid != -1 &amp;&amp; clearTimeout(tid);
        });
        t.text('').append(ak);

        return true;
    },
    rm = function () {
        tid = setTimeout(function () {
            tid = -1;
            ak.fadeOut('normal', function () {
                t.html(b).remove('mouseout').one('mouseover', ap);
                ak.remove();
            });
        }, 2000);
    };
    t.one('mouseover', ap);
}
</pre>
<p>ここでの要点は<code>mouseout</code>で元の画像へ戻ってしまうことを<code>setTimeout</code>を使用して遅延させていることです。<br />
これは<code>mouseout</code>ですぐに画像に戻ってしまうとコピー＆ペーストが出来なくて本末転倒になってしまうためです。<br />
このためだけにかなり苦労してしまいましたが、そもそも<code>mouseout</code>の処理は不要かもしれませんねorz</p>
]]></content:encoded>
			<wfw:commentRss>http://plusb.jp/blog/?feed=rss2&#038;p=456</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
