Changeset 20868

Show
Ignore:
Timestamp:
10/07/08 01:51:01 (2 months ago)
Author:
syttru
Message:

lang/javascript/userscripts/hatena.bookmark.comment-for-comment.user.js 画面遷移せずにコメント打てるようにしました。

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/userscripts/hatena.bookmark.comment-for-comment.user.js

    r18152 r20868  
    44// @description    はてなブックマークのコメントひとつひとつに対してブックマークボタンを表示する。ブコメにブコメをつけられるようにするぐりもん。 
    55// @include        http://b.hatena.ne.jp/entry/* 
    6 // @version        0.1 
     6// @version        0.2 
    77// ==/UserScript== 
    88 
    99(function(){ 
     10 
     11var w = window.wrappedJSObject || window; 
    1012 
    1113// ブックマーク対象のURLを取得 (#entrylink_url) 
     
    3032  var bookmark_url = 'http://b.hatena.ne.jp/' + id + '/?url=' + entry_url; 
    3133   
    32   // 「ブックマークに追加」ボタンをつける 
    33   var bookmarkEntry = createBookmarkEntry( bookmark_url ); 
    34   bookmark_user.appendChild( bookmarkEntry ); 
     34  // 「コメントする」ボタンをつける 
     35  var response = createResponse( id, bookmark_url ); 
     36  bookmark_user.appendChild( response ); 
    3537   
    3638  // ブックマーク数を表示する 
     
    4042 
    4143 
    42 // 配列の各要素に対して関数を実行する関数 
    43 function each( array, f ) { 
    44   for( var i=0; i<array.length; i++ ) { 
    45     f( array[i] ); 
    46   } 
     44// ブックマーク数を表示する画像を作成する関数 
     45function createBookmarkCount( url ) { 
     46  var img = createElement( 'img', { src: 'http://b.hatena.ne.jp/entry/image/' + url } ); 
     47  var a   = createElement( 'a'  , { href: 'http://b.hatena.ne.jp/entry/' + url } ); 
     48  a.appendChild( img ); 
     49  return a; 
    4750} 
    4851 
     52 
     53// 「ブックマークに追加する」ボタンを作成する関数 
     54function createBookmarkEntry( url ) { 
     55  var img = createElement( 'img', { src: 'http://d.hatena.ne.jp/images/b_entry.gif' }, { border: 'none' } ); 
     56  var a   = createElement( 'a'  , { href: 'http://b.hatena.ne.jp/append?' + url } ); 
     57  a.appendChild( img ); 
     58  return a; 
     59} 
     60 
     61// 「レスする」ボタンを作成する関数 
     62function createResponse( id, url ) { 
     63  var img = createElement( 'img', { src: 'http://d.hatena.ne.jp/images/b_entry.gif' }, { cursor: 'pointer' } ); 
     64  observe( img, 'click', function(){ 
     65    var form_id = 'comment-form-' + id; 
     66    // 開いてたら閉じる 
     67    if( $(form_id) != null) { 
     68      this.parentNode.removeChild( $(form_id) ); 
     69      return; 
     70    } 
     71    // 開いてなかったら開く 
     72    var form = createElement( 'form', { id: form_id, action: 'http://b.hatena.ne.jp/add', method: 'post' } ); 
     73    var comment = createElement( 'input', { type: 'text', name: 'comment', size: '50' } ); 
     74    form.appendChild( comment ); 
     75    form.appendChild( createHidden( 'mode', 'enter' ) ); 
     76    form.appendChild( createHidden( 'url' , url ) ); 
     77    form.appendChild( createHidden( 'rkm', w.Hatena.rkm ) ); 
     78    var title = document.title.replace(/^はてなブックマーク/, 'ブコメレス to ' + id ); 
     79    form.appendChild( createHidden( 'title', title ) ); 
     80    var submit = createElement( 'input', { type: 'submit', value: 'レスする' } ); 
     81    form.appendChild( submit ); 
     82    this.parentNode.appendChild( form ); 
     83  }); 
     84  return img; 
     85} 
    4986 
    5087// エレメントの子供達の中から条件に該当するものを配列で返す関数 
     
    72109 
    73110 
    74 // ブックマーク数を表示する画像を作成する関数 
    75 function createBookmarkCount( url ) { 
    76   var img = document.createElement( 'img' ); 
    77   img.setAttribute( 'src', 'http://b.hatena.ne.jp/entry/image/' + url ); 
    78   var a = document.createElement( 'a' ); 
    79   a.setAttribute( 'href', 'http://b.hatena.ne.jp/entry/' + url ); 
    80   a.appendChild( img ); 
    81   return a; 
     111// エレメント作る 
     112function createElement( tagName, attrs, styles ) { 
     113  var elem = document.createElement( tagName ); 
     114  attrs = attrs || {}; 
     115  styles = styles || {}; 
     116  for( var key in attrs ) { 
     117    elem.setAttribute( key, attrs[key] ); 
     118  } 
     119  for( var key in styles ) { 
     120    elem.style[key] = styles[key]; 
     121  } 
     122  return elem; 
    82123} 
    83124 
     125// ヒドン作る 
     126function createHidden( name, value ) { 
     127  return createElement( 'input', { type: 'hidden', name: name, value: value } ); 
     128} 
    84129 
    85 // 「ブックマークに追加する」ボタンを作成する関数 
    86 function createBookmarkEntry( url ) { 
    87   var img = document.createElement( 'img' ); 
    88   img.setAttribute( 'src', 'http://d.hatena.ne.jp/images/b_entry.gif' ); 
    89   img.setAttribute( 'width', 16 ); 
    90   img.setAttribute( 'height', 12 ); 
    91   img.setAttribute( 'style', "border: none;" ); 
    92   var a = document.createElement( 'a' ); 
    93   a.setAttribute( 'href', 'http://b.hatena.ne.jp/append?' + url ); 
    94   a.appendChild( img ); 
    95   return a; 
     130// 配列の各要素に対して関数を実行する関数 
     131function each( array, f ) { 
     132  for( var i=0; i<array.length; i++ ) { 
     133    f( array[i] ); 
     134  } 
     135} 
     136 
     137function $( id ){ return document.getElementById( id ); } 
     138function observe(target, type, listener) { 
     139  if   (target.addEventListener) target.addEventListener(type, listener, false); 
     140  else target.attachEvent('on' + type, function() { listener.call(target, window.event); }); 
    96141} 
    97142 
    98143})(); 
    99