2012-06-18 3 views
2

내가 여기에있는 SC의 HTML 5 API를 설정하기 위해 노력하고있어 작동하지 : 그것은 던지고 그러나사운드 클라우드 HTML5 API는 페이스 북 JS가

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

"C는 정의입니다"오류 (7 회) 파이어 버그에.

을 파고의 비트는이 같은 비동기 페이스 북 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로 인해 사운드 클 라우드에서 오류가 발생합니다.


내 솔루션은 아래,이 오류 페이스 북에 대한,하지만 HTML5 메시징을 사용하는 모든 응용 프로그램뿐만 아니라 나타날 수있는 추가 한, 그래서 이것은뿐만 아니라 모든 사람에 대한 일반적인 수정합니다.

+0

나는이 문제를 재현 할 수 없습니다. 이 테스트 할 수있는 html 페이지에 대한 링크를 제공 할 수 있습니까? –

답변

7

이 잘 나는 좀 더 깊이 파고하기로 결정하고, 해결책을 발견했다 (그리고 원인).

먼저 jsbeutifier (http://jsbeautifier.org/)를 사용하여 더 읽기 쉬운 형식으로 코드를 가져 왔습니다. 이 오류는이 기능은 HTML5의 메시지 리스너에 핸들러로 추가되고 있던 D.라는 함수에서 오는되었습니다

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

(내가 여기 parseMessage하는 D 이름을 바꾼)

다음, 당신은에 보면 D (parseMessage) 함수를 사용하면 코드가 원본을 확인하지 않고 메시지를 구문 분석하려고합니다.

문제는 페이스 북도 "메시지"처리기로 메시지를 보냅니다. 모든 메시지를 인쇄하면이 오류를 볼 수 있습니다. 모든 오류는 사실 SC API가 Facebook 메시지를 구문 분석하려고 시도하는 것입니다.

용액 (오페라 HTML5 데브 사이트에 설명 : http://dev.opera.com/articles/view/window-postmessage-messagechannel/) 메시지를 파싱하기 전에 출처를 확인하는 것이다

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) 
     } 
    } 

또는 전부 여기

고정 "D"기능은 음 - ninified 솔루션 : http://jsfiddle.net/6uREk/1/

감사 T

+0

감사합니다.이 버그를 해결하기 위해 최선의 노력을 다했습니다.문제가 없는지 SC에 버그 보고서를 게시했습니다. – digitalpencil

1

해결책을 찾았습니다!

그냥 지연과 사운드 클라우드 API를 asyc을로드하고 오류가 eccour 없습니다 .. (BTW 이상한 버그 /는)

<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> 
+0

http://jsfiddle.net/XpeaZ/ - 참조 용 –

+1

이것에 대한 귀하의 노력에 감사드립니다! 나는 곧 그것을 시험 할 것이다. – Totomobile

+1

불행히도, 같은 오류가 여전히 작동하지 않습니다. Soundcloud 코드에 오류가 있다고 생각되면 알려주도록 연락을 시도합니다. 당신의 도움을 주셔서 감사합니다! – Totomobile

관련 문제