@os0x作の『はてなスターに連射ボタンをつけるBookmarklet』がはてなスター側の仕様変更で動作しなくなっているようなので修正してみた。
FireFoxであれば、↑のリンクをリンクバー等にD&Dすれば登録できます。
なお↑のリンクを直接クリックしていただければ、このページ内で試すことができます。
動作テストはFireFoxでしか行っていません。
IEでは動かないけど、mattnさんがIEでも動くようにしてくれまスター
修正内容については以下。
以前のはてなスター連打Bookmarklet(以下はて連)を使うとエラーが返る。
pos has no properties
[Break on this error] pos.x -= 10;
これは、はてなスター+ボタンクリック時に仮の☆を表示されて、通信成功時に名前の表示される☆が生成しなおされる辺りの仕様変更により発生したものらしい。
内部の動作を追ってみると、
クリックされる → 仮の星を生成する → クリックされたeventの発生位置を記憶 → 選択範囲を取得による引用部分の取得 → URLの生成 → JSONPメソッドの呼び出し
サーバー側で処理される。
JSONPによるreceiveResultの呼び出し → 仮の星を削除 → 通信が成功している場合新しい星を生成する
といった感じ
(エラー処理やらURL生成のめんどくさい所は省略
はて連が動かなくなる前はこの仮の星を生成する処理が無かったため、eventの発生位置を覚える等の処理は無かった。
しかし、仕様変更によりクリックしたeventの位置が意味を持ったために、はて連で追加したボタンから星の追加を行う処理だと位置が取得できなくてこける。
といった感じみたい。
とりあえずcreateEventの後でclientXとclientYに値を入れておくことで対処できる。。。と思ったら
readonly attribute long clientX;
readonly attribute long clientY;
DOMの定義だとこの辺は書き換え不可能っぽい('A`)
なんとか設定できんかと思ったらMouseEvents用にinitMouseEventsというメソッドがあった。
引数でclientXとclientYもあるようなので、そこに適当な値を突っ込んだ。
。。。動いたヽ|'◇'|ノ
そもそもコレ、ログインしてなかった時とかにエラーメッセージ表示する場所を記憶するためのものなので、成功時にはつかわないんですけどね( ´-`)
基本に成功時が多いんだから、前回positionの取得とずらしはエラー処理以降に含めて欲しいものですが。。。
ついでに、現状だとstop後に反応が無いので、連射に戻すようにも改造してみた。
とりあえず完成。
いちおうインデント付きソースが以下です。
javascript:(function(){
var SPEED=2000;
var d=document;
function r(b,m){
b.onclick=function(){
var t=setInterval(function(){
var e =d.createEvent("MouseEvents");
e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,m);
m.dispatchEvent(e);
},SPEED);
b.innerHTML='[STOP!]';
b.onclick=function(){
clearInterval(t);
b.innerHTML='[連射!]';
r(b,m);
}
}
}
var im=d.images;
for(var i=0,l=im.length;i<l;i++){
var m=im[i];
if(m.className=='hatena-star-add-button'){
var b=m.parentNode.appendChild(d.createElement('b'));
b.innerHTML='[&#36899;&#23556;!]';
r(b,m);
}
}
})();
bookmarklet自体の利用は↑の方のリンクからD&Dするか以下を手動登録で。
javascript:(function(){var SPEED=2000;var d=document;function r(b,m){b.onclick=function(){var t=setInterval(function(){var e =d.createEvent("MouseEvents");e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,m);m.dispatchEvent(e);},SPEED);b.innerHTML='[STOP!]';b.onclick=function(){clearInterval(t);b.innerHTML='[連射!]';r(b,m);}}}var im=d.images;for(var i=0,l=im.length;i<l;i++){var m=im[i];if(m.className=='hatena-star-add-button'){var b=m.parentNode.appendChild(d.createElement('b'));b.innerHTML='[連射!]';r(b,m);}}})();
何千だとか何万とか65536だとかどこまでも連射するつもりなら星が表示されるべきではないし、他にもっと便利な方法もあるようだけど、まぁそれは誰か実際にやった人が書くんじゃないですかね( ´-`)
書くべきではない気もする( ´-`)
○参考
・はてなスターに連射ボタンをつけるBookmarklet - 0x集積蔵
・Interface MouseEvent
コメントする