Javascript для анализа страницы комментариев Reddit для имен пользователей

Я работаю над букмарклетом для Sub reddit и пытаюсь получить все имена пользователей на странице комментариев, чтобы я мог их проанализировать, а затем вернуться и обновить информацию рядом с ними, аналогично тому, что делает RES. У автора каждого комментария есть класс с префиксом Author, но в конце имени класса есть разные вещи. Как мне захватить все имена пользователей?

Затем, когда у меня есть список, как мне обновить каждый из них дополнительным значком?

Любые предложения/учебники, которые делают подобные вещи, были бы замечательными.

Редактировать: я не совсем уверен, какие части разметки были бы полезны, не давая огромный блок. Вот тот же вопрос, который я задал в сабреддите Javascript. http://www.reddit.com/r/javascript/comments/yhp7j/best_way_to_find_all_the_usernames_on_a_reddit/

Вы должны иметь возможность проверять элементы имени и видеть, с чем я работаю.

В настоящее время работает с этим: http://net.tutsplus.com/tutorials/javascript-ajax/create-bookmarklets-the-right-way/

Итак, у меня есть работающий букмарклет Hello World Style, который проверяет Jquery и загружает его, если он отсутствует, и просто выдает предупреждение.


person DiscontentDisciple    schedule 19.08.2012    source источник
comment
Можете ли вы показать пример разметки, содержащей имена авторов (для тех из нас, включая меня, кто никогда не посещал Reddit и не проверял источник)? Как далеко вы продвинулись с букмарклетом? Есть ли у вас в настоящее время какой-либо рабочий код?   -  person David says reinstate Monica    schedule 20.08.2012
comment
@DavidThomas Добавил еще немного информации. Не уверен, насколько полезная будет разметка, поэтому связался с веткой комментариев, чтобы вы могли ее проверить. Спасибо за помощь!   -  person DiscontentDisciple    schedule 20.08.2012


Ответы (1)


При беглом взгляде на страницу, на которую вы ссылались в своем вопросе, кажется, что разметка вокруг имен пользователей выглядит следующим образом (предположительно, с использованием вашего имени пользователя в качестве примера):

<a href="http://www.reddit.com/user/DiscontentDisciple" class="author id-t2_4allq" >DiscontentDisciple</a>

Если это так, и библиотека jQuery доступна (опять же, из вашего вопроса), один из подходов состоит в том, чтобы просто использовать:

var authors = [];

$('a.author').html(
    function(i, h) {
        var authorName = $(this).text();
        if ($.inArray(authorName, authors) == -1) {
            authors.push(authorName); // an array of author-names
        }
        return '<img src="path/to/' + encodeURIComponent(authorName) + '-image.png" / >' + h;
    });

console.log(authors);

Проверка концепции JS Fiddle.

Или, аналогичным образом, просто используйте тот факт, что имя пользователя предсказуемо является последней частью URL-адреса в атрибуте href элемента a:

var authors = [];

$('a.author').html(
    function(i, h) {
        var authorName = this.href.split('/').pop();
        if ($.inArray(authorName, authors) == -1) {
            authors.push(authorName);
        }
        return '<img src="http://www.example.com/path/to/' + authorName+ '-image.png" />' + h;
    });

console.log(authors);

Проверка концепции JS Fiddle.

Оба этих подхода помещают img внутри элемента a. Если вы хотите, чтобы это было перед элементом a, просто используйте:

// creates an 'authors' variable, and sets it to be an array.
var authors = [];

$('a.author').each( // iterates through each element returned by the selector
    function() {
        var that = this, // caches the this variable, rather than re-examining the DOM.
            // takes the href of the current element, splits it on the '/' characters,
            // and returns the *last* of the elements from the array formed by split()
            authorName = that.href.split('/').pop();

        // looks to see if the current authorName is in the authors array, if it *isn't*
        // the $.inArray returns -1 (like indexOf())
        if ($.inArray(authorName, authors) == -1) {
            // if authorName not already in the array it's added to the array using
            // push()
            authors.push(authorName);
        }

        // creates an image element, concatenates the authorName variable into the
        // src attribute-value
        $('<img src="http://www.example.com/path/to/' + authorName+ '-image.png" />')
            // inserts the image before the current (though converted to a jQuery
            // object in order to use insertBefore()
            .insertBefore($(that));
    });

console.log(authors);
​

Проверка концепции JS Fiddle.

Использованная литература:

person David says reinstate Monica    schedule 19.08.2012
comment
Ух ты. Крутой мужик! Я использую последний. Не могли бы вы объяснить мне, как именно это работает, у меня не хватает навыков JS? - person DiscontentDisciple; 20.08.2012
comment
На самом деле, только что обнаружил проблему с этим - моды на боковой панели также помечены как авторы, даже если они не прокомментировали. Не конец света, а неловкое поведение, которого было бы неплохо по возможности избежать. Любые идеи? - person DiscontentDisciple; 20.08.2012
comment
Также доступен канал JSON, но запрашивать страницу во второй раз кажется странным. если вы добавите .json в конец URL-адреса страницы, вы получите его в формате JSON. Так что это легко разобрать, но кажется странной идеей с точки зрения ресурсов. - person DiscontentDisciple; 20.08.2012
comment
Обновлен ответ с некоторыми пояснительными примечаниями о том, как работает окончательный кодовый блок. Чтобы решить проблему с модами на боковой панели, просто измените исходный селектор jQuery, чтобы он нацеливался только на те элементы a в содержимом (например, $('#mainContent a')..., используя пример на основе id). - person David says reinstate Monica; 20.08.2012