Клуб пользователей блока «Поделиться»

Заголовок не указан

nobars
3 марта 2011, 08:37
Зачем при вызове сразу генерится код в тег по id ?
Почему нельзя просто отдавать текст, как это делает, например, VK.share?
Я думаю дальше бы уже каждый разобрался куда полученных код вставлять.

Что делать, если у меня эти кнопочки должны динамически где-то генериться?
Типа расставлять div'ы, а потом прогонять все id со всеми параметрами ещё раз через new Ya.share что ли?

А если вставлять через "автоматическую инициализацию" - там половина параметров отсутствует. Да и лично у меня она вообще не заработала.

Есть ли какой-нибудь способ получить код кнопки просто в переменную?
15 комментариев
Подписаться на комментарии к посту

Можно не по id, а просто передать туда DOM-ноду.

А можете по-подробнее рассказать, зачем вам html-код кнопки?

Предположим, я получил данные через ajax от скрипта и активно их парсю.
Данные - например, список из 100 сообщений, с которыми потом что-то нужно сделать.

Упрощённый кривенький пример, чтобы было понятнее:
$.get('data.php',function(data){
   var items = data.split(/;/);
   var list = '';
   for (var i=0;i      list += ''+items[i]+'';
   };
  list = someFunction(list);
  $('#page').append(list);
});

И вот как в этом случае потом активировать shareBtns_* ?
Получается надо все данные всех элементов заносить в какой-то массив, а потом этот массив ещё раз крутить через new YaShare.
Пример, разумеется, не показывает всех случаев, но в целом, надеюсь, понятен :)
Мне именно так и пришлось делать:-(
Мне тоже, от чего я в не восторге лично :)
А вот кнопка share от ВКонтакте встраивается без всяких проблем, ибо просто возвращает код. Кому нужно дописывает document.write(...), кому не нужно - использует по-другому. Но суть в том, что универсальность в разы больше получается.
Полностью согласен, свобода в этом случае ничем не ограничена
Осталось убедить Дучика, что document.getElemenyById(id).innerHTML = ...  при конструкторе явно лишний :))
Ну или чтоб хотя бы параметром сделали возможность возврата кода.

честно говоря, я не понимаю, чем это будет проще чем new Share()

конструтор, то все равно надо будет вызывать, чтобы получить html

и все равно придется вставлять html в DOM

конструктор это делает сам, вы хотите руками, выгода мне не понятна

 

я пока не отказываюсь это делать, просто хочу понять зачем )

>> и все равно придется вставлять html в DOM
Да, безусловно, но, возможно, после какой-либо обработки и до вставки в DOM. Если у вас 10000 элементов, дёргать каждый раз DOM - не есть хорошо.

>> конструктор это делает сам, вы хотите руками, выгода мне не понятна
То что конструктор делает это сам - не велика выгода. Написать document.write(...) или document.getElementById(...).innerHTML может каждый. А вот гибкость это сильно понижает.

Я конечно понимаю, что извращаться можно как угодно. В конце концов html есть html, можно посмотреть что генерит чудесный js, а потом просто скопировать это и сделать свою кнопко-функцию на любой вкус. Но предложенная вами схема очень уменьшает гибкость.

К тому же, я не вижу никакой проблемы влепить перед document.getElementById в //yandex.st/share/share.js что-то типа  if (conf('return')) { return html; }; - одна строчка, а сколько счастья :)


new Share() , по мне, вообще самый кривой способ создания "функции".
Мне кажется куда более правильным, когда объект new Share() создаётся один раз (чтобы пользователь не парился, прямо в самом //yandex.st/share/share.js при подключении, например, var YaShare = new Ya.share() ), а дальше он уже дёргается функциями сколько угодно раз, с любыми параметрами (например. YaShare.getButton ({...}); )
А если мне нужно 100500 кнопок - мне создавать 100500 объектов?
Или ещё круче, мне нужно 1000 одинаковых кнопок. В вашем случае мне придется 1000 раз создавать, по сути, один и тот же объект.
Полностью поддерживаю, тот способ который есть сейчас, очень неудобный, и громоздкий.
а ссылка надо сгенерированный dom-элемент вас устроит?

отдавать чистый html не имеет смысла, он окажется без навешанных событий
Смысл в том, чтобы можно было запихать много-много кнопочек в какую-нибудь переменную, а потом всё разом вылить в какой-нибудь $('#place').html(buttons);
Иначе это всё не имеет смысла.

Вообще, эвенты - это конечно модно, но как показывает практика (в том числе зависающей выпадающей менюшки вашей кнопки, которую потом хрен уберешь с экрана, кроме как перезагрузкой страницы) не всегда надёжно. Проще надо быть :) Тут событий-то всего onclick штук 5 (можно прописать в код) и убирание менюшки (можно прописать общий эвент на все менюшки наверное).
('#place').append(node) ?
Ну так и те же грабли.
А если у меня 100 кнопок, что вполне может быть? Бедный DOM задёргается до умерщвления браузера :)
Такой вариант безусловно лучше, ибо при желании можно "допилить" node и только потом вставлять куда надо, но в целом это просто локализация проблемы (вместо поиска по всему DOMу для допиливания кнопки мы делаем это в node'е).
Создавать 100 почти одинаковых объектов, как я понимаю, при этом всё равно придется? :)
эффект будет тот же самый, если 100 раз сделать ('#place').html(node)
Эффект при чем?
Я думаю между созданием и полной инициализации 100 объектов и просто вызовом 100 раз функции одного объекта разница всё-таки есть. Ещё большая разница, если запихнуть 100 кнопок в переменную, а потом один раз вставить в DOM (т.е. уже ('#place').html(all100buttons);)

В общем, делайте что хотите :)
Лично моё мнение, что самые офигенско удобные кнопки у ВКонтакта. И не глючат они, и свои выпадающие окна на экране не оставляют (http://gyazo.com/d59def546d84bee01c9845d99db5d76b.png) и вообще.

Да, и шарить в твиттер через api - это ппц. Я даже кнопку allow боюсь нажимать, потому что не знаю что будет происходить - сразу он выкинет от моего имени какой-то неведомый текст или даст всё же подредактировать. Уж сделали бы либо через GET обычный (http://twitter.com/?status=test), либо через их кнопку, когда хотя бы видишь что постишь..... Но это так, лирика уже.