function load() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); var elScript = document.createElement("script"); elScript.src = "http://0.0.0.0:3000/photos/jscallback"; document.body.appendChild( elScript ); } }여기엔 트릭이 있는데, Ajax는 오직 같은 도메인에 있는 서버에만 접근할 수 있다. 하지만 ‘script’ 태그는 어디든 가리킬 수가 있다. 그래서 이 코드에 어떤 도메인이나 페이지를 넣어도 (0.0.0.0.:3000 이 아닌, 어떤 것을 가져올 수 있는URL이라면) 이것은 여전히 작동할 것이다.
var g_photos_cb = []; function photos_callback( photos ) { while( g_photos_cb.length > 0 ) { var cb = g_photos_cb.pop(); cb( photos ); } } function photos_get( cb ) { g_photos_cb.push( cb ); var elScript = document.createElement("script"); elScript.src = "http://0.0.0.0:3000/photos/jscallback"; document.body.appendChild( elScript ); }라이브러리 사용자들은 photos_get을 호출하는데 이 때 photos 데이터를 가져오고, 이를 가지고 무언가 처리를 할 함수를 같이 전달한다. 동작은 매우 단순하다. 그것은 단지 콜백을 받아서 이를 배열에 넣고 앞에서 한 것처럼 script 태그를 똑같이 만든다. 콜백으로는 photos 데이터에 대해 다르게 사용자-정의된 콜백함수들이 호출될 것이다.
function load() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); photos_get( function( photos ) { for( var b = 0; b < photos.length; b++ ) { if ( b == 0 ) map.setCenter(new GLatLng( photos[b].attributes.latitude, photos[b].attributes.longitude ), 13); map.addOverlay( buildMarker( photos[b].attributes.title, photos[b].attributes.url, photos[b].attributes.description, photos[b].attributes.latitude, photos[b].attributes.longitude ) ); } } ); } }여기에 라이브러리의 한 가지 문제점이 있는데, Internet Explorer는 페이지가 완전히 로드되어지기 전에 body 태그에 여러분이 태그들을 추가한 곳을 페이지에서 날려버리는 이상한 취미가 있다. 이걸 피하기 위해 IE에도 견고해지도록 코드를 살짝 수정할 것이다. 매쉬업하기 편한 photos 라이브러리 최종 버전이 [리스트 13]이다.
var g_photos_cb = []; var g_photos_loaded = false; window.addEventListener( "load", photos_onload ); function photos_onload() { photos_process_requests(); g_photos_loaded = true; } function photos_process_requests() { if ( g_photos_cb.length > 0 ) { var elScript = document.createElement("script"); elScript.src = "http://0.0.0.0:3000/photos/jscallback?d="+(new Date().valueOf()); document.body.appendChild( elScript ); } } function photos_callback( photos ) { while( g_photos_cb.length > 0 ) { var cb = g_photos_cb.pop(); cb( photos ); } } function photos_get( cb ) { g_photos_cb.push( cb ); if ( g_photos_loaded ) photos_process_requests(); }코드는 윈도우에서 ‘onload’ 메시지에 latch를 걸어둔다. 그렇게 하면, script 태그들은 onload 메시지가 보내지는 단 한번만 추가된다. onload 메시지가 이미 보내졌다면, 서버에 바로 request만 보낸다.
이전 글 : 레일즈로 만드는 매쉬업하기 좋은 사이트(2)
다음 글 : 펄 20주년, 그와 관련된 여러가지 추억들
최신 콘텐츠