这个简单的代码在Facebook页面上不起作用。此代码仅在刷新页面时发出警报。如果我用鼠标从Facebook个人资料转到该页面;脚本停止工作。
没有警报或错误。:( 好像整个脚本在我刷新后才起作用。
// ==UserScript== // @name Purge My Facebook // @namespace http://www.arda.com // @description test // @include https://*.facebook.com* // @include http://*.facebook.com* // @version 1 // ==/UserScript== window.setTimeout (isParent, 500); function isParent () { if (window.self == window.top) { alert ("main window"); } else window.setTimeout (isParent, 500); }
除其他外,我还尝试了以下方法:
// ==UserScript== // @name Purge My Facebook // @namespace http://www.arda.com // @description test // @include http://www.facebook.com/*/allactivity* // @include https://www.facebook.com/*/allactivity* // @version 1 // ==/UserScript== try{ if (window.self == window.top) alert(document.domain+"\nmain window"); else alert(document.domain+"\nin a iframe"); } catch(e){ alert(document.domain+"\nHad a problem:\n"+e); }
问题是一个AJAX。当您键入URL或刷新页面时,脚本将起作用。当您单击“活动日志”按钮时,脚本不会。iframe不是您报告的症状的因素。
这是因为单击该链接将永远不会加载新页面。它会触发替换部分内容的AJAX调用,使其 看起来 像一个新页面,但事实并非如此。
就Facebook而言,通常唯一更改的是所报告的URL(但不会触发hashchange!)和#mainContainerdiv 的内容。
#mainContainer
您还必须@include所有FB页面,因为类似https://www.facebook.com/*/allactivity*的页面通常只能通过AJAX到达,因此您的脚本需要 在前 一页上运行。
@include
https://www.facebook.com/*/allactivity*
该脚本将解决您的问题中提出的问题:
// ==UserScript== // @name Purge My Facebook // @namespace http://www.ardaterekeci.com // @description test // @include http://www.facebook.com/* // @include https://www.facebook.com/* // @version 1 // ==/UserScript== var pageURLCheckTimer = setInterval ( function () { if ( this.lastPathStr !== location.pathname || this.lastQueryStr !== location.search || this.lastPathStr === null || this.lastQueryStr === null ) { this.lastPathStr = location.pathname; this.lastQueryStr = location.search; gmMain (); } } , 222 ); function gmMain () { if (window.self === window.top) alert ('"New" main (top) page loaded.'); else alert ('"New" iframed page loaded.'); }
但是, 由于页面被大量AJAX处理,因此您会发现页面首次加载时触发几乎总是为时过早。
明智的做法是waitForKeyElements 在您真正关心的页面的特定部分 使用 。 (未在问题中指出。)
waitForKeyElements
这是使用的示例waitForKeyElements。请注意,要@require在Chrome中使用,必须使用Tampermonkey(无论如何都应这样做)。
@require