Greasemonkeyスクリプトの質問です。

ペーストしたテキストから指定キーワードを削除するスクリプトを作りたいのですが。

トラビアンの戦闘ログを以下サイトで管理しています。

http://travian-reports.net/jp/

ゲームのページから以下のログをコピーし、

件名: aaがbbを攻撃しました
送信: 日付: 今日 時間: 05:28:15 時
攻撃者 AA 所有の村から来た aa
ファランクス ソードマン パスファインダー シューテイタス・サンダー ドルイドライダー ヘジュアン ラム トレブシェ 首領 開拓者
兵士 0 450 0 0 0 0 0 16 0 0
死傷 0 0 0 0 0 0 0 0 0 0
情報 トレブシェ 農耕地は破壊されました。
略奪資源
木0 | 粘土0 | 鉄0 | 穀物00
運搬0/20250
*文字数の問題で省略

これをペーストしても上記サイトでうまく解析してくれません。
「所有の村から来た」を「所有の」に変更するとうまくいきます。

というわけで、エディットボックスにペーストしたとき、
「村から来た」を削除するGreasemonkeyスクリプトを作りたいのです。

スクリプトのサンプル、もしくはそのものを作ってもらえませんでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/15 19:02:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント100pt

どうでしょうか。

var textarea = document.querySelector("#mainleft textarea");
if(!textarea) return;
textarea.addEventListener("keyup", editText, false);
textarea.addEventListener("mouseup", editText, false);
textarea.addEventListener("change", editText, false);

function editText(){
  this.value = this.value.replace(/所有の村から来た/g,"所有の");
}
id:drill256

回答をオープンするのが遅くなってしまい、申し訳ありませんでした。

インストールして試してみましたが、まだうまく動かせていません。

インストールの注意点など、なにかご存じのことがあれば教えていただけると嬉しいです。

"#mainleft textarea"という部分がありますが、これは#付きはidを、#なしはhtmlのタグを表しているのでしょうか?

また、スペースで区切ることにより、子要素を階層的に指定できるのでしょうか?

例えば指定ページのhtmlだと、

の外側に
がありますので、

"#maincont #mainleft textarea"と記述しても同様の結果が得られると言うことでしょうか?

また、replace(/所有の村から来た/g,"所有の");ですが、カンマの前がダブルクォーテーションではなくスラッシュで、

最後にgがついていますが、これは全ての「所有の村から来た」を置換することを指定しているのでしょうか?

以上、また質問となってしまいましたが、よろしくお願いします。

2010/02/15 09:07:20

その他の回答1件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント100pt

どうでしょうか。

var textarea = document.querySelector("#mainleft textarea");
if(!textarea) return;
textarea.addEventListener("keyup", editText, false);
textarea.addEventListener("mouseup", editText, false);
textarea.addEventListener("change", editText, false);

function editText(){
  this.value = this.value.replace(/所有の村から来た/g,"所有の");
}
id:drill256

回答をオープンするのが遅くなってしまい、申し訳ありませんでした。

インストールして試してみましたが、まだうまく動かせていません。

インストールの注意点など、なにかご存じのことがあれば教えていただけると嬉しいです。

"#mainleft textarea"という部分がありますが、これは#付きはidを、#なしはhtmlのタグを表しているのでしょうか?

また、スペースで区切ることにより、子要素を階層的に指定できるのでしょうか?

例えば指定ページのhtmlだと、

の外側に
がありますので、

"#maincont #mainleft textarea"と記述しても同様の結果が得られると言うことでしょうか?

また、replace(/所有の村から来た/g,"所有の");ですが、カンマの前がダブルクォーテーションではなくスラッシュで、

最後にgがついていますが、これは全ての「所有の村から来た」を置換することを指定しているのでしょうか?

以上、また質問となってしまいましたが、よろしくお願いします。

2010/02/15 09:07:20
id:po11 No.2

回答回数4ベストアンサー獲得回数0

id:drill256

こちらはどういう意味でしょうか?

このページ内に、なにか適切な説明が書いてあるのでしょうか?ちょっと見つけられていませんが。

今回の質問は、問題を解決したいだけでなく、GreaseMonkeyのスクリプトを勉強する目的もありました。

説明が不十分で申し訳ありません。

2010/02/15 09:00:16
  • id:Cherenkov
    右クリックで貼り付けた場合に実行されないのが気になるようでしたら
    textarea.addEventListener("mousemove", editText, false);
    も付け足した方がいいかもしれません。
    これがなくてもログを保存ボタンを押す際に
    changeイベントが発生するのでその時実行されます。
  • id:Cherenkov
    /*
    ----- まずはコメントの返信 ----
    >うまく動かせていません。
    どのような状態でしょうか。

    >インストールの注意点
    ソースに日本語の文字が含まれている場合、
    文字コードShift_JISで保存されていることがあります。
    greasemonkeyが正しく動作する文字コードUTF-8(UTF-8N)になっているかご確認下さい。

    >"#maincont #mainleft textarea"と記述しても同様の結果が得られると言うことでしょうか?
    その通りです。こちらがわかりやすいです。
    http://d.hatena.ne.jp/amachang/20080306/1204787459
    Firebugはご存じですか?Firebugコンソールを使っていろいろ試して下さい。

    >これは全ての「所有の村から来た」を置換することを指定しているのでしょうか?
    その通りです。replaceの第一引数には正規表現を使いました。文字列も可能です。
    以下に解説があります。
    https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp
    https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
    ----------------------
    */


    //----- 新たに提案するコード -----
    function editText(){
    this.value = this.value.replace(/所有の村から来た/g,"所有の");
    }
    var textarea = document.querySelector("#mainleft textarea");
    if(!textarea) return;
    textarea.addEventListener("input", editText, false);
    //---------------------


    /* ----- memo -----
    もっと効率のいい方法がありました。グリモンでの利用ならinputイベントだけで済むと思います。
    (userChrome.jsを使って中クリックペーストを拡張してる環境で中クリックペーストするとダメでしたが。)

    イベント一覧。
    http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#event-handlers-on-elements,-document-objects,-and-window-objects
    http://en.wikipedia.org/wiki/DOM_events (一部不記載あり)

    Firefox独自のイベントもあります。
    https://developer.mozilla.org/ja/Gecko-Specific_DOM_Events
    参考になるかわからないですが、下にイベント調査に使ったコードを残しておきます。


    // pasteイベント発火後setTimeoutで0秒後に置換するのを考えたけど、
    // inputイベントを使えばスマートにできました。
    textarea.addEventListener("paste", editText2, false);

    function editText2(e){
    console.log(e.type) //どのイベントが発火したのか確認できる。
    console.log(this)
    var self = this;
    setTimeout(function() {
    console.log(this); //thisはwindowになっちゃう。
    self.value = self.value.replace(/所有の村から来た/g,"所有の");
    },0);
    }
    -------------- */
  • id:drill256
    ご丁寧にありがとうございました。
    UTF-8で保存したら、きちんと動作しました。

    今後自分で作れるようにがんばります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません