Hatena::ブログ(Diary)

Scrapcode@はてなダイアリー このページをアンテナに追加 RSSフィード

2009-04-21

スタコメの重複投稿を防ぐhatena_star_comment_block_duplication

(2009-05-15追記: これを変更して作った hatena_star_utils をd:id:khashi:20090515:1242374280で公開しました)

はてなスターのスターコメントを書いて送信するときに、思わず「send」ボタンを連打してしまってスタコメ通知メールを2通送信してしまう、そんな切ない事故を回避するためのGreasemonkey scriptです。idea:24108の独自対応になります。

(追記:動作確認方法を追記しました)

インストール

インストールはこちら → hatena_star_comment_block_duplication.user.js (常に最新版へのリンク)

ソースコードGitHubで見る→GitHub

動作確認方法

サーバーからのレスポンスが早いと一瞬でボタンの状態が元に戻るので、このscriptが有効になっているかどうか確認できません。

スタコメ欄を空のままで「send」をクリックするとサーバーからレスポンスが返らないようなので、ボタンがdisabledになっていることが確認できます。確認後、スタコメウィンドウを一旦閉じて開き直すと、ボタンの状態は元に戻ります。

解説

version 1.0.0のソースコードで簡単に解説してみます。と言っても、やってることはとても単純です。

// ==UserScript==
// @name           hatena_star_comment_block_duplication
// @namespace      http://www.scrapcode.net/
// @include        http://*
// @include        https://*
// @version        1.0.0
// ==/UserScript==
location.href = 'javascript:(' + (function() {
    if( typeof( Hatena ) == 'undefined' ) return;
    if( typeof( Hatena.Star ) == 'undefined' ) return;
    if( typeof( Hatena.Star.CommentScreen ) == 'undefined' ) return;

    var sendComment = Hatena.Star.CommentScreen.prototype.sendComment;
    Hatena.Star.CommentScreen.prototype.sendComment = function( e ) {
        this.submit.disabled = true;
        sendComment.call( this, e );
    };

    var receiveResult = Hatena.Star.CommentScreen.prototype.receiveResult;
    Hatena.Star.CommentScreen.prototype.receiveResult = function( args ) {
        this.submit.disabled = false;
        receiveResult.call( this, args );
    };

    var showComments = Hatena.Star.CommentScreen.prototype.showComments;
    Hatena.Star.CommentScreen.prototype.showComments = function( e, pos ) {
        if( this.submit ) this.submit.disabled = false;
        showComments.call( this, e, pos );
    };
}).toString() + ')()';

やり方が間違っていたのか、そもそも出来ないのか、unsafeWindow経由でHatena.Star.CommentScreen.prototypeにアクセス出来なかったので、unsafeWindowを使わなくても済むlocation.hrefにJavaScriptを文字列化して設定する方法にしました。

Hatena.Star.CommentScreenで置き換えた処理は3つ。

  • sendComment:sendボタンクリック時にボタンをdisabledにするため。
  • receiveResult:送信結果が返ってきた時にdisabledを解除するため。
  • showComments:送信結果が返ってこなかった時にdisabledになったままなのを回避するため。

それぞれ、元の処理を変数に保存してから新しい処理で置き換えています。

showCommentsはスタコメのウィンドウが開く時に実行されるので、もしsendボタンがdisabledになったままでも一度スタコメウィンドウを閉じて開き直せばdisabledが解除されるようになります。

更新履歴

  • 2009-04-21 version 1.0.0 初期リリース

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/khashi/20090421/1240292198