用于动态小部件更新的Twitter小部件方法

时间:2011-02-11 14:28:04

标签: twitter methods widget public-method

我正在尝试为twitter小部件的个人资料页面添加一个选项,我有一个用户可以添加他们的Twitter帐户的字段,下面显示小部件的预览。如果我输入一个帐户并单击保存并返回,它可以正常工作。但我想要做的是让它变得动态,在文本字段上发生 blur 事件时用相应的帐户刷新小部件。

我有以下代码:

var twitterWidget = new TWTR.Widget({
  version: 2,
  type: 'profile',
  rpp: 4,
  interval: 6000,
  width: 'auto',
  height: 300,
  theme: {
    shell: {
        background: '#cccccc',
        color: '#333333'
        },
    tweets: {
        background: '#ffffff',
        color: '#333333',
        links: '#0099cc'
        }
  },
  features: {
    scrollbar: false,
    loop: false,
    live: false,
    hashtags: true,
    timestamp: true,
    avatars: true,
    behavior: 'all'
  }
});
twitterWidget.setUser(twitterUser).render().start();

    $('#twitter_widget_id').change(function(){          
        twitterWidget.setUser($(this).val()).render().start();
    });

在这种情况下它工作错误:它只显示我输入的所有帐户中的最新推文,一般来说我得到一个空小部件。

如果删除对象并创建一个新对象,则会使页面变为空白,然后添加小部件。

有没有人知道TWTR.Widget()的一些公共方法,比如re-render()或类似的东西?

感谢。

2 个答案:

答案 0 :(得分:21)

文档化的Twitter小部件源代码可在http://twitter.com/javascripts/widgets/widget.js获得,阅读它将告诉您有关如何操纵其行为的所有信息。简而言之,小部件的工作方式如下:

首次使用new TWTR.Widget创建窗口小部件时,它会调用.init()并记录它在页面中的嵌入位置,将窗口小部件HTML代码插入到该位置的DOM中。 (它总是假设你是嵌入式的,这就是为什么如果你在头部脚本或窗口的上下文中创建一个新的小部件,它最终会将自己嵌入到窗口的根目录中。)

但是,您仍然可以使用函数创建窗口小部件(只要从嵌入式脚本调用它),然后保留对窗口小部件的引用以供日后使用。当您稍后调用.render()时,窗口小部件只会重新呈现自己。

TWTR对象上有一些伪私有方法,你可以尝试一些有趣的方法,例如_getWidgetHtml() - 由.render()调用,但你不需要使用它们。

我刚刚编写了以下代码,对我来说效果很好。从嵌入式脚本中调用此函数(如图所示),稍后再使用新的搜索参数再次调用它以重新渲染它。

<div id="my_widget_region">
  <script src="http://widgets.twimg.com/j/2/widget.js"></script>
  <script>do_twitter_widget('"#winning" or "justin bieber"');</script>
</div>

function do_twitter_widget(search_query, title, subtitle) {
  if (!window.widgetRef) {
    window.widgetRef = new TWTR.Widget({
      version: 2,
      type: 'search',
      search: search_query,
      interval: 6000,
      title: title || 'Tweets related to',
      subject: subtitle || search_query,
      width: 'auto',
      height: 500,
      theme: {
        shell: {
          background: '#8EC1DA',
          color: '#FFFFFF'
        },
        tweets: {
          background: '#FFFFFF',
          color: '#444444',
          links: '#1985B5'
        }
      },
      features: {
        scrollbar: false,
        loop: true,
        live: true,
        hashtags: true,
        timestamp: true,
        avatars: true,
        behavior: 'default'
      },
      ready: function() {
        // when done rendering...
      }
    });

    window.widgetRef
      .render()
      .start();
  }
  else {
    if (search_query != window.old_twitter_search) {
      window.widgetRef
        .stop()
        .setSearch(search_query)
        .setTitle(title || 'Tweets related to')
        .setCaption(subtitle || search_query)
        .render()
        .start();
    }
  }

  window.old_twitter_search = search_query;

  return window.widgetRef;
}

答案 1 :(得分:1)

您可以通过使用“id”参数创建一个新实例来重新加载小部件,作为小部件元素的html id。

以下示例。 (对我来说没问题)

window.twitterCreateOrUpdateProfile = function (username) {

    var opts = {
        version: 2,
        type: 'profile',
        rpp: 4,
        interval: 30000,
        width: 298,
        height: 320,
        theme: {
            shell: {
              background: '#86b9d1',
              color: '#ffffff'
            },
            tweets: {
              background: '#ffffff',
              color: '#444444',
              links: '#0b0d0d'
            }
        },
        features: {
            scrollbar: true,
            loop: false,
            live: false,
            behavior: 'all'
        }
    };

    if (window.twitterCreateOrUpdateProfile.instance) {
        opts.id = window.twitterCreateOrUpdateProfile.instance.widgetEl.id;
    }
    window.twitterCreateOrUpdateProfile.instance = new TWTR.Widget(opts);
    window.twitterCreateOrUpdateProfile.instance.render().setUser(username).start();
}
window.twitterCreateOrUpdateProfile('evaisse');