2

我正在尝试设置位于此处的 SC html 5 api:

http://w.soundcloud.com/player/api.js

然而,它在 Firebug 中抛出“c is undefined”错误(7 次)。

经过一番挖掘,这些错误似乎只有在我像这样异步加载 Facebook JS 时才会出现:

(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=137624476258287";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

api.js 和 facebook.js 似乎都在使用函数包装器,但 FB 导致 soundcloud 出错。


我在下面添加了我的解决方案,这个错误可能不仅出现在 Facebook,而且出现在任何使用 HTML5 消息传递的应用程序中,所以这也是所有这些的一般修复。

4

2 回答 2

7

好吧,我决定深入挖掘,并找到了这个问题的解决方案(和原因)。

首先,我使用 jsbeutifier ( http://jsbeautifier.org/ ) 以更易读的格式获取代码。错误来自一个名为 D 的函数。该函数作为处理程序添加到 HTML5 消息侦听器:

    window.addEventListener ? window.addEventListener("message", parseMessage, !1) : window.attachEvent("onmessage", parseMessage); 

(我在这里将 D 重命名为 parseMessage )

接下来,如果您查看 D (parseMessage) 函数,我们会看到代码尝试解析消息而不检查来源。

问题是,Facebook 也会向“消息”处理程序发送消息!如果您打印出所有消息,您可以看到这一点,所有错误实际上都是 SC api 试图解析 Facebook 消息!

解决方案是在解析消息之前检查来源(如 Opera HTML5 开发站点中所述:http ://dev.opera.com/articles/view/window-postmessage-messagechannel/ )

这是固定的“D”函数:

function D(a) {
        var b, c, d, e;

        if(a.origin == 'http://w.soundcloud.com'){
            try {
                c = JSON.parse(a.data)
            } catch (f) {
                console.log(f);
            }

            b = y(a.source);
            d = c.method;
            e = c.value;
            d === i.READY && (b ? (b.isReady = !0, C(b, k), v(k, b)) : m.push(a.source));
            if (!b || a.origin !== b.domain) return !1;
            var g = [];
            e !== undefined && g.push(e), C(b, d, g)
        }
    }

或者整个 um-ninified 解决方案:http: //jsfiddle.net/6uREk/1/

谢谢

于 2012-07-02T20:31:52.657 回答
1

找到了解决办法!

只需延迟加载soundcloud api asyc,不会出现错误..(奇怪的错误顺便说一句:/)

<script>
setTimeout(function(){

(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 = "http://w.soundcloud.com/player/api.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'sc'));
},2000);

(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=137624476258287";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
于 2012-06-19T17:57:02.250 回答