Ash*_*dal 7 javascript ajax jquery greasemonkey tampermonkey
我正在为此站点(Site1)中的页面编写Greasemonkey脚本.Site1有各种交易和优惠,我的GM脚本旨在执行以下操作:
当访问Site1上的商品时,脚本会查询 Site2以查明该商店是否也列在Site2上.如果是这样,请在Site1上显示Site2的搜索结果.
问题是Site2显示进度条("加载结果"),然后显示结果.因此,我的Ajax请求总是返回空结果,看起来像这样(参见红色框部分):(
点击查看大图)
但是,它实际上应该具有Site2搜索结果的完整内容,如下所示:(
点击查看大图)
我尝试过同步Ajax请求GM_xmlhttpRequest,但无济于事.
这是Site 2的问题进度条:(
点击查看大图)
在将响应返回到Site1之前,如何让AJAX请求等待Site2上的搜索完全呈现?
作为参考,我的完整工作脚本代码位于pastebin.com.
这是相关的片段:
$(document).ready(function(){
var rewardsSiteResults = $('<div class="panel deal-panel rc-lr"></div>').attr('id', "rewardsSiteResults")
.html("<p>" + progressMessageText + "</p> ").append(spinnerGif);
$(insertSelector).after(rewardsSiteResults);
var addressMap = getAddressOfHotel();
var pinCode = addressMap[pinCodePlaceHolder];
var hotelName = addressMap[hotelNamePlaceHolder];
var queryURL = constructQueryURL(pinCode, hotelName);
$.ajaxSetup({async:true, timeout: 5000});
$.get(queryURL,null, function(response) {
if(!displayed){
displayed=true;
//rewardsSiteResults.html("adfaasddsf");
var text = $(response).find("#col2");
$(text).find("script").remove();
//console.log(text.html())
// $('<iframe id="someId"/>').appendTo('#rewardsSiteResults')
// .contents().find('body').append(response);
rewardsSiteResults.html("<div class='panel deal-panel rc-lr'>" + text.html() +"</div>");
//console.log(response);
}
},'html');
});
Run Code Online (Sandbox Code Playgroud)
Bro*_*ams 10
为了让AJAX"等待呈现页面",它实际上必须完全处理页面,获取并运行所有包含的CSS和javascript文件.这并不容易,也不推荐.幸运的是,无论如何你都不需要这样做.
以下是解决此类问题的三种更好方法:
在资源页面(mpdining.rewardsnetwork.com,对于这个问题),可能有一个API.如果是,请找到并使用它.如果它可用,这是你最好的选择.
分析资源页面的javascript和/或AJAX请求.使用GM_xmlhttpRequest()直接读取,而不是试图解析资源页面只是有效载荷数据.
有时这个过程相当简单,但有些站点需要复杂的交互和/或身份验证.
将资源页面加载到隐藏的iframe中; 将Greasemonkey脚本设置为在资源页面和母版页上运行,并使用中继所需的数据postMessage().
这种方法几乎总能奏效,但您可能必须阻止某些网页尝试"淘汰"iframe.
Greasemonkey脚本将在普通页面和iframe中的页面上运行.实际上,您可以将相同的脚本设置为在两个域和多个域上运行.
如果母版页和iframed 资源页都运行GM脚本,则脚本实例可以相互通信,跨域,使用postMessage().
例如,假设我们有一个网站,fiddle.jshell.net/9ttvF/show,包含旅游数据,我们要混搭了该网站与从匹配数据资源网站,jsbin.com/ahacab,使用AJAX获取其有效载荷数据.
目标(主站点)站点如下所示:

资源站点最初看起来像这样:

然后这样完成:

以下脚本:
// ==UserScript==
// @name _Cross-site, AJAX scrape demo
// @include http://fiddle.jshell.net/9ttvF/show/
// @include http://jsbin.com/ahacab*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
if (/fiddle\.jshell\.net/i.test (location.host) ) {
console.log ("***Master-page start...");
/*--- Inform the user.
*/
$("#plainResults").before (
'<div id="gmFetchRez">Greasemonkey is fetching results from jsbin.com...</div>'
);
/*--- Setup to process messages from the GM instance running on the iFrame:
*/
window.addEventListener ("message", receiveMessage, false);
/*--- Load the resource site in a hidden iframe.
*/
$("body").append ('<iframe src="http://jsbin.com/ahacab" id="gmIframe"></iframe>');
}
else {
console.log ("***Framed start...");
/*--- Wait for the AJAXed-in content...
*/
waitForKeyElements ("#results table.rezTable", sendResourcePageData);
}
function sendResourcePageData (jNode) {
console.log ("Results found! Sending them to the main window...");
window.top.postMessage (jNode.html(), "*");
}
function receiveMessage (event) {
if (event.origin != "http://jsbin.com") return;
$("#gmFetchRez").html (event.data);
}
//--- Use CSS to control appearances.
GM_addStyle ( " \
#gmIframe { \
display: none; \
} \
#gmFetchRez { \
background: lightYellow; \
border: 3px double red; \
padding: 1em; \
} \
" );
Run Code Online (Sandbox Code Playgroud)
最终结果如下所示,脚本已安装并运行:

| 归档时间: |
|
| 查看次数: |
3056 次 |
| 最近记录: |