在jquery插件之外调用'this'是什么意思

时间:2010-06-14 14:23:08

标签: jquery syntax plugins

我正在使用liveTwitter插件

问题是我需要阻止插件点击Twitter API。

根据the documentation,我需要这样做

$("#tab1 .container_twitter_status").each(function(){ this.twitter.stop(); });

对于id,每个都没有意义(作者使用$('#twittersearch'))

这是指什么?

无论如何,我得到一个未定义的错误。

我会粘贴插件代码并希望它对某人有意义。

我在这些

中使用的陈述
$("#tab1 .container_twitter_status").empty();
$("#tab1 .container_twitter_status").liveTwitter('bacon', {limit: 5, rate: 30000});

什么时候想停止

$("#tab1 .container_twitter_status").each(function(){console.log(this.twitter);});
$("#tab1 .container_twitter_status").each(function(){ this.twitter.stop(); });

提前感谢,理查德

/*
 * jQuery LiveTwitter 1.5.0
 * - Live updating Twitter plugin for jQuery
 *
 * Copyright (c) 2009-2010 Inge Jørgensen (elektronaut.no)
 * Licensed under the MIT license (MIT-LICENSE.txt)
 *
 * $Date: 2010/05/30$
 */

/*
 * Usage example:
 * $("#twitterSearch").liveTwitter('bacon', {limit: 10, rate: 15000});
 */

(function($){
    if(!$.fn.reverse){
        $.fn.reverse = function() {
            return this.pushStack(this.get().reverse(), arguments);
        };
    }
    $.fn.liveTwitter = function(query, options, callback){
        var domNode = this;
        $(this).each(function(){
            var settings = {};

            // Handle changing of options
            if(this.twitter) {
                settings = jQuery.extend(this.twitter.settings, options);
                this.twitter.settings = settings;
                if(query) {
                    this.twitter.query = query;
                }
                this.twitter.limit = settings.limit;
                this.twitter.mode  = settings.mode;
                if(this.twitter.interval){
                    this.twitter.refresh();
                }
                if(callback){
                    this.twitter.callback = callback;
                }

            // ..or create a new twitter object
            } else {
                // Extend settings with the defaults
                settings = jQuery.extend({
                    mode:      'search', // Mode, valid options are: 'search', 'user_timeline'
                    rate:      15000,    // Refresh rate in ms
                    limit:     10,       // Limit number of results
                    refresh:   true
                }, options);

                // Default setting for showAuthor if not provided
                if(typeof settings.showAuthor == "undefined"){
                    settings.showAuthor = (settings.mode == 'user_timeline') ? false : true;
                }

                // Set up a dummy function for the Twitter API callback
                if(!window.twitter_callback){
                    window.twitter_callback = function(){return true;};
                }

                this.twitter = {
                    settings:      settings,
                    query:         query,
                    limit:         settings.limit,
                    mode:          settings.mode,
                    interval:      false,
                    container:     this,
                    lastTimeStamp: 0,
                    callback:      callback,

                    // Convert the time stamp to a more human readable format
                    relativeTime: function(timeString){
                        var parsedDate = Date.parse(timeString);
                        var delta = (Date.parse(Date()) - parsedDate) / 1000;
                        var r = '';
                        if (delta < 60) {
                            r = delta + ' seconds ago';
                        } else if(delta < 120) {
                            r = 'a minute ago';
                        } else if(delta < (45*60)) {
                            r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
                        } else if(delta < (90*60)) {
                            r = 'an hour ago';
                        } else if(delta < (24*60*60)) {
                            r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
                        } else if(delta < (48*60*60)) {
                            r = 'a day ago';
                        } else {
                            r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
                        }
                        return r;
                    },

                    // Update the timestamps in realtime
                    refreshTime: function() {
                        var twitter = this;
                        $(twitter.container).find('span.time').each(function(){
                            $(this).html(twitter.relativeTime(this.timeStamp));
                        });
                    },

                    // Handle reloading
                    refresh: function(initialize){
                        var twitter = this;
                        if(this.settings.refresh || initialize) {
                            var url = '';
                            var params = {};
                            if(twitter.mode == 'search'){
                                params.q = this.query;

                                if(this.settings.geocode){
                                    params.geocode = this.settings.geocode;
                                }
                                if(this.settings.lang){
                                    params.lang = this.settings.lang;
                                }
                                if(this.settings.rpp){
                                    params.rpp = this.settings.rpp;
                                } else {
                                    params.rpp = this.settings.limit;
                                }

                                // Convert params to string
                                var paramsString = [];
                                for(var param in params){
                                    if(params.hasOwnProperty(param)){
                                        paramsString[paramsString.length] = param + '=' + encodeURIComponent(params[param]);
                                    }
                                }
                                paramsString = paramsString.join("&");
                                url = "http://search.twitter.com/search.json?"+paramsString+"&callback=?";
                            } else if(twitter.mode == 'user_timeline') {
                                url = "http://api.twitter.com/1/statuses/user_timeline/"+encodeURIComponent(this.query)+".json?count="+twitter.limit+"&callback=?";
                            } else if(twitter.mode == 'list') {
                                var username = encodeURIComponent(this.query.user);
                                var listname = encodeURIComponent(this.query.list);
                                url = "http://api.twitter.com/1/"+username+"/lists/"+listname+"/statuses.json?per_page="+twitter.limit+"&callback=?";
                            }
                            $.getJSON(url, function(json) {
                                var results = null;
                                if(twitter.mode == 'search'){
                                    results = json.results;
                                } else {
                                    results = json;
                                }
                                var newTweets = 0;
                                $(results).reverse().each(function(){
                                    var screen_name = '';
                                    var profile_image_url = '';
                                    if(twitter.mode == 'search') {
                                        screen_name = this.from_user;
                                        profile_image_url = this.profile_image_url;
                                        created_at_date = this.created_at;
                                    } else {
                                        screen_name = this.user.screen_name;
                                        profile_image_url = this.user.profile_image_url;
                                        // Fix for IE
                                        created_at_date = this.created_at.replace(/^(\w+)\s(\w+)\s(\d+)(.*)(\s\d+)$/, "$1, $3 $2$5$4");
                                    }
                                    var userInfo = this.user;
                                    var linkified_text = this.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) { return m.link(m); });
                                    linkified_text = linkified_text.replace(/@[A-Za-z0-9_]+/g, function(u){return u.link('http://twitter.com/'+u.replace(/^@/,''));});
                                    linkified_text = linkified_text.replace(/#[A-Za-z0-9_\-]+/g, function(u){return u.link('http://search.twitter.com/search?q='+u.replace(/^#/,'%23'));});

                                    if(!twitter.settings.filter || twitter.settings.filter(this)) {
                                        if(Date.parse(created_at_date) > twitter.lastTimeStamp) {
                                            newTweets += 1;
                                            var tweetHTML = '<div class="tweet tweet-'+this.id+'">';
                                            if(twitter.settings.showAuthor) {
                                                tweetHTML += 
                                                    '<img width="24" height="24" src="'+profile_image_url+'" />' +
                                                    '<p class="text"><span class="username"><a href="http://twitter.com/'+screen_name+'">'+screen_name+'</a>:</span> ';
                                            } else {
                                                tweetHTML += 
                                                    '<p class="text"> ';
                                            }
                                            tweetHTML += 
                                                linkified_text +
                                                ' <span class="time">'+twitter.relativeTime(created_at_date)+'</span>' +
                                                '</p>' +
                                                '</div>';
                                            $(twitter.container).prepend(tweetHTML);
                                            var timeStamp = created_at_date;
                                            $(twitter.container).find('span.time:first').each(function(){
                                                this.timeStamp = timeStamp;
                                            });
                                            if(!initialize) {
                                                $(twitter.container).find('.tweet-'+this.id).hide().fadeIn();
                                            }
                                            twitter.lastTimeStamp = Date.parse(created_at_date);
                                        }
                                    }
                                });
                                if(newTweets > 0) {
                                    // Limit number of entries
                                    $(twitter.container).find('div.tweet:gt('+(twitter.limit-1)+')').remove();
                                    // Run callback
                                    if(twitter.callback){
                                        twitter.callback(domNode, newTweets);
                                    }
                                    // Trigger event
                                    $(domNode).trigger('tweets');
                                }
                            });
                        }   
                    },
                    start: function(){
                        var twitter = this;
                        if(!this.interval){
                            this.interval = setInterval(function(){twitter.refresh();}, twitter.settings.rate);
                            this.refresh(true);
                        }
                    },
                    stop: function(){
                        if(this.interval){
                            clearInterval(this.interval);
                            this.interval = false;
                        }
                    }
                };
                var twitter = this.twitter;
                this.timeInterval = setInterval(function(){twitter.refreshTime();}, 5000);
                this.twitter.start();
            }
        });
        return this;
    };
})(jQuery);

