Почему этот пользовательский скрипт не работает на Facebook? - PullRequest
1 голос
/ 04 августа 2011

Я писал скрипт для Google Chrome, который автоматически открывал бы конкретную вкладку чата, но она не работает,

Я думаю, что это потому, что Chat.openTab специально не определен, потому что когда я запускаю код в консоли javascript, он работает нормально.

КОД:

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

Ответы [ 3 ]

3 голосов
/ 04 августа 2011
if (domain = face)

должно быть

if (domain === face)
2 голосов
/ 04 августа 2011

Другие ответы указывают, что это должно быть (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 загружает много iFrames, и скрипт запускается на многих из них.
  2. Объект Chat загружается не сразу.

Чтобы обойти эти препятствия, мы устанавливаем таймер, который не пытается выполнить наш код, пока ресурс не будет найден.

Вот так:

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() + ')()' );
1 голос
/ 04 августа 2011
if (domain == face)
{
 Chat.openTab("sam.sebastian1", "Seb") 
}

не

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