7

This simple code doesn't work on a Facebook page. This code only alerts when I refresh the page. If I go to that page from my Facebook profile, with my mouse; The script stops working.

There are no alerts or errors. :(
It looks like the whole script doesn't work until I refresh.

// ==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);
}

I also tried this, among other things:

// ==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);
}
4

1 回答 1

6

问题是 AJAX 问题。当您键入 URL 或刷新页面时,您的脚本将起作用。当您单击“活动日志”按钮时,脚本不会。iframe 不是您报告的症状的一个因素。

这是因为单击该链接永远不会加载新页面;它会触发替换部分内容的 AJAX 调用,使其看起来像一个新页面,但事实并非如此。

因此,如果您希望您的脚本在“新的”“主页”上触发,您必须使用类似这个答案中的技术。

在 Facebook 的情况下,通常唯一改变的是报告的 URL(但不会触发 hashchange!),以及#mainContainerdiv 的内容。

您还必须使用@include所有 FB 页面,因为此类页面https://www.facebook.com/*/allactivity*通常只能通过 AJAX 访问,因此您的脚本需要在前一页上运行。

此脚本将解决您的问题中提出的问题:

// ==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. 请注意,要@require在 Chrome 中使用,您必须使用 Tampermonkey(无论如何您都应该这样做)。

于 2013-07-26T03:45:55.670 回答