得益于Hellion的帮助!
以下是代码:
// ==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);
}
答案 0 :(得分:0)
正如它所写,是的,你受到GM_xmlhttpRequest()
调用的异步性质的影响。循环将触发并开始获取所有pageTitle值,但会立即继续,而不是等待请求完成,因此当您使用它时,pageTitle(顺便说一句,您没有在任何地方声明) textNode。
纠正这种情况需要采取的第一步是将当前GM_xmlhttpRequest()
调用之后的所有内容移到onload: function()
定义的内部。然后,只有在检索到每个页面后,您才会继续修改链接。 (可能还有其他问题需要传递或重新获取thislink
值,我不确定。)
答案 1 :(得分:0)
您可以将以下3行更改为仅1行:
// 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, '');
pageTitle = $('h1', response.response).text();