GreaseMonkey

индекс
148,13

Пишем кроссбраузерный UserJS. Пример №3: TwitPic thumbnails

Schwarzenegger: Buddy Bison and me in Washington @ Natl Park Trust event

twitpic-thumbnails.user.js добавляется на страницу твитера привью картинок с twitpic. Работает как минимум в Opera, Firefox Greasemonkey, Google Chrome и Safari GreaseKit.

// ==Userscript==
// @name      Twitpic thumbnails
// @include   http://twitter.com/*
// ==/Userscript==

(function(){

  if (typeof GM_addStyle == 'undefined') {
    /**
     * Example: GM_addStyle('* {color:red}')
     * @param {String} css
     */
    function GM_addStyle(css) {
      var head = document.getElementsByTagName('head')[0];
      if (head) {
        var style = document.createElement("style");
        style.type = "text/css";
        style.appendChild(document.createTextNode(css));
        head.appendChild(style);
      }
    }
  }

  GM_addStyle('.entry-content img {display:block; margin:.5em 0;}');

  var links = document.links;

  for (var i=0; i<links.length; i++) {
    if (links[i].href.indexOf('http://twitpic.com/') == 0 && links[i].className.indexOf('tweet-url') > -1) {
      var id = links[i].href.split("http://twitpic.com/")[1];
      links[i].innerHTML = '<img src="http://twitpic.com/show/thumb/' + id +'"/>';
    }
  }

})();


GM_addStyle добавляет на страницу CSS. Эта функция работает только в Гризиманки, как и все остальные функции с префиксом GM_. Для остальных браузеров необходимо её определить:

if (typeof GM_addStyle == 'undefined') {
  /**
   * Example: GM_addStyle('* {color:red}')
   * @param {String} css
   */
  function GM_addStyle(css) {
    var head = document.getElementsByTagName('head')[0];
    if (head) {
      var style = document.createElement("style");
      style.type = "text/css";
      style.appendChild(document.createTextNode(css));
      head.appendChild(style);
    }
  }
}


Ссылки на картинки выглядят например так: http://twitpic.com/neliw. Я проверяю начинаются ли ссылки на 'http://twitpic.com/' и имеет ли класс 'tweet-url' (если эту проверку не делать то, мы прихватим ещё и ссылки «from TwitPic»). Потом заменяю текст ссылки на привью картинки. У TwitPic есть API для этого.

for (var i=0; i<links.length; i++) {
  if (links[i].href.indexOf('http://twitpic.com/') == 0 && links[i].className.indexOf('tweet-url') > -1) {
    var id = links[i].href.split("http://twitpic.com/")[1];
    links[i].innerHTML = '<img src="http://twitpic.com/show/thumb/' + id +'"/>';
  }
}


Я даю удочку, а не рыбу. Вместо TwitPic может быть grab.by, а вместо твитов — комментарии на фрэндфиде. Рыбачте сами.
+22
1 ноября 2009, 22:45
23

комментарии (6)

+1
arty #
пара вопросов:

1) почему используется уродливое имя GM_addStyle, а не делается что-то типа var addStyle = window.GM_addStyle || function(css){…}?

2) разве какой-то из этих браузеров ещё не поддерживает querySelectorAll? цикл мог бы быть значительно проще: querySelectorAll('a.tweet-url[href^=http://twitpic.com/]')
0
ELV1S #
1) Так немного посимпатичнее, да.

2) Согласен, я просто забыл про это.
0
SowingSadness #
1) Лучше использовать уродство, т.к. в некоторых браузерах UserJS в одном NameSpace что и JS страницы
0
ELV1S #
Там же всё в анонимной функции. Я писал про это в первой части.
0
SowingSadness #
А-а… да… извиняюсь. про анонимную функцию не заметил, просто я пишу под себя, для оперы… и на некоторых сайтах я исправляю JS -))

+
Почему вы обходите IE стороной?
0
ELV1S #
Потому что UserJS в IE используют 1.5 человека. А возьни с ним предостаточно. Будет спрос, будет предложение.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.