钩上谷歌页面结果加载
Hook on Google page result load
我正在编写的用户脚本的目的是在搜索时将Google按钮的顺序更改为永久按钮(以及添加讨论选项)。这是没有脚本的情况,这是有脚本的情况。
问题是我的钩子不够快,无法随意改变页面的内容。因为Google是动态加载页面的,所以它不能从头开始运行。到目前为止,我试图用一个突变观察者来修复它。
var hasChanged = false;
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
var i =0;
while(i < mutations.length && hasChanged === false){
if(mutations[i] !== undefined) {
if(mutations[i].target.getAttribute('class') === 'hdtb-mn-hd') {
changeLayout();
hasChanged = true;
}
}
i++;
}
});
observer.observe(document, {
subtree: true,
attributes: true
});
但它并不总是在正确的时刻出现,而且通常速度太慢。这个问题的一个例子可以在这个gif/html5视频中看到。当第一次搜索时,它显示了轻微的延迟。当点击讨论时,它显示钩子没有加载。刷新页面时,再次显示延迟。
链接到完整的脚本
// ==UserScript==
// @name Google Button Fixer
// @namespace googlebuttonfixer
// @match https://www.google.tld/*
// @include https://www.google.tld/*
// @exclude https://www.google.tld/maps/*
// @require http://code.jquery.com/jquery-latest.min.js
// @grant none
// @run-at document-start
// ==/UserScript==
// Prmitive settings menu. (Don't use an option twice)
// Options: web, images, maps, videos, news, books, apps, discussions
newMainLinks = ["web", "discussions", "images", "maps", "videos", "news"]
newMenu = ["books","apps"]
function changeLayout(){
var url = window.location.href;
var isPrimary = false;
if(url.indexOf("tbm=") < 0)
url += "&tbm=dsc"
else{
var urlArray = url.split("&")
for (var i = 0; i < urlArray.length; i++) {
if(urlArray[i].indexOf("tbm=dsc") >= 0)
isPrimary = true;
if(urlArray[i].indexOf("tbm=") >= 0)
urlArray[i] = "tbm=dsc";
};
url = urlArray.join("&");
}
var discussionsLink = $('<a />', {
"class": 'q qs',
"text": 'Discussions',
"href": url
})
var discussions = $('<div />', {
"class": 'hdtb_mitem'
}).append(discussionsLink);
if(isPrimary)
discussions.addClass("hdtb_msel")
$("#hdtb_msb").append(discussions);
var mainLinks = $("#hdtb_msb .hdtb_mitem").detach();
var moreMenu = $("#hdtb_more").detach();
var searchTools = $("#hdtb_tls").detach();
placeLinks(newMainLinks, $("#hdtb_msb"), mainLinks);
placeLinks(newMenu, $("#hdtb_more_mn"), mainLinks);
$("#hdtb_msb").eq(0).css("margin-left", "130px");
if(newMenu.length > 0)
moreMenu.appendTo($("#hdtb_msb"));
searchTools.appendTo($("#hdtb_msb"));
}
function placeLinks( linkArray, target, mainLinks){
i = 0;
while(linkArray.length > 0){
var href = $("a", mainLinks.eq(i)).attr("href");
var testParam = href;
if(href === undefined)
testParam = window.location.href;
if(testParam.indexOf("tbm=isch") >= 0 && linkArray[0] === "images"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("tbm=vid") >= 0 && linkArray[0] === "videos"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("tbm=nws") >= 0 && linkArray[0] === "news"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("tbm=bks") >= 0 && linkArray[0] === "books"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("tbm=dsc") >= 0 && linkArray[0] === "discussions"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("maps.google") >= 0 && linkArray[0] === "maps"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(testParam.indexOf("tbm=app") >= 0 && linkArray[0] === "apps"){
mainLinks.eq(i).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
else if(linkArray[0] === "web") {
mainLinks.eq(0).appendTo(target);
linkArray.splice(0, 1);
i = 0;
}
i++;
}
}
//do not run in frames or iframes
if(window.top == window.self) {
MutationObserver = window.MutationObserver || window.WebKitMutationObserver
if(MutationObserver) {
var observerAll = new MutationObserver(function(mutations) {
//#hdtb_msb is the container of all buttons
if($('#hdtb_msb').length) {
observerAll.disconnect();
changeLayout();
}
});
//wait until #hdtb_msb exists
observerAll.observe(document, {
attributes: true,
subtree: true
});
}
}
相关文章:
- 在web应用程序中的新搜索中重新加载搜索结果(不带jQuery)
- 使用php脚本验证访问者的年龄,并在不刷新的情况下根据结果加载iframe
- 在safari和chrome中,js图像加载产生了奇怪的结果
- 清除网格中的存储和加载搜索结果
- 使用 AJAX 在页面加载时自动提交表单并获得 html 类型结果
- 无需重新加载即可播放MySQL结果.AJAX 正在失败
- ajax在页面刷新之前不会加载新的sql结果
- 使用Javascript从DB中筛选结果,这将使DIV重新加载它'基于新参数的内容
- Javascript 不工作,结果打印后浏览器仍在加载
- 将javascript函数的结果调用到Jquery css事件中,加载和调整大小
- 从 JSON(db 查询结果)加载大型 javascript 数组而不会使页面崩溃
- 从 JSON 文件加载后立即使用数据结果
- 加载相同的结果返回按钮
- 从 Webix 中结果对象的属性加载数据
- 文件读取器加载与结果和参数
- 从两个选择列表中选择 A + B 时,#Anchor 加载结果页面
- 使用AJAX加载XML,但没有显示结果
- 如何优化jquery选择的插件加载超过5万个结果
- 使用javascript读取csv-txt文件并将结果加载到数组中
- 钩上谷歌页面结果加载