Небольшая помощь с DOM манипулом и GreaseMonkey

Я не JS парень, так что я немного спотыкаюсь в темноте. По сути, я хотел что-то, что добавило бы ссылку на поиск в Твиттере для @replies для конкретного пользователя на странице этого человека.

Две вещи, которые я пытаюсь выяснить:

  1. Как извлечь имя пользователя со страницы, чтобы я мог создать правильный URL. то есть. если я нахожусь на http://twitter.com/ev , я должен вернуть "ev".
  2. как манипулировать DOM, чтобы вставить вещи в нужном месте

Вот фрагмент HTML, на который я нацеливаюсь:

<ul id="tabMenu">
  <li>
    <a href="/ev" id="updates_tab">Updates</a>  </li>
  <li>
    <a href="/ev/favourites" id="favorites_tab">Favorites</a>  </li>
  </ul>

И вот сценарий (пока):

// ==UserScript==
// @name         Twitter Replies Search
// @namespace    http://jauderho.com/
// @description  Find all the replies for a particular user
// @include      http://twitter.com/*
// @include      https://twitter.com/*
// @exclude      http://twitter.com/home
// @exclude      https://twitter.com/home
// @author       Jauder Ho
// ==/UserScript==

var menuNode = document.getElementById('tabMenu');
if (typeof(menuNode) != "undefined" && menuNode != null)
{
    var html = [];
    html[html.length] = '<li>';
    html[html.length] = '<a href="http://search.twitter.com/search?q=to:ev" class="section-links" id="replies_search_tab">@Replies Search</a>';
    html[html.length] = '</li>';

    // this is obviously wrong
        var div = document.createElement('div');
    div.className = 'section last';
    div.innerHTML = html.join('');
    followingNode = menuNode.parentNode;
    followingNode.parentNode.insertBefore(div, followingNode);
}
13.12.2008 09:10:53
3 ОТВЕТА
РЕШЕНИЕ

Вот метод чистого DOM, описанный выше - и для ударов я также играл с извлечением имени пользователя:

var menuNode = document.getElementById('tabMenu');
if (menuNode!=null)
{
    // extract username from URL; matches /ev and /ev/favourites
    var username = document.location.pathname.split("/")[1];

    // create the link
    var link = document.createElement('a');
    link.setAttribute('href', 'http://search.twitter.com/search?q=to:'+username);
    link.setAttribute('id', 'replies_search_tab');
    link.appendChild(document.createTextNode('@Replies Search'));

    // create the list element
    var li = document.createElement('li');

    // add link to the proper location
    li.appendChild(link);
    menuNode.appendChild(li);    
}

Это эквивалентно (на основе исходного фрагмента кода):

  <ul id="tabMenu">
  <li>
    <a href="/ev" id="updates_tab">Updates</a>  </li>
  <li>
    <a href="/ev/favourites" id="favorites_tab">Favorites</a>  </li>
  <li>
    <a href="http://search.twitter.com/search?q=to:ev" id="replies_search_tab">@Replies Search</a></li>
  </ul>

Если вы хотите, чтобы добавленная ссылка отображалась в другом месте, вам нужно немного поработать insertBefore.

PS. Взял на себя смелость игнорировать класс «section-links», так как это форматирование для x следующих, y последователей, z обновляет ссылки.

2
13.12.2008 13:00:09

Вот способ сделать это, не очень проверенный (без аккаунта в твиттере).

var userName = window.location.href.match(/^http:\/\/twitter\.com\/(\w+)/)
if (userName == null)
  return; // Problem?
userName = userName[1];
var menuNode = document.getElementById('tabMenu');
if (menuNode != null)
{
  var html = '<a href="http://search.twitter.com/search?q=to:' +
      userName +
      '" class="section-links" id="replies_search_tab">@Replies Search</a>';

  var li = document.createElement('li');
  li.className = 'section last';
  li.innerHTML = html;
  menuNode.appendChild(li);
}

Это добавляет li в конец, и я удалил div, потому что сомневаюсь, что правильно ставить li в div. Если вам действительно нужно поставить li в начале ul, попробуйтеmenuNode.insertBefore(li, menuNode.firstChild)

1
13.12.2008 09:35:28

Написание JavaScript без библиотеки - ад, к которому я никогда не смогу вернуться.

Вот скелет скрипта, который включает jQuery:

// ==UserScript==
// @name           MyScript
// @namespace      http://example.com
// @description    Example
// @include        *
//
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js
// ==/UserScript==

var menuNode = $('#tabMenu');
if (menuNode!=null)
{
    // extract username from URL; matches /ev and /ev/favourites
    var username = document.location.pathname.split("/")[1];

    // create the link
    var link = $('<a id="replies_search_tab">@Replies Search</a>');
    link.href = 'http://search.twitter.com/search?q=to:'+username;

    // create the list element
    var li = $('<li />');

    // add link to the proper location
    li.append(link);
    menuNode.append(li);    
}
1
4.03.2009 08:25:44