135楼#
发布于:2014-05-29 17:33
好久了更新这脚本了……
不过好像也没什么需要更新的(之前有个大计划,但需求实在薄弱,都提不起劲做,忽略……) 现在遇到一个问题,就是自动翻页的时候不能自动更新高亮。 以前用Autopagerize,脚本提供一个事件可供跟踪,于是Ewh就通过这个事件实现了自动更新高亮。 我现在用的是这个: http://userscripts.org:8080/scripts/show/464811 这脚本没提供类似的事件,我不知道应该用什么样的方式去判断该自动更新高亮的时机了。 |
|
|
136楼#
发布于:2014-05-29 18:51
|
|
137楼#
发布于:2014-05-30 09:32
|
|
|
138楼#
发布于:2014-06-24 14:48
最近百度好像改成了AJAX方式载入了,也就是更改关键词之后搜索页面是不重载就刷新了结果的,这样的情况下Ewh无法重新载入从而无法高亮。
请教各位大神怎样才可以截获搜索结果刷新的事件呢? |
|
|
139楼#
发布于:2014-06-24 19:33
hzhbest:最近百度好像改成了AJAX方式载入了,也就是更改关键词之后搜索页面是不重载就刷新了结果的,这样的情况下Ewh无法重新载入从而无法高亮。https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events 试试监听 DOMNodeInserted、DOMNodeInsertedIntoDocument 事件? |
|
|
140楼#
发布于:2014-06-25 10:15
aaaa007cn:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_eventsDOMNodeInserted 监听成功,但是依然没法开始高亮过程,最接近的一次是看到高亮关键词发生变化后页面内容就被更新然后高亮都没了Firefox却死机了…… 页面内容更新会导致多次DOMNodeInserted事件对吧?所以会使刷新关键词的尝试重复进行…… 手动更新高亮似乎也无效(应该是脚本自身的不足……) 难道应该将事件绑定在“搜索”按钮上? |
|
|
141楼#
发布于:2014-06-25 16:41
hzhbest:DOMNodeInserted 监听成功,但是依然没法开始高亮过程,最接近的一次是看到高亮关键词发生变化后页面内容就被更新然后高亮都没了Firefox却死机了……在捕获 DOMNodeInserted 事件时直接做关键词高亮会再次触发一个 DOMNodeInserted 事件 然后可能就死循环了? 在捕获到 DOMNodeInserted 之后 先 removeEventListener 然后 setTimeout 延迟执行高亮 之后再重新 addEventListener? 或者捕获 DOMNodeInserted 之后 延迟触发一个自定义事件 EWH 监听那个事件来高亮关键字? |
|
|
142楼#
发布于:2014-06-25 16:47
|
|
|
143楼#
发布于:2014-06-30 10:18
我觉得,既然连翻页脚本都受干扰,我干脆让其强制刷新好了
// ==UserScript== // @name 百度强制刷新 // @namespace s // @include http://www.baidu.com/s* // @version 1 // @grant none // ==/UserScript== (function() { var oldurl = window.location.href; var button = document.getElementById('su'); var inputs = document.getElementById('kw'); button.addEventListener('click', go, false); inputs.addEventListener('submit', go, false); function go() { console.log(window.location.href); setTimeout( function(){ if (window.location.href != oldurl) window.location.reload(); }, 1000); } })(); |
|
|
144楼#
发布于:2014-06-30 11:41
hzhbest:我觉得,既然连翻页脚本都受干扰,我干脆让其强制刷新好了。。。。。。 怎么搞得这么复杂。 最简单的方式,设置 cookie 让百度把搜索链接改成 s?wd=。我是研究广告屏蔽大师规则时发现的, https://github.com/ywzhaiqi/userscript/blob/master/.test/RedirectBaidu.user.js。 我的 Super_preloaderPlus_one 已经加入这个设置。 document.cookie = "ISSW=1"; 像百度、Google 这种不刷新页面载入搜索结果(百度链接是 #wd=),监听 hashchange 事件可得知它什么时候变化。我写的 https://github.com/ywzhaiqi/userscript/tree/master/BaiduSearchNoJump 就尝试了各种方法,最后选定监视 #wrapper_wrapper 的方式。 |
|
145楼#
发布于:2014-06-30 15:10
hzzhaiqi:。。。。。。 怎么搞得这么复杂。如果是用“#wd=”这种形式,我捕捉hashchange就能搞掂啦,但事实是其URL的确是“s?wd=”却是不刷新页面仅刷新内容的方式,hashchange试过无效。不过从你的脚本看强制cookie的方式则可以应对这点。 |
|
|
146楼#
发布于:2014-06-30 22:24
|
|
147楼#
发布于:2014-07-01 09:34
hzzhaiqi:哪个 URL 是“s?wd=”却是不刷新页面仅刷新内容的方式?具体给出来我试试回到原帖从【www.baidu.com】进去搜索的就是。 我在装了新版 Super_preloaderPlus_one 之后百度搜索页面的确是页面刷新,就是你上面说设置cookie的效果;我禁用 Super_preloaderPlus_one 并手动将 Baidu.com 下 ISSW 项cookie删除后,再在百度搜索(甚至原有页面不刷新的情况下)就变回仅刷新内容了。 |
|
|
148楼#
发布于:2014-07-01 10:02
hzhbest:从【www.baidu.com】进去搜索的就是。刚测试了下,果然是的。现在连“s?wd=”都是不刷新页面仅刷新内容,我 6月 17 日测试的时候还不是。百度应该是使用 history.pushState 来实现的,可以监控 window.onpopstate 事件,https://developer.mozilla.org/zh-CN/docs/Web/API/Window.onpopstate。 节选百度部分代码 if ((!at && !K) || Cookie.get('ISSW') == 1) { !function () { function a0() { aR.hash && aR.hash.match(/[^a-zA-Z0-9](wd|word)=/) && aR.replace('http://www.baidu.com/s?' + aR.href.match(/#(.*)$/) [1]) } aR.hash.match(/[^a-zA-Z0-9](wd|word)=/) ? (aR.replace('http://www.baidu.com/s?' + aR.href.match(/#(.*)$/) [1]), (function () { throw new Error('redirect to sync') }) ()) : (document.getElementById('wrapper') .style.display = 'block', 'onhashchange' in window ? window.onhashchange = a0 : setInterval(a0, 200)) }(); U = ar = true } function aD(a0) { window.history.pushState(a0, '', a0.buildSyncSearchUrl()); ao(true) } window.pushStateUrl = function (a0) { window.history.pushState(null, '', a0); ao(true) }; if ((K || at) && Cookie.get('ISSW') != 1) { $(document) .delegate('a', 'mousedown', (function () { var a0 = 'http://' + aR.host; return function (a4) { var a2 = $(this); if (a2.attr('target') && a2.attr('target') != '_self') { return } var a1 = a2.attr('href'); if (a1 && a1.indexOf(a0) == 0) { a1 = a1.substring(a0.length) } if (a1) { matched = a1.match(/^\/*s\?(.*)/) } if (a1 && matched) { var a5 = aW(matched[0]); if (!a5.pn) { a5.pn = '' } if (p(['baidurt', 'baiduwb', 'baidufir', 'SE_baiduxueshu_c1gjeupa'], a5.tn) < 0) { if (at) { var a3 = ac.buildSyncSearchUrl(a5); this.onclick = (function (a6) { return function (a7) { pushStateUrl(a6); return false } }) (a3) } else { a2.attr('href', ac.buildSearchUrl(a5)) .attr('target', '_self') } af(a4) } return } } }) ()) } |
|
149楼#
发布于:2014-07-01 10:32
查了一下,history.pushState会产生popstate事件【http://www.welefen.com/use-ajax-and-pushstate.html】,但是试了下无法监听到这事件……
|
|
|