2011-04-07 3 views
0

내가 장고에 다음 뷰장고 simpleJSON jQuery.parseJSON 잘못된 라벨

def playingNow(request,playlist_id): 
    from django.db import connection 
    cursor = connection.cursor() 

    sql = "SELECT id, timestamp, song_played_id, playlist_from_id, now() - timestamp as timepassed FROM music_song_played \n"\ 
      "WHERE playlist_from_id = %s \n"\ 
      "ORDER by timepassed ASC \n"\ 
      "LIMIT 1;" 
    cursor.execute(sql,[playlist_id]) 
    data = cursor.fetchall() 
    songPlaying = get_object_or_404(song, id = data[0][2]) 
    playing = {} 
    playing["song"] = unicode(songPlaying) 
    playing["licensed"] = "Licensed by " 
    return HttpResponse(simplejson.dumps(playing), content_type ="application/javascript; charset=utf8") 

다음과 같은 템플릿

{% block content %} 

<script type='text/javascript' src='/media/inthebackground-utils.js'></script> 
<script type='text/javascript' src='/media/jwplayer/swfobject.js'></script> 
<script type='text/javascript' src='/media/jwplayer/jwplayer.min.js'></script> 
<script type='text/javascript' src='http://code.jquery.com/jquery-latest.pack.js'></script> 
<script type='text/javascript' src='/media/jquery.periodicalupdater.js'></script> 
<script type="text/javascript"> 
    var data = new Object(); 
</script> 


    <div id="StationName">Your Listening to: {{ station.name }} </div> 
    <div id="playingNow-{{ station.name }}"></div> 
    <div id='padder{{ station.name }}' style="height:20px; float left"></div> 
    <div id='mediaspace-{{ station.name }}'"><p> You dont have adobe flash player installed. Please download and install from <a href="http://get.adobe.com/flashplayer">here</a> </div> 

    <script type="text/javascript"> 

    data.{{ station.name }} = {'userid':'{{ user.pk }}', 'playlist' : '{{ station.pk }}'}; 

    $.PeriodicalUpdater('/music/playingNow/{{ station.pk }}/', 
        {method: 'get'}, 
        function(remoteData, success, xhr, handle) 
        { 

         jQuery.parseJSON(remoteData); 
         console.log(typeof(remoteData)); 
         console.log(remoteData); 
         licenceDiv = '<div id="licence">'+remoteData.license +'</div>'; 
         songDiv = '<div id="licence">'+remoteData.song +'</div>'; 
         contDiv = '<div id="playingNow-{{ station.name }}">' + songDiv + licenceDiv +'</div>'; 
         $('#playingNow-{{ station.name }}').replaceWith(contDiv); 
         jwplayer('mediaspace-{{ station.name }}').play(true); 
        }); 

    jwplayer('mediaspace-{{ station.name }}').setup({ 
     flashplayer: "/media/jwplayer/player.swf", 
     file: "{{ station.url }}?{{ cacheBuster }}", 
     height: 20, 
     width: 300, 
     controlbar: "bottom", 
     provider: "sound", 
     duration: "0", 
     events: { 
     onPlay: function(event){play(data.{{ station.name }});}, 
     onPause: function(event){pause(data.{{ station.name }});} 
     } 
    }); 

    $(window).unload(function() { pause(data.{{ station.name }}); }); 
    </script> 


{% endblock %} 

이 때 periodicalUpdater 화재와 GET, 그것은으로 JSON을 얻는다 않습니다 view 함수에서 문자열을 얻을 수 있습니다. 즉 일반적인 json 구조처럼 액세스 할 수 있습니다. 그리고 jQuery.parseJSON 파이어 폭스 파이어 버그를하려고 할 때 "잘못된 라벨"오류가 발생합니다. jquery가 JSON 대신 JSONP를 기대하고 있기 때문에 이것이 가능한 곳을 몇 군데 읽었습니다. 그러나 이것을 고치는 방법을 모르겠다.

아이디어가 있으십니까?

건배

마크

답변

0

보십시오 : 대신 JSONP 사용하는 아약스 호출을 말해야한다

... 
$.PeriodicalUpdater('/music/playingNow/{{ station.pk }}/', 
       {method: 'get', 
       type: 'jsonp'}, 
       function(remoteData, success, xhr, handle) ... 

.

참고 : 면책 조항으로 본인은 실제로이 라이브러리를 사용하지는 않았지만 jQuery 자동 업데이터에 관심이 많았 기 때문에이를 조사했습니다. 여기에 문서를 보면 :

https://github.com/RobertFischer/JQuery-PeriodicalUpdater/

우리가 정규 jQuery를 Ajax 호출을 사용하며 다음 Ajax 호출로 전달받을 것을 PeriodicalUpdater 매개 변수를 지정할 수 있습니다 볼 수 있습니다. PeriodicalUpdater의 type 필드는 그 문서 여기에서 발견되는 jQuery를 아약스 호출에서 dataType 필드에 해당 될 것으로 보인다 :

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

+0

환호 내가 그것을 확인해 보겠습니다. 부수적으로, 나는 분노로 PeriodicalUpdater를 사용하지 않았지만 지금까지 dev에서 꽤 잘 작동한다. 나는 많은 클라이언트로부터 얼마나 많은 부하가 발생하는지 아직 보지 못했지만 전체적으로 꽤 좋은 구현처럼 보인다. –

+0

는 그것을 줬다, unfortunatly 히 didnt는 문제를 해결한다. 나는 여전히 잘못된 라벨 오류가 발생합니다. –

+0

서버에서 반환 된 데이터는 어떻게 생깁니 까? jsonp를 사용하여, 나는 그것이 유효한 자바 스크립트 객체로 되돌아오고 그것을 파싱 할 필요조차 없다고 생각한다. 비슷한 질문이 스레드를 참조하십시오 : http://stackoverflow.com/questions/3543513/how-to-parse-jsonp-data-returned-from-remote-server – Spike