0

我的代码中有一个错误,但看不到我做错了什么。

我所拥有的是通过 jQuery UI 自动完成填充的 facebook 用户 ID 的隐藏输入:

<input id="fbid" type="hidden" value="12345, 567890, ">

然后我有一个 jQuery 函数,该函数在单击链接以发布到朋友的墙上时运行。

<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
    FB.init({
        appId      : '12345678', // App ID
        channelUrl : '/channel.html', // Channel File
        status     : true, // check login status
        cookie     : true, // enable cookies to allow the server to access the session
        oauth      : true, // enable OAuth 2.0
        xfbml      : true  // parse XFBML
    });

    // Additional initialization code here

    FB.login(function(response)
    {
        if (response.authResponse)
        {                                               
            $("#send-voucher").click(function() {

                // Post message to friend's wall

                var opts = {
                    message : 'This is the message',
                    name : 'This is the name',
                    link : 'http://www.opticalexpress.co.uk',
                    description : 'This is the description',
                    picture : '/voucher_valid.png'
                };

                var referees = $("#fbid").val();

                // remove last comma and space from the end of the string
                referees = $.trim(referees);
                referees = referees.substring(0, referees.length - 1);

                var referee = referees.split(',');
                referee.each(function() {

                    FB.api('/'+ referee +'/feed', 'post', opts, function(response)
                    {
                        if (!response || response.error)
                        {
                            alert('Posting error occured');
                        }
                        else
                        {
                            alert('Success - Post ID: ' + response.id);
                            $("#send-voucher").hide();
                            $("#voucher-sent").fadeIn('slow');
                        }
                    });
                });
            });
        }
        else
        {
            alert('Not logged in');
        }
    }, { scope : 'publish_stream' });
};

当我点击发送凭证时,错误来自我else上面声明中的警报对话框:

Posting error occured

我添加了另一个警报,以了解为什么在循环打开后会发生这种情况:

$.each(referee, function() {
    referee = $.trim(referee);
    alert(referee); // new alert for debugging
    ....

此警报输出的值让我感到惊讶,因为refereeis 12345, 567890(与隐藏输入相同,但删除了尾随空格和最后一个逗号)。

因此,jQuery 似乎没有正确拆分它,但它运行循环正确的次数,因为警报框弹出两次告诉我裁判,然后是错误。(两个警报框显示两次只是为了澄清)。如果这是一个巧合,我尝试在隐藏输入中添加更多 id,并且可以确认警报框显示的次数与 id 的数量相同。

所以我想知道我做错了什么,因为循环运行了正确的次数,但逗号分隔的 id 似乎根本没有被分割。

4

3 回答 3

2

referee.each(function()在名为 的数组上调用referee,而不是 jQuery 对象。

试试$.each(referee, function()吧。

http://api.jquery.com/jQuery.each/

更新

您也可以.split使用正则表达式查看 ing 以查看是否有任何不同:

var referee = referees.split(/\s*,\s*/);

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split

于 2012-05-04T12:23:35.583 回答
1

referee在您的程序中是拆分字符串的列表,在您的“每个循环”中,您使用列表而不是实例。尝试更换:

FB.api('/'+ referee +'/feed', 'post', opts, function(response)

FB.api('/'+ $(this) +'/feed', 'post', opts, function(response)
于 2012-05-04T12:23:52.800 回答
1

您的代码有几个问题。正如其他人所提到的,您正在使用不存在的方法循环数组.each()。您可以改用标准for()循环。此外,使用正则表达式去除空格和多余的逗号更有效。

这是一个简化的例子,也可以在http://jsfiddle.net/hJQ6W/

<input id="fbid" type="hidden" value="12345, 567890, ">
<script>
  var referees = $("#fbid").val();
  // trim string and remove all commas from the end of it
  referees = referees.replace(/\s/g,'').replace(/,*$/,'');
  var referee = referees.split(',');
  for(i=0; i<referee.length; i++) {
    alert('"'+referee[i]+'"');
  }
</script>
于 2012-05-04T14:14:41.453 回答