2 个答案:

答案 0 :(得分:2)

我认为你想使用$(this)而不只是this

看看这里

$("#tab1 .container_twitter_status").each(function(){ $(this).twitter.stop(); });

已编辑:检查您的选择器

您的选择器应该

  $("#tab1 .container_twitter_status")  //returns all decendents of #tab1 with class .container_twitter_status

或应该是

  $("#tab1.container_twitter_status") //returns a single element with id #tab1 and class .container_twitter_status.

答案 1 :(得分:2)

$('#myDiv').each(function(){});将每个匹配的DOM节点的回调函数作为this

liveTwitter插件中的功能包含在一个对象中,并分配给.twitter上的DOM节点,因此此上下文中的this是DOM节点本身。

这些是等价的:

$('#myDiv').get(0).twitter.stop(); document.getElementById('myDiv').twitter.stop();

我刚测试了示例代码,它应该按预期工作。

调用停止功能时是否使用相同的选择器?你可以试试:

$("#tab1 .container_twitter_status").each(function(){console.log(this.twitter);});

并查看Firebug / Webkit是否返回Object或null。

此外,如果您不希望它自动刷新,只需传递refresh: false

$("#twitterSearch").liveTwitter('bacon', {limit: 10, refresh: false});

您可以动态执行此操作以暂时禁用刷新:

$("#stuff").liveTwitter('banana', {refresh: false}); $("#stuff").liveTwitter('banana', {refresh: true});