0

我已经设置并测试了一个全局函数,以确保它正常工作:

function shortenUrl(url) { 
   ...
}

然后我试图在另一个函数的变量中调用该函数,如下所示:

var pageLink = $(location).attr('href'),
    shortLink = shortenUrl(pageLink);

所以当我尝试运行它时,我得到一个未定义的错误。但是,如果我将 pageLink 变量从使用 jQuery 查找页面 url 更改为硬编码的内容,例如“http://example.com”和 console.log,则全局函数中的值将返回一个缩短链接。

我只是像这样评论回电:

//return shortUrl;
console.log(shortUrl);

这在控制台中给了我正确的值。但它没有返回到我的 shortLink 变量,因为它仍然显示为未定义。我在这里错过了一些简单的东西吗?为什么值没有返回到 shortLink 变量,为什么使用 jQuery 动态创建的链接会通过函数?

更新编辑:

好的,只需稍微重置一下。我认为问题在于shortcutUrl 函数或我如何将值传递给它。只是为了测试我这样做的功能:

    function shortenUrl(url) {

        var url = url,
            username = 'username',
            key = 'api key';

        $.ajax({
            url: 'http://api.bit.ly/v3/shorten',
            data: {
                longUrl: url,
                apiKey: key,
                login: username
            },
            dataType: 'jsonp',
            success: function (v) {
                var shortUrl = v.data.url;
                return shortUrl;
                //console.log(shortUrl);
            }
        });
    }

var shorten = shortenUrl('http://google.com');
console.log(shorten);

Console.log(shorten) 返回未定义。但是,如果我取消注释 console.log(shortUrl); 并注释掉 return shortUrl;在函数中,我得到了从 bit.ly 返回的正确缩短的 URL。

为什么我不能在 console.log(shorten) 中获得正确的缩短 url?传递的变量是否错误?

4

2 回答 2

0

您的shortenUrl函数中应该有一个返回 url,它返回缩短的 url,如下所示:

function shortenUrl(url) {
   var shortUrl = url; // for the sake of simplicity
   return shortUrl;
}

我很好奇我的小费是否可以,请让我们都知道。

更新

$(window).load(function(){
function shortenUrl(url) {

    var url = url,
        username = 'bit.ly username',
        key = 'api Key';

    $.ajax({
        url: 'http://api.bit.ly/v3/shorten',
        data: {
            longUrl: url,
            apiKey: key,
            login: username
        },
        dataType: 'jsonp',
        success: function(v) {
            var shortUrl = v.data.url;
            return shortUrl;
        }
    });
}

function some() {
    var pageLink = $(location).attr('href'),
        shortenLink = shortenUrl(pageLink);

    var link = $('<a href="' + shortenLink + '">Shorten Link</a>');
    link.prependTo('element');
}
});

由于缺少密钥和用户名,我无法尝试该代码,但这应该可以。确保将两者都替换为正确的并调用代码,如下所示:

some();

并始终注意浏览器控制台的错误/警告!

于 2012-10-17T21:53:00.600 回答
0

老实说,我没有太多经验,jsonp但 ajax 调用应该返回promise。如果shortenUrl函数返回了该承诺,那么在调用者中您可以done像这样使用:

    function shortenUrl(url) {

        var url = url,
            username = 'bit.ly username',
            key = 'api Key';

        return $.ajax({
            url: 'http://api.bit.ly/v3/shorten',
            data: {
                longUrl: url,
                apiKey: key,
                login: username
            },
            dataType: 'jsonp'
        });
    }

    function modifyDom(v) {
        var shortUrl = v.data.url,
            link = $('<a href="' + shortenLink '">Shorten Link</a>');
        link.prependTo('element');
    }    

    $( function() {
        var pageLink = $(location).attr('href');
        shortenUrl(pageLink)
            .done( modifyDom },
    }​ );

虽然这段代码没有经过测试,但我希望你能明白。

于 2012-10-17T22:26:38.027 回答