.each函数正确运行一次但后面说“未定义”不是函数'

时间:2014-07-30 15:56:35

标签: javascript jquery loops each

我正在写一个简单的函数来获取帖子的URL,然后返回它在Twitter上分享的次数。页面上有多个帖子,所以我需要为每个帖子运行该功能。以下是相关功能(请注意我使用RequireJS)。

function twitterCount($target) {

            $article = $target.closest($('article')),

            articleHREF = $target.parent().parent().attr('data-href');
            APIURL = 'https://cdn.api.twitter.com/1/urls/count.json';

            //Get count and set it as the inner HTML of .count
            $.getJSON(APIURL + "?callback=?&url=" + articleHREF, function(data) {
                $target.find('.count').html(data.count);
            });
        }

getTwitterCount: function() {
            $twitterLink.each(function() {
                $target = $(this);
                $target.function(twitterCount($target));
            });
        }

该函数运行正常一次,并给出了页面上第一篇文章被喜欢的次数,但随后停止工作并吐出未捕获的TypeError:undefined不是函数 in控制台。我努力想知道为什么它会运行一次,但后来却不适用于其他所有帖子。该错误指向以下行...

$target.function(twitterCount($target));

输出应该在的HTML

<ul class="share-options" data-href="http://localhost/test-post/">
                <li><a class="twitter" href="javascript:void(0)">
                    Twitter <span class="count twitter-count"></span>
                </a></li>
                <li><a class="linkedin" href="javascript:void(0)">LinkedIn</a></li>
            </ul>

1 个答案:

答案 0 :(得分:0)

我通过修改你的代码获得了成功。

主要变化:

  1. 我将.twitter类引用更改为.twitter-count以匹配您的HTML
  2. 我删除了您的getTwitterLink功能,并直接执行了each()
  3. 我将$target.function(twitterCount($target))替换为twitterCount($target) 这是一个很大的语法错误。
  4. 以下代码评论中的其他更改。

    function twitterCount($target) {
    
        /* I simplified "parent().parent()" to "closest()" */
        articleHREF = $target.closest('ul').attr('data-href');
        APIURL = 'https://cdn.api.twitter.com/1/urls/count.json';
    
        $.getJSON(APIURL + "?callback=?&url=" + articleHREF, function (data) {
            /* I changed ".twitter" to ".twitter-count" to match the class in your HTML */
            $target.find('.twitter-count').html(data.count);
        }).fail( function(d, textStatus, error) {
            /* I added this fail handler, just in case */
            console.error("getJSON failed, status: " + textStatus + ", error: "+error)
        });
    }
    
    $twitterLink = $('a.twitter');
    
    /* I removed the function here as it didn't seem necessary */
    $twitterLink.each(function () {
        $target = $(this);
        /* Your function call here threw a syntax error.
           Replaced `$target.function(twitterCount($target))` with `twitterCount($target)` */
        twitterCount($target);
    });
    

    Working Example