Небольшая помощь с манипуляцией DOM и GreaseMonkey
Я не JS парень, так что я немного спотыкаюсь в темноте. По сути, я хотел что-то, что добавляло бы ссылку на поиск в Твиттере для @replies для конкретного пользователя на странице этого человека.
Две вещи, которые я пытаюсь выяснить:
- Как извлечь имя пользователя со страницы, чтобы я мог создать правильный URL. то есть. если я нахожусь на http://twitter.com/ev, я должен вернуть "ev".
- как манипулировать 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);
}
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 обновляет ссылки.
Вот способ сделать это, не очень проверенный (без аккаунта в твиттере).
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)
Написание 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);
}