1
(function ($) {
    'use strict';
    var url = window.location.href.split('#')[0];
    var post = $('.post').children('a[name]').attr('name');

    var helpers = {
        "defaults": {
            "post": post,
            "href": url+'#',
            "send": 'true',
            "layout": 'button_count',
            "width": '125',
            "faces": 'false',
            "font": 'verdana',
            "action": 'like',
            "scheme": 'light',
        },

        "init": function (options) {
            var settings = $.extend({}, helpers.defaults, options),

            easyface = $('<div />').addClass('easyface fb-like').attr({
                "data-href": settings.href + settings.post,
                "data-send": settings.send,
                "data-layout": settings.layout,
                "data-width": settings.width,
                "data-show-faces": settings.faces,
                "data-font": settings.font,
                "data-action": settings.action,
                "data-colorscheme": settings.scheme
            });

            return this.each(function (i, elem) {
                var self = $(elem),                 
                data = self.data('easyface');  
                if (!data) {   
                    self.data('easyface', easyface);
                    self.append(easyface);
                }
            });
        },

        "destroy": function () {
            return this.each(function (i, elem) {
                var self = $(this),                
                data = self.data('easyface');   // test to see if we've already called init on this element

                $(window).unbind('.easyface');      // unbind any namespaced events, assuming you've namespaced them like "click.easyface"
                self.removeData('easyface');        // remove the data flag
                self.find('.easyface').remove();    // remove the appended div
            });
        }

    };

    //define the method "easyface"
    $.fn.easyface = function (method) {
        if (helpers[method]) {
            // call the method and pass in the settings
            return helpers[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            // default to the init method and pass in the arg
            return helpers.init.apply(this, arguments);
        } else {
            // throw an error
            $.error('Method ' + method + ' does not exist on jQuery.tooltip');
        }
    };
}(jQuery));

$(function() {
    $('body').append('<div id="fb-root"></div>');

    (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=477049588983712";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
});

我认为问题出在这里

var url = window.location.href.split('#')[0];
var post = $('.post').children('a[name]').attr('name');
var helpers = {`

发生的事情是它提出了这样的网址 -

http://www.easybbtutorials.com/t177-user-profile-home-page#1244#undefined

所以我添加了split('#')[0];and 效果很好,但我仍然得到未定义的部分。

http://www.easybbtutorials.com/t177-user-profile-home-page#undefined

同样在每个.post地方,对于每个喜欢它的fb来说,它都是相同的url,它需要添加每个父母的a名字......

我可能会混淆我的说法,但我现在只是愤怒并且写得很快。

更好的解释:

  1. .post 是第一个,fb data-href 应该是http://www.easybbtutorials.com/t177-user-profile-home-page#8870
  2. .post 是第二个,fb data-href 应该是http://www.easybbtutorials.com/t177-user-profile-home-page#8871
  3. .post 是第三个,fb data-href 应该是http://www.easybbtutorials.com/t177-user-profile-home-page#8872
  4. .post 是第四个,fb data-href 应该是http://www.easybbtutorials.com/t177-user-profile-home-page#8873

等等等等,这是一个论坛,所以会有多个 .post 区域

到目前为止,我必须像这样写电话......

$('.post').each(function() {
   $(this).easyface();
  });

我希望插件能够真正自动执行任何操作。所以$('.post').easyface()会自动执行上面的代码。

此外,我现在还需要它来获取('a[name]').attr('name');每个帖子的名称,尽管我现在不得不像这样添加它,('a[name]').attr('name').split('p')[1];因为所有 id 都以 p ex 开头:p830 p338 p395 p 代表帖子。并且给定的链接将无法识别#p784,因此它需要成为#784。

谁能得到这个工作可以让我所有的声誉都设置为 100……现在我只有 43,但无论如何等待太久了。

更好地理解这里::

http://jsfiddle.net/zUeFL/17/

如您所见,我有四个喜欢并发送,就像他们都喜欢的一样。每个帖子需要不同的网址。

4

2 回答 2

3

问题一:

var post = $('.post').children('a[name]').attr('name'); 

children()将返回一个元素列表。

问题 2:

只需从块内运行插件$(document).ready

解决方案

尝试这个...

$(document).ready(function() {
    //run the plugin

    pNames = []

    $('.post').children('a[name]').each(function() {
        pNames.push($(this).attr('name'));
    });

    $('.postfoot').easyface({
        "post": pNames
    });
});

更新

如果您只需要一个a元素,请执行以下操作:

var post = $('.post').children('a[name]')[0].attr('name'); 

创建时进行这些更改href

easyface = $('<div />').addClass('easyface fb-like').attr({
    "data-href": settings.href.substring(0, settings.href.length - 1) + "#" + settings.post.split("p")[1], // concatenate with your href here.

更新了 jsFiddle:http: //jsfiddle.net/zUeFL/21/

于 2013-02-04T05:52:31.267 回答
1

这就是你要找的:demo

主要变化是:

  • 帖子 ID 是在each()循环中计算的,因为每个 ID 都不同.postfoot

    post = (options && options.post) || self.closest('.post').find('a:first').attr('name');
    

    这允许帖子 ID 被options对象覆盖,这可能不是一个好主意。

  • easyfacediv 也是在each()循环中创建的,同样因为每个div都不同.postfoot

于 2013-02-04T17:46:26.057 回答