【发布时间】:2020-07-01 04:30:57
【问题描述】:
问题的一些背景: Reverse Engineering the DOM, Javascript events & "what's going on"?
我正在写一些东西,它会在实时搜索中“播放”谷歌页面预览的功能。本质上,我想为 keyup 事件添加一个事件监听器,它将
- 查询页面预览结果(向google发送ajax请求)
- 读取结果在内存中
- 将其实时添加到您的搜索页面
这实际上将创建一个实时页面预览搜索结果,就像谷歌一样。
公平地说,我实际上已经在各种组件中完成了大约 95% 的工作,并且我正处于调整功能以使其更加用户友好的阶段。如果您对我正在做的事情的原因和方式感兴趣,请随时查看我以前的博客文章http://chesser.ca,或者甚至查看http://chesser.ca/gvs.marklet.0.3.js 的“代码的最新版本”(目前非常麻烦,因为我现在有点“介于功能之间”。
您的浏览器的书签代码在这里:
javascript:(function{var head= document.getElementsByTagName('head')[0];var script= document.createElement('script');script.type= 'text/javascript';script.src= 'http://chesser.ca/gvs.marklet.0.3.js';head.appendChild(script);};)();
(keyup 事件侦听器当前设置为关闭,本质上是为了使其在当前状态下工作,您在具有实时预览的页面上运行搜索并单击一次小书签(以启动查询),等待一两秒钟,然后再次单击它(显示页面预览)
所以我要对此进行一些更改:
在第 1 部分(针对性能)中,我只对查询前两个元素感兴趣。我想这很容易,唯一阻止我的是我还没有尝试过(而不是所有 divs.length,只需将其设置为 2)
function query_current_pages(){
var all_divs = document.getElementsByTagName('div');
for (i=0;i < all_divs.length; i++) {
if (all_divs[i].className == 'vsc') {
google.vs.ea(all_divs[i]);
}
}
}
下一个问题(也是我不确定的问题)是如何设置事件侦听器并修改 add_previews 函数,以便在请求返回时添加预览,而不是火腿- 循环遍历 google.vs.ha 内存空间中的所有内容的方法,我想创建一些东西来监听那里的数据,然后开始行动。
我尝试这样做的原因是因为我认为它真的很整洁。那是我在编写代码的过程中学到了很多关于编码的东西。
对于那些对页面预览如何“卡在页面上”感兴趣的人,这里是循环遍历内存中所有图像并将它们放置起来的函数。
function add_previews(){
c=document.getElementById('ires');
nli=document.createElement('div');
cell = 0;
for(var Obj in google.vs.ha){
na=document.createElement('a');
na.href=Obj;
nd=document.createElement('div');
cldiv=document.createElement('div');
cldiv.style.clear = 'both';
nd.style.width=google.vs.ha[Obj].data.dim[0]+'px';
nd.style.height=google.vs.ha[Obj].data.dim[1]+'px';
nd.style.margin = '5px';
nd.style.padding = '5px';
nd.style.cssFloat = 'left';
nd.style.border = '1px solid #999999';
if (google.vs.ha[Obj].data.tbts.length) {
nilDiv = document.createElement('div');
for(i = 0; i < google.vs.ha[Obj].data.tbts.length; i++){
box = google.vs.ha[Obj].data.tbts[i].box;
newbox = document.createElement('div');
newbox.className = 'vsb vsbb';
newbox.style.position = 'relative';
newbox.style.top = (box.t)+'px';
newbox.style.left = box.l+'px';
newbox.style.height = box.h+'px';
newbox.style.width = box.w+'px';
nilDiv.appendChild(newbox);
newtext = document.createElement('div');
newtext.className = 'vsb vstb';
newtext.innerHTML = google.vs.ha[Obj].data.tbts[i].txt;
newtext.style.top = (box.t)+'px';
newtext.style.position = 'relative';
nilDiv.appendChild(newtext);
}
nilDiv.style.height = '0px';
nd.appendChild(nilDiv);
}
for(i = 0; i < google.vs.ha[Obj].data.ssegs.length; i++){
ni=document.createElement('img');
ni.src += google.vs.ha[Obj].data.ssegs[i];
ni.className+=' vsi';
na.appendChild(ni);
}
nd.appendChild(na);
nli.appendChild(nd);
};
c.insertBefore(nli,c.firstChild);
}
其中明显需要更改的一点(使用事件侦听器)是将for(var Obj in google.vs.ha){ 修复为传入的单个google.vs.rs 对象。
如果您一直坚持到这个问题:感谢阅读 :) - 亚历克斯
编辑
根据下面的讨论,google.vs.Ga 似乎负责查询数据(答案是覆盖函数)
为了提供信息(和乐趣),这里是 .Ga 代码。
google.vs.Ga = function (a, b, c) {
var d = google.vs.b.kfe.kfeHost,
g = google.vs.Ya(a),
i = a.getAttribute("sig");
if (i) {
var f = google.vs.qa(a);
if (f) {
d = [d ? "http://" + d : "", google.vs.b.kfe.kfeUrlPrefix, "&d=", encodeURIComponent(f), "&b=1", "&jsonp=google.vs.r"];
d.push("&a=");
d.push(encodeURIComponent(i));
if (i = a.getAttribute("blobref")) {
d.push("&bl=");
d.push(i)
}
d.push("&rs=");
i = 0;
for (var j; j = g[i++];) {
d.push(encodeURIComponent(j));
i < g.length && d.push("&rs=")
}
g = google.vs.m(a) || {
ub: a
};
g.G = c;
google.vs.ha[f] = g;
c = d.join("");
c = new google.vs.Ia(f, c, function () {
google.vs.P(a, h);
o(google.vs.k, f)
});
b ? p(google.vs.k, c) : q(google.vs.k, c)
}
}
};
【问题讨论】:
-
我有点困惑——数据更新时事件会调用什么函数?
-
您是否尝试确定预览图像何时可用,并触发您正在寻找的事件?
-
@matt - 是的 - 试图找出图像何时可用并在那时触发。
标签: javascript listener dom-events