【问题标题】:Need help with twitter widget需要有关 twitter 小部件的帮助
【发布时间】:2011-10-08 21:58:08
【问题描述】:

我创建了一个 jquery 插件,它在左侧放置了一个用于社交媒体内容的侧边栏。我有下面的变量,这是内容的来源。我正在尝试使用小部件提取推特提要,但我不断收到错误消息“TWTR 未定义”。任何想法如何解决这个问题?

这个页面正在调用我创建的插件http://social.allthingswebdesign.com

var content = (
            '<div class="contentArea visible" id="fb">FB Content Area</div>'+
            '<div class="contentArea" id="twit"><script src="http://widgets.twimg.com/j/2/widget.js"></script><script>new TWTR.Widget({version: 2,type: \'profile\',rpp: 4,interval: 6000,width: 250,height: 280,theme: {shell: {background: \'#333333\',color: \'#ffffff\'},tweets: {background: \'#ffffff\',color: \'#444444\',links: \'#e02046\'}},features: {scrollbar: false,loop: false,live: false,hashtags: true,timestamp: true,avatars: false,behavior: \'all\'}}).render().setUser(\'CSuitesIndepend\').start();</script></div>'+
            '<div class="contentArea" id="youtube">Youtube Video</div>'+
            '<div class="contentArea" id="yelp">Yelp reviews</div>'+
            '<div class="contentArea" id="ta">Trip Advisor Advice</div>'+
            '<div class="contentArea" id="li">The Linked In Page</div>'
        );

另外 - 如果我从插件中删除这一行 &lt;script src="http://widgets.twimg.com/j/2/widget.js"&gt;&lt;/script&gt;,并将其放在我的网页顶部,我看到的只是 Twitter 提要。

编辑:好吧,现在我在想,为什么我不能将 twitter 小部件代码 - <script> new TWTR.Widget({ version: 2, type: 'profile', rpp: 4, interval: 6000, width: 250, height: 280, theme: { shell: { background: '#333333', color: '#ffffff' }, tweets: { background: '#ffffff', color: '#444444', links: '#e02046' } }, features: { scrollbar: false, loop: false, live: false, hashtags: true, timestamp: true, avatars: false, behavior: 'all' } }).render().setUser('CSuitesIndepend').start(); </script> - 附加到通过插件动态插入的元素上?

当我尝试这段代码时,它不会在#tweetFeed 中插入任何内容 -

$(document).ready(function() {

        // add the sidebar plugin
        $('html').social(function() {
            //console.log('#tweetFeed = '+ $('#tweetFeed').parent().html());
            $('#tweetFeed').insertAfter("<p>TEST</p>");
        }); 

        //console.log('#tweetFeed = '+ $('#tweetFeed').parent().html());
        $('#tweetFeed').insertAfter("<p>TEST</p>");
    });

【问题讨论】:

  • 为什么要让侧边栏包含在 javascript 中?有什么特殊的理由不使用纯 html(这将减少负载并增加简单性)?
  • 这是我创建的一个插件,我想简单地添加到一堆不同的网站中。
  • 但还是;一个简单的包含有什么问题(即在 php 中:include('twitter_widget.php');)?它更快,更简单,并且尽可能容易实现(它甚至可以保护一行代码;))

标签: javascript jquery html css twitter


【解决方案1】:

有一个未记录的功能,可让您定位要加载小部件的元素的 id。 我能够使用 $.getScript 以及 twitter 提供的普通小部件代码来加载它以代替选择。

这是我使用的脚本,希望对您有所帮助...

