Google Plus One callback - есть ли способ подписаться на действие +1? - PullRequest
17 голосов
/ 07 марта 2012

Я ищу способ подписаться на кнопку плюс одна.

Согласно документации здесь: https://developers.google.com/+/plugins/+1button/#plusonetag-parameters Я мог бы добавить атрибут обратного вызова к тегу, но в моем случае мне не позволено вмешиваться.Я создаю инструмент поверх сайта, встроенный JS запущен на готовом документе.Я хочу добавить обратный вызов в режиме реального времени, и он не должен мешать исходному обратному вызову, если он был объявлен.

У меня нет этой проблемы с Facebook или Twitter (например, как и чирикать) .В этих случаях есть глобальные переменные FB и twttr, зарегистрированные так, как только они станут доступны:

FB.Event.subscribe("edge.create", function(e) {
  console.log(e);
})

или твиттер twttr.events.bind ...

Я что-то упустил или Google выбрал очень неловкоспособ делать вещи?В чем их интерес к этому методу и что можно с этим сделать?

Ответы [ 5 ]

14 голосов
/ 07 марта 2012

Вы можете использовать JavaScript API для получения обратного вызова +1.

gapi.plusone.render(
    myDomNode,
    { "callback": myCallbackFunction });

Или вы можете указать атрибут "callback", если используете версию DOM.

В любом случае обратный вызов будет вызываться с объектом, который имеет два свойства: href возвращает URL-адрес, который был + 1, а state является либо "off", либо "on".

4 голосов
/ 09 марта 2012

Вы можете пойти на шаг дальше, чем ответ Дейва, и действительно внедрить свой собственный обратный вызов - но сделайте дополнительный шаг, предварительно извлекая существующее значение обратного вызова и отправляя его самостоятельно в свой собственный обработчик (если существует существующее значение обратного вызова) с помощью те же значения, что и ваш обратный вызов.

Таким образом, будет вызван и ваш обработчик, и оригинальный обработчик, и, надеюсь, никто не станет мудрее:)

3 голосов
/ 11 марта 2012

Агрессивным, но обычно работоспособным решением было бы заменить атрибут обратного вызова тега G: PLUSONE вашей собственной функцией, которая может вызывать исходный обратный вызов (если он был определен) и также выполнять свои собственные функции.Сценарий Google plusone.js заменяет тег G: PLUSONE на iframe, поэтому это нужно сделать до того, как этот сценарий будет выполнен (возможно, с помощью DOM-ready).Вот наивный пример (который вы можете увидеть, работая с jsfiddle - откройте консоль отладки и нажмите кнопку +1).

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var originalCallback = function(o) {
    console.log('original callback - ' + o.state);
};
// on DOM ready
$(function() {
    var plusoneTag = $('G\\:PLUSONE');
    var originalCallbackName = $(plusoneTag).attr('callback');
    // global function
    hijackerCallback = function(o) {
        console.log('hijacking callback - ' + o.state);
        window[originalCallbackName](o);  
    };
    plusoneTag.attr('callback', 'hijackerCallback');
});
</script>    
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>

...предположим, что где-то на странице хоста у вас есть тег +1, например:

<g:plusone annotation="inline" callback="originalCallback"></g:plusone>

В качестве примечания я попытался прослушать удаление тега G: PLUSONE с помощью DOMNodeRemoved и заменитьобратный вызов тогда - но это слишком поздно, и сценарий plusone.js уже связан с исходным обратным вызовом на этом этапе.В реальном мире вам, вероятно, следует попробовать внедрить ваш скрипт непосредственно перед plusone.js (мы, вероятно, говорим здесь о расширении Chrome или Firefox).

1 голос
/ 17 июля 2012

это можно легко сделать асинхронно:

<!-- add the callback to your html as data-attribute: -->
<div class="g-plusone" data-callback="plusOneClick" data-annotation="inline" data-width="300"></div>

в вашем JS вы должны определить функцию обратного вызова и выполнить асинхронную загрузку

// define your callback function
function plusOneClick(response) {
  ...
}

// load your google+ stuff async
(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
0 голосов
/ 05 июля 2014

Чтобы подписаться на событие Google Plus, вы можете уничтожить кнопку и перестроить ее:

$('#gPlusContainer').html("<div id='gPlusBtn'></div>");
gapi.plusone.render("gPlusBtn", {
    "callback": plus_Puzzle,
    "size": "tall"
});
...