Получить несколько внешних URL-адресов с помощью GM_xmlhttpRequest, добавить страницу <H1> к ссылкам? - PullRequest
2 голосов
/ 14 июня 2011

РЕШЕНО благодаря помощи Геллиона!

Вот код:

// ==UserScript==
// @name          Facebook Comment Moderation Links
// @description   Appends story titles to Facebook Comment Moderation "Visit Website" links
// @include       http*://developers.facebook.com/tools/*
// ==/UserScript==

var allLinks, thisLink, expr, pageTitle, myURL, myPage, pageContent, title;

// grabbing URLs
function fetchPage(myPage, targetLink) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: myPage,
            onload: function(response){

                // get the HTML content of the page
                pageContent = response.responseText;

                // use regex to extract its h1 tag
                pageTitle = pageContent.match(/<h1.*?>(.*?)<\/h1>/g)[0];

                // strip html tags from the result
                pageTitle = pageTitle.replace(/<.*?>/g, '');

                // append headline to Visit Website link
                title = document.createElement('div');
                title.style.backgroundColor = "yellow";
                title.style.color = "#000";
                title.appendChild(document.createTextNode(pageTitle));
                targetLink.parentNode.insertBefore(title, targetLink.nextSibling);  

            }
        }); 
}


function processLinks() {

    // define which links to look for
    expr = "//a[contains (string(), 'Visit Website')]";
    allLinks = document.evaluate(
        expr,
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    // loop through the links
    for (var i = 0; i < allLinks.snapshotLength; i++) {
        thisLink = allLinks.snapshotItem(i);    
        myURL = thisLink.getAttribute('href');

        // follow Visit Website link and attach corresponding headline
        fetchPage(myURL, thisLink);
    }
}

// get the ball rolling
processLinks();

--- НИЖЕ РАННЕЕ ВЕРХНИЙ ---

Я пытаюсь сделатьСкрипт Greasemonkey, который извлекает URL-адрес из каждого набора ссылок и добавляет содержимое тега h1 страницы в конец ссылки.

До сих пор я мог получить его для отображения самого URL-адреса, который нене требует запроса страницы, но не содержимого тега h1 страницы, что и требуется.

Из других вопросов на этом сайте я понимаю, что GM_xmlhttpRequest является асинхронным, и я почти уверен, что это как минимум часть причины.Однако я не могу найти решение этой конкретной проблемы.

Ниже приведен код, который я имею до сих пор.Он предназначен для инструмента модерации комментариев на веб-сайте Facebook - в представлении модератора каждый комментарий имеет ссылку «Посетить веб-сайт», которая ведет вас к статье, к которой относится комментарий.

Как написано прямо сейчас,он добавит код состояния HTTP, а не заголовок страницы, а затем URL-адрес каждой ссылки «Посетить веб-сайт».Часть кода состояния является просто заполнителем.Я планирую добавить разбор HTML и т. Д., Чтобы позже получить тег h1.

Сейчас я просто пытаюсь получить запрос GM_xmlhttpRequest и вставку содержимого.

Любая помощьРазберитесь в этом с благодарностью.Спасибо!

var allLinks, thisLink, expr, pageTitle, myURL, pageContent, title;

// define which links to process
    expr = "//a[contains (string(), 'Visit Website')]";
    allLinks = document.evaluate(
        expr,
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

// cycle through links
for (var i = 0; i < allLinks.snapshotLength; i++) {

    thisLink = allLinks.snapshotItem(i);    
    myURL = thisLink.getAttribute('href');

    GM_xmlhttpRequest({
        method: 'GET',
        url: myURL,
        onload: function(responseDetails){

            pageTitle = responseDetails.status;

        }
    });

    // append info to end of each link 
    title = document.createElement('div');
    title.style.backgroundColor = "yellow";
    title.style.color = "#000";
    title.appendChild(document.createTextNode(
        ' [' + pageTitle + ' - ' + thisLink.getAttribute('href') + ']'));
    thisLink.parentNode.insertBefore(title, thisLink.nextSibling);  

}

1 Ответ

0 голосов
/ 15 июня 2011

Как написано, да, вы страдаете от асинхронного характера вызова GM_xmlhttpRequest().Цикл сработает и начнет извлекать все значения pageTitle, но сразу же продолжит работу, не дожидаясь завершения запросов, и поэтому pageTitle (который, кстати, нигде не был объявлен) равен нулю, когда вы используетеthe textNode.

Первый шаг, который необходимо сделать, чтобы исправить ситуацию, - это переместить весь материал, который в настоящее время следует за вызовом GM_xmlhttpRequest(), внутрь определения onload: function().Затем, только после того, как каждая страница будет извлечена, вы продолжите изменять свои ссылки.(Могут быть и другие проблемы с необходимостью ввода или повторного получения значения thislink, я не уверен.)

...