$(文档).ready(函数(){ $.getScript('http://widgets.twimg.com/j/2/widget.js', function () { 新的 TWTR.Widget({ 版本:2, 类型:'个人资料', id : '推特盒子', rpp:4, 间隔:30000, 宽度:'自动', 高度:'自动', 主题: { 贝壳: { 背景:'透明',//这很重要 颜色:'#333' }, 推文:{ 背景:'透明',//这很重要 颜色:'#666', 链接:'#d14836' } }, 特征: { 滚动条:假, 循环:假, 活:假, 行为:“全部” } }).render().setUser('用户名').start(); }); });

【讨论】:

    【解决方案2】:

    您将在添加的标记中放置对 twitter js 文件的引用,同时在该脚本中放置对对象的引用。下载该 twitter js 文件需要一秒钟左右的时间,但浏览器会继续解析您的内联脚本。

    所以要做的第一件事是从标记变量中删除对 twitter 脚本的引用,使用 $.getScript() 获取它,然后使用来自 $getScript 的回调添加标记,以便它只运行一次内联来自 twitter 的 js 已到达浏览器。就像这样。

        var content = (
            '<div class="contentArea visible" id="fb">FB Content Area</div>'+
            '<div class="contentArea" id="twit"><script>new TWTR.Widget({version: 2,type: \'profile\',rpp: 4,interval: 6000,width: 250,height: 280,theme: {shell: {background: \'#333333\',color: \'#ffffff\'},tweets: {background: \'#ffffff\',color: \'#444444\',links: \'#e02046\'}},features: {scrollbar: false,loop: false,live: false,hashtags: true,timestamp: true,avatars: false,behavior: \'all\'}}).render().setUser(\'CSuitesIndepend\').start();</script></div>'+
            '<div class="contentArea" id="youtube">Youtube Video</div>'+
            '<div class="contentArea" id="yelp">Yelp reviews</div>'+
            '<div class="contentArea" id="ta">Trip Advisor Advice</div>'+
            '<div class="contentArea" id="li">The Linked In Page</div>'
        );
        $.getScript("http://widgets.twimg.com/j/2/widget.js",function(){ 
            // dynamically add the get social sidebar
        $('body').prepend('<div id="social"><div id="outer"><span><img src="getSocial.png" alt="Get Social" />' +
                  '<ul id="icons"><li><img class="tiny" src="fb.png" alt="Facebook" /></li>'+
                  '<li><img class="tiny" src="twit.png" alt="Twitter" /></li></ul></span>'+
                  '</div><div id="inner"><div id="innest"><div id="message">Get Social With Comfort Suites!</div>'+
                  '<div id="close"><a id="closeB" href="#">X</a></div><ul class="idTabs">'+
                  imgs +'</ul>'+content +'</div></div></div>'); 
    
        });
    

    但我谦虚地建议将内联脚本移出您要附加到 DOM 的字符串,并将其直接放入回调中,这样您就可以更巧妙地将变量传递给它,假设下一行是您想将选项发送到您的插件。最后一个选项会给你

        var content = (
            '<div class="contentArea visible" id="fb">FB Content Area</div>'+
            '<div class="contentArea" id="twit"></div>'+
            '<div class="contentArea" id="youtube">Youtube Video</div>'+
            '<div class="contentArea" id="yelp">Yelp reviews</div>'+
            '<div class="contentArea" id="ta">Trip Advisor Advice</div>'+
            '<div class="contentArea" id="li">The Linked In Page</div>'
        );
        $.getScript("http://widgets.twimg.com/j/2/widget.js",function(){ 
            // dynamically add the get social sidebar
            $('body').prepend('<div id="social"><div id="outer"><span><img src="getSocial.png" alt="Get Social" />' +
                      '<ul id="icons"><li><img class="tiny" src="fb.png" alt="Facebook" /></li>'+
                      '<li><img class="tiny" src="twit.png" alt="Twitter" /></li></ul></span>'+
                      '</div><div id="inner"><div id="innest"><div id="message">Get Social With Comfort Suites!</div>'+
                      '<div id="close"><a id="closeB" href="#">X</a></div><ul class="idTabs">'+
                      imgs +'</ul>'+content +'</div></div></div>'); 
    
    
                    new TWTR.Widget({
                        version: 2,
                        type: 'profile',
                        rpp: 4,
                        interval: 6000,
                        width: 250,
                        height: 280,
                        theme: {
                            shell: {
                                background: '#333333',
                                color: '#ffffff'
                                },
                            tweets: {
                                background: '#ffffff',
                                color: '#444444',
                                links: '#e02046'
                            }
                        },
                        features: {
                            scrollbar: false,
                            loop: false,
                            live: false,
                            hashtags: true,
                            timestamp: true,
                            avatars: false,
                            behavior: 'all'
                        }
                    })
                    .render()
                    .setUser('CSuitesIndepend')
                    .start();
    
        });
    

    这有额外的好处,您不需要转义引号,jsHint(或其他)也会评估该脚本。

    最后,考虑this 使用jQuery 创建标记的方式。它使更改更容易在版本控制差异中发现。不过只是个人喜好。

    希望这会有所帮助。

    更新:

    看起来当小部件被创建(新的 TWTR.Widget)时,它会调用 .init() 并记住它在页面中的嵌入位置,然后在此处插入所需的 HTML 代码。当我们在头部的脚本中调用它时,它会将它放在文档的根目录中,覆盖其他所有内容。

    尝试将“new TWITR.Widget”调用封装在一个函数中,然后从您希望小部件出现的标记中的内联脚本调用该函数。这样,变量仍然在标记之外,并且内联脚本中的所有内容都是对头脚本中函数的引用。

    所以你现在在某处有一个类似的函数

                            var makeTwitterWidget = function () {
                    new TWTR.Widget({
                        version: 2,
                        type: 'profile',
                        rpp: 4,
                        interval: 6000,
                        width: 250,
                        height: 280,
                        theme: {
                            shell: {
                                background: '#333333',
                                color: '#ffffff'
                                },
                            tweets: {
                                background: '#ffffff',
                                color: '#444444',
                                links: '#e02046'
                            }
                        },
                        features: {
                            scrollbar: false,
                            loop: false,
                            live: false,
                            hashtags: true,
                            timestamp: true,
                            avatars: false,
                            behavior: 'all'
                        }
                    })
                    .render()
                    .setUser('CSuitesIndepend')
                    .start();
    
        });
    
             }
    

    内容变量如下所示:

    var content = (
        '<div class="contentArea visible" id="fb">FB Content Area</div>'+
        '<div class="contentArea" id="twit"><script>makeTwitterWidget();</script></div>'+
        '<div class="contentArea" id="youtube">Youtube Video</div>'+
        '<div class="contentArea" id="yelp">Yelp reviews</div>'+
        '<div class="contentArea" id="ta">Trip Advisor Advice</div>'+
        '<div class="contentArea" id="li">The Linked In Page</div>'
    );
    

    【讨论】:

    • 我更改了代码,所以它按照您建议的方式进行设置,现在它只是拉入 Twitter 提要。页面的其余部分在加载时会闪烁,然后仅加载 twitter 提要。你知道这是为什么吗?
    • 好的,现在我收到了一个错误,即 makeTwitterWidget 未定义。我知道这是小事,但我想不通。
    • 对问题出在哪里有任何想法?
    • 嗯,我在空闲时间一直在研究它。这是一个小提琴jsfiddle.net/nwe44/Xt7sj/2我的方法有效。问题是如何控制从哪里调用构造函数。我倾向于建议使用其他东西来构建推文,因为 twitter 自己的推文如此专注于嵌入用例,以至于你总是会与它作斗争。看看thomasbillenstein.com/jTweetsAnywhere
    • 好吧,我试图让 jtweetsanywhere 工作,但我什至无法让它在我的页面上工作。它插入了一些包装元素,但实际上并没有插入任何推文。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      如果有人还在为此苦苦挣扎,Twitter 可能已经为您解决了这个问题, http://blog.twitter.com/2012/09/more-tweets-across-web.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 2016-11-24
        • 2015-06-23
        • 2014-12-26
        • 2013-08-12
        相关资源
        最近更新 更多