javascript - js回调函数报错Uncaught SyntaxError: Unexpected token :

查看:176
本文介绍了javascript - js回调函数报错Uncaught SyntaxError: Unexpected token :的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在用网易云音乐API查询歌曲信息时,可以成功,获取到歌曲id后想用同样的方法获取歌词,但是就报错了,script中的src在地址栏中可以直接返回json数据,但是通过回调函数打印,却报错。
相关js

// 搜索歌词
    var searchLyricBtn = document.getElementById('search-lyric-btn');
    searchLyricBtn.addEventListener('click', function () {
        var musicId = result.getAttribute('data-id');
        
        console.log(musicId);
        var url = "http://music.163.com/api/song/lyric";
        var data = {
            "id": musicId,
            "lv": -1,
            "kv": -1,
            "tv": -1,
            "callback": "jsonplyriccallback"
        }
        var buffer = [];
        for (var key in data) {
            buffer.push(key + '=' + encodeURIComponent(data[key]));
        }
        var fullpath = url + "?os=pc&" + buffer.join('&');
        CreateScript(fullpath);

    });
    function CreateScript (src) {
        var el = document.createElement('script');
        el.src = src;
        el.async = true;
        el.defer = true;
        document.body.appendChild(el);
    };
    // 歌词搜索回调
    function jsonplyriccallback (rs) {    
        console.log('回调成功');    
    };

对json和jsonp的回调格式不是很清楚。
测试id可以用287035 歌曲《遇见》的
测试src直接地址栏形式返回

成功的歌曲的src直接地址栏形式返回

貌似后面这个自动多了一个回调函数包装。
求大神解答~。

解决方案

经过测试,这个链接:
http://music.163.com/api/song/lyric?os=pc&id=287035&lv=-1&kv=-1&tv=-1&callback=jsonplyriccallback
&callback=jsonplyriccallback 应该是你自己加上去的吧。

因为 http://music.163.com/api/song/lyric 所对应的后台的服务器端脚本 只是单纯的输出,并不支持回调(或者你不知道他的回调的api名称,格式)。

因为是单纯的输出字符串,所以,但凡使用 script 的 src 标签来加载,都会报错的,因为这样做:

<script src='http://music.163.com/api/song/lyric?os=pc&id=287035&lv=-1&kv=-1&tv=-1&callback=jsonplyriccallback`
中 `&callback=jsonplyriccallback'></script>

等src加载完毕后,服务端输出的字符串会直接写入script标签中,等价于:

<script src='http://music.163.com/api/song/lyric?os=pc&id=287035&lv=-1&kv=-1&tv=-1&callback=jsonplyriccallback`
中 `&callback=jsonplyriccallback'>
{"sgc":true,"sfy":false,"qfy":false,"lrc":{"version":17,"lyric":"[00:00.00] 作曲 :....}
</script>

所以才会报错。

若想解决这个问题,若是 你会 php 的话,用 curl 来模拟请求,来后自己写一个简单的控制脚本,其他类型的服务器语言我不会,就给个php的范例吧:

如:

server.php:
$curl = curl_init();
$url = $_GET['url'];
curl_setopt($curl , CURLOPT_URL , $url);
curl_setopt($curl , CURLOPT_RETURNTRANSFER , true);
$rel = curl_exec($curl);
curl_close($curl);
print_r($rel);

front.js:
var path = 'server.php';
var queryString = 'url=http://music.163.com/api/song/lyric?os=pc&id=287035&lv=-1&kv=-1&tv=-1';
var xhr = new XMLHttpRequest();
   xhr.open(path , queryString , true);
   xhr.onreadystatechange = function(){
     if (this.readyState === 4 && this.status === 200) {
       console.log('抓取到的数据:' , xhr.responseText);
     }
   }
   xhr.send(null);

这篇关于javascript - js回调函数报错Uncaught SyntaxError: Unexpected token :的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