为什么这个用户不能在Facebook上运行?

时间:2011-08-04 02:13:41

标签: javascript facebook google-chrome userscripts

我正在为Google Chrome编写用户脚本,该脚本会自动打开特定的聊天标签,但它无效,

我认为这是因为Chat.openTab没有明确定义,因为当我在javascript控制台中运行代码时,它可以正常工作。

CODE:

var face = "facebook.com"
var domain = document.domain
if (domain = face)
{
 Chat.openTab("sam.sebastian1", "Seb") 
}

3 个答案:

答案 0 :(得分:3)

if (domain = face)

应该是

if (domain === face)

答案 1 :(得分:2)

其他答案指出它应该是(domain == face),而 是错误。

然而,并不是阻止脚本按预期工作的原因。

主要问题是Chrome用户脚本无法使用目标页面中定义的JS。您必须将代码注入页面,如下所示:

function functionToInject () {
    function myCode () {
        /*--- This is where you put everything you want to do that 
            requires use of the page's javascript.
        */
        var face = "facebook.com"
        var domain = document.domain
        if (domain == face)
        {
            Chat.openTab ("sam.sebastian1", "Seb");
        }
    }
    myCode ();
}

function addJS_Node (text, s_URL) {
    var scriptNode                      = document.createElement ('script');
    scriptNode.type                     = "text/javascript";
    if (text)  scriptNode.textContent   = text;
    if (s_URL) scriptNode.src           = s_URL;

    var targ    = document.getElementsByTagName('head')[0] 
                || document.body || document.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node ( '(' + functionToInject.toString() + ')()' );


这是基本答案。 然而,因为这是Facebook,事情有点复杂。

  1. Facebook加载了许多iFrame,脚本将触发其中许多iFrame。
  2. Chat对象无法立即加载。
  3. 为了解决这些障碍,我们设置了一个计时器,在找到资源之前不会尝试执行我们的代码。

    像这样:

    function functionToInject () {
        function myCode () {
            /*--- This is where you put everything you want to do that 
                requires use of the page's javascript.
            */
            var face = "facebook.com"
            var domain = document.domain
            if (domain == face)
            {
                Chat.openTab ("sam.sebastian1", "Seb");
            }
        }
    
        var waitForKeyElements  = setInterval (checkForElement, 500);
    
        function checkForElement () {
            if (typeof Chat != "undefined" ) {
                clearInterval (waitForKeyElements);
                myCode ();
            }
        }
    }
    
    function addJS_Node (text, s_URL) {
        var scriptNode                      = document.createElement ('script');
        scriptNode.type                     = "text/javascript";
        if (text)  scriptNode.textContent   = text;
        if (s_URL) scriptNode.src           = s_URL;
    
        var targ    = document.getElementsByTagName('head')[0] 
                    || document.body || document.documentElement;
        targ.appendChild (scriptNode);
    }
    
    addJS_Node ( '(' + functionToInject.toString() + ')()' );
    

答案 2 :(得分:1)

if (domain == face)
{
 Chat.openTab("sam.sebastian1", "Seb") 
}

if (domain = face)
{
 Chat.openTab("sam.sebastian1", "Seb") 
}