이거 완전 신기하네요-_-;
HTMLLoader라는 클래스가 AIR전용으로 있는데요.
HTML을 읽어와서 보여주는 역할 뿐아니라 JAVASCRIPT함수를 호출할 수 있으며(ActionScript3에서 자바스크립트 문법을 그대로 사용할 수 있는 듯 합니다-_- 아직많이 해보지는 않았지만-_-), 물론 자바스크립트 프레임워크 메소드도 호출이 가능하겠죠.

한번 해보니 잘 되네요-_-;

AIR로 프로젝트를 만들고, src폴더에 prototype-1.6.0.2.js 파일을 넣구요.
prototypetest.html파일을 아래와 같이 작성했습니다.
[code]
<?xml version="1.0" encoding="EUC-KR" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>AIR와 JAVASCRIPT(prototype)연동</title>
<script src="prototype-1.6.0.2.js" type="text/javascript"></script>
</head>
<body>
<div id="myDiv">
안녕하세요!<br />
후....추석날 뭔짓이냐..-_-;
</div>
</body>
</html>
[/code]
저기 DIV내용을 FLEX로 가져오겠습니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            private var _htmlLoader:HTMLLoader;
           
            private function clickHandler():void
            {
                _htmlLoader = new HTMLLoader();
                _htmlLoader.addEventListener(Event.COMPLETE, completeHandler);
                _htmlLoader.load(new URLRequest("prototypetest.html"));
            }
           
            private function completeHandler(event:Event):void
            {
                Alert.show(_htmlLoader.window.$("myDiv").innerHTML);
            }
        ]]>
    </mx:Script>
   
    <mx:Button label="DIV내용을 프로토타입함수 사용해서 가져오기" click="clickHandler()"/>
   
</mx:WindowedApplication>
[/code]
간단합니다. HTMLLoader를 이용해서 HTML파일을 읽어와서 다 읽어오게 되면, HTMLLoader객체에 포함되어있는 window라는 property가 있는데 이것을 이용해서 prototype함수를 호출하면 됩니다.
$('') 요게 먹힙니다-_-; 아래는 결과입니다.
사용자 삽입 이미지

우선 이게 되서 제가 기쁜게...Oauth인증이.....AIR에서 안되더라구요-_-;
AIR에서도 되는군요-_-; 다시 시도를...-_-;
근데, 신기하게 JAVASCRIPT에서는 되더라구요. 그래서 왠지 JAVASCRIPT를 이용해서 인증하고 사용하면 될 것 같은 느낌이 들어서 시도해보려고 해요. 망할..Oauth-_-;

 
Posted by 머드초보

댓글을 달아 주세요

  1. 2010.10.05 14:10  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 머드초보 2010.11.05 19:27  댓글주소  수정/삭제

      htmlloader에서 데이터를 가져오려면 js방법말고는 없는 걸로 알고 있습니다만ㅠㅠ
      저도 잘모르겠네요ㅠㅠ

  2. 2012.06.01 10:15  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. BlogIcon 찌질개발자 2012.06.01 10:33  댓글주소  수정/삭제  댓글쓰기

    질문이 있어서요.. 위의 글 내용은 AIR에서 html을 가볍게 불러올수있다고 하셨는데.. 그럼 요즘의 HTML5도 불러올수있나요? 제가 알기엔 html과 좀 달라서 htmlloader로는 안된다고 하고, 제가 해봣는데 안되네요.. 혹시 아시면 알려주실수있으시나요? 아니면 TIP이라도..

 
우선 구글날씨API는 XML으로만 제공을 합니다.
자바스크립트에서는 외부사이트에 있는 XML파일을 불러올 수 없습니다.
그래서 저 XML을 JSON으로 바꿔줘야합니다.
XML을 JSON으로 바꿔주는 것은 야후파이프로 합니다.

야후파이프란? 외부에 있는 데이터들을 모아서 자기만의 아웃풋을 만들 수 있는 사이트!
예를 들어, A사이트의 RSS와 B사이트의 RSS를 모아서 이쁘게 정렬해서 1개의 RSS로 만들고 싶다! 라면, 야후파이프로 가능합니다. 야후파이프로 이쁘게 그려주기만 하면 되죠. 두개의 RSS사이트를 가져다 놓고, OUTPUT으로 그냥 선만 그어주면 됩니다.
또 다른 기능은 해당 데이터를 JSON으로 출력해주도록 할 수 있습니다. 파이프로 만든 주소에 파라메터값 _render를 json으로만 바꿔주면 json을 리턴하는 주소를 만들 수 있습니다. json으로 리턴하는 주소가 있다는 얘기는 javascript에서 불러와서 사용할 수 있다는 얘기죠.
야후파이프는 나중에 포스팅을....-_-;

야후파이프 주소 : http://pipes.yahoo.com/pipes/

javascript framework은 prototype으로....(이것밖에 할 줄 모름 ㅠ)
[code]
var GoogleWeatherWidget = Class.create();

GoogleWeatherWidget.prototype = {
    initialize: function(contentDiv) {
        $(contentDiv).addClassName('content-div');
        var locationDiv = new Element('div', {id: 'location'});
        var tempcDiv = new Element('div', {id: 'tempc'});
        var conditionDiv = new Element('div', {id: 'condition'});
        var windDiv = new Element('div', {id: 'wind'});
        var iconDiv = new Element('div').insert(new Element('img', {id: 'icon'}));
        $(contentDiv).insert(locationDiv);      $(contentDiv).insert(tempcDiv);
        $(contentDiv).insert(conditionDiv);    $(contentDiv).insert(windDiv);
        $(contentDiv).insert(iconDiv);
       
        this.pollingListener = this.pollingProc.bindAsEventListener(this);
        new PeriodicalExecuter(this.pollingListener, 60);   
        this.pollingProc();
    },
   
    pollingProc: function() {
        var url = 'http://pipes.yahoo.com/pipes/pipe.run?'
        url += '&_id=eBxyJgZh3RGQLC8B6icw5g';
         url += '&_render=json';
         url += '&location=incheon';
         url += '&_callback=parseResponse';
        // 이놈을 추가하면 캐쉬에서 안불러오고 계속해서 불러오는군요 ^^
        url += '&' + Math.round(Math.random()* (new Date().getTime()));
       
        if ($('weatherInfo')) {
            $('weatherInfo').remove();   
        }
        var weatherInfo = new Element('script',{
            id: 'weatherInfo',
            type: 'text/javascript',
               src: url});
        $$('head')[0].insert(weatherInfo);
    }
}

function parseResponse(data) {
    $('location').update(data.value.items[0].location);
    $('tempc').update(data.value.items[0].tempc + '℃');
    $('icon').src = 'http://www.google.co.kr/ig/' + data.value.items[0].icon;
    $('condition').update(data.value.items[0].condition);
    $('wind').update(data.value.items[0].wind);
}
[/code]
소스를 분석해보면, new PeriodicalExecuter(this.pollingListener, 60);부분에서 60초마다 this.pollingProc을 수행하겠다는 얘기입니다. 핵심은 pollingProc입니다.
pollinProc을 보면,
var url = 'http://pipes.yahoo.com/pipes/pipe.run?'
       url += '&_id=eBxyJgZh3RGQLC8B6icw5g';
        url += '&_render=json';
        url += '&location=incheon';
        url += '&_callback=parseResponse';
우선 제가 만든 야후파이프인데요. 구글날씨API를 이용해서 JSON으로 변환한 파이프입니다.
location값으로 지역값을 받도록 했구요. callback함수는 parseResponse로 했습니다. url이 head에 붙으면, parseResponse가 호출이 됩니다.

parseResponse를 보면, 해당 div에 값을 업데이트 시켜주는 방식으로 되어있습니다.
결론은.....xml로 리턴하는 RSS나 다른 API정보들도 웹에서 javascript를 이용하면 불러올 수 있다? 정도?-_-;
아래는 위젯......위젯 그까이꺼......심플해야지....-_-; 초간단 날씨위젯!


절대...그냥 표시한 거 아닙니다-_-; 구글에서 긁어와서 보여주는 겁니다-_-;
 
Posted by 머드초보

댓글을 달아 주세요

  1. 머드초보 2008.08.05 08:32  댓글주소  수정/삭제  댓글쓰기

    캐쉬문제가 있는지 이상하게 리프레쉬가 안되네-_-;

    • 머드초보 2008.08.05 08:46  댓글주소  수정/삭제

      아 캐쉬문제는 여기처럼 하면 되는군요 ^^
      http://utsman.tistory.com/89
      url을 유니크하게 날려주면 해결이 되는군요.
      캐쉬가 참 여러가지로 힘들게 하는군요.

      혼자서 댓글달고....혼자서 댓글에 댓글달고...-_-;

  2. BlogIcon 검쉰 2008.08.05 10:01  댓글주소  수정/삭제  댓글쓰기

    저도 달아드릴께요~ ㅎㅎ
    근데, 날씨가 구라청보다 정확한지 궁금하네요 ㅎ

  3. 박스농사 2009.03.31 17:20  댓글주소  수정/삭제  댓글쓰기

    혹 저방법외에 다른방법은 없을까요?
    다른문제이긴 하지만...
    J2EE서버를 내렷다가 올리면 캐쉬내용이 사라지겟죠?
    근데 왜 안사라지지 ㅠ_ㅠ
    하나씩 다 내렷다가 올리는중인데..계속 살아있군요 망할xml

    • 머드초보 2009.04.03 23:10  댓글주소  수정/삭제

      안녕하세요~
      저는 저 방법밖에 모르겠네요 ㅠ
      xml이 바뀌었는데, 그 전내용을 불러오는 문제인가요?
      url만 다르게 불러오면 되던데...잘 모르겠네요 ㅠ

  4. 아이린 2009.07.07 03:59  댓글주소  수정/삭제  댓글쓰기

    이미지가 안보여서 살펴보니, 경로가
    http://www.google.co.kr/ig//ig/images/weather/mostly_cloudy.gif
    처럼 되어있더군요... /ig/ 부분이 중복되어 있습니다.

    아뭏든, 많은 참고가 되었습니다.

    • 머드초보 2009.07.13 14:59  댓글주소  수정/삭제

      와 감사합니다 ^^
      이거 또 언제 바뀌었지-_-
      올렸을 때엔 잘 됐었는데 ㅠㅠ 감사합니다 ^^

 
한 1주일 고생했습니다.
IE에서는 왜 동적으로 테이블을 생성하면 안나오지?-_-;

[code]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Insert Test</title>
        <script src="lib/prototype/prototype.js" type="text/javascript">
        </script>
        <script>
            function init(){
                var table = new Element('table', {border: 1});
               
                for (var i = 0; i < 5; i++) {
                    var tr = new Element('tr');
                    for (var j = 0; j < 5; j++) {
                        var td = new Element('td');
                        td.update((i*8+j) + '번');
                        tr.insert(td);
                    }
                    table.insert(tr);
                }
                $('div').insert(table);
            }
        </script>
    </head>
    <body onload="init();">
        <div id="div"></div>
    </body>
</html>
[/code]
이렇게 하면 FF(FireFox)에서는 잘 나오는데, IE에서는 보이지 않습니다.
웃긴건 IE에서 div.innerHTML을 alert으로 찍어봐도 테이블 태그가 잘 나옵니다.

신기하게 이걸 tbody태그로 한번 감싸주면 잘 됩니다.
[code]
<script>
    function init(){
        var table = new Element('table', {border: 1});
        var tbody = new Element('tbody');
        for (var i = 0; i < 5; i++) {
            var tr = new Element('tr');
            for (var j = 0; j < 5; j++) {
                var td = new Element('td');
                td.update((i*8+j) + '번');
                tr.insert(td);
            }
            tbody.insert(tr);
        }
        table.insert(tbody);
        $('div').insert(table);
    }
</script>
[/code]
이렇게 tbody로 한번 감싸주면 잘 나옵니다.
tbody용도는
http://www.sunslife.com/bbs/view.php?id=2002&no=1620
이 사이트에서 확인할 수 있습니다.
thead, tfoot, tbody 테이블을 세단계로 나눌 때 사용하는건데...왜 저걸 하면 IE에서는 보이는거지?-_-;


 
Posted by 머드초보

댓글을 달아 주세요

 
Aptana로 javascript로 삽질중에-_-; 좀 쉴겸해서-_-;

AIR는 기존에 우리가 알던 html, ajax, javascript등을 이용해서 데스크탑 애플리케이션을 개발할 수 있습니다. 전에 다음openapi를 이용하고, prototype기반인 다음블로그검색을 만들었었습니다.

http://mudchobo.tomeii.com/tt/269

이 코드를 거의 그냥 이용해서 AIR애플리케이션으로 바꿀 수 있습니다.
우선 Aptana를 설치해야합니다.

http://mudchobo.tomeii.com/tt/241
여기에 Aptana설치 후기가 있습니다-_-;
기본으로 AIR프로젝트 만드는 건 안깔려있으니 따로 설치해야합니다. 글을 잘 읽어보시면 설치하기 쉽습니다^^

이제 프로젝트를 만들어봅시다.
File -> New - Project선택하면 Aptana Projects폴더에 -> Adobe AIR Project선택.
Project이름은 DaumBlogSearchAir라고 합시다-_-;
다음을 하면 뭔 옵션이 이래 많아-_-; XML파일을 사전에 설정할 수 있게 해놨는데 걍 디폴트로 해서 해봅시다.
마지막 다음으로 가면 javascript framework를 선택할 수 있습니다.
Prototype을 가볍게 체크해고 Finish를 누릅시다.

처음부터 뭔 쌤플로 자동으로 작성한게 많은지-_-;
DaumBlogSearchAir.html파일을 열어보면 코드가 많습니다. 가볍게 다 지워버리고-_-;
DaumBlogSearchAir.html
[code]<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Daum Blog Search</title>
        <link href="sample.css" rel="stylesheet" type="text/css"/>
        <script type="text/javascript" src="AIRAliases.js"></script>
        <script type="text/javascript" src="lib/prototype/prototype.js"></script>
        <script type="text/javascript" src="js/DaumSearch.js"></script>
    </head>
    <body>
        <h1>Daum Blog Search!</h1>
        <form onsubmit="searchDaum(this.query.value); return false;">
            <fieldset>
                <label>Search for</label>
                <input type="text" name="query" /><input type="submit" value="검색" />
            </fieldset>
        </form>
        <div id="results"></div>
    </body>
</html>
[/code]
요렇게 작성합니다.
그럼 이제 우리가 작성할 것은 js폴더에 있는 DaumSearch.js파일 입니다.
작성해봅시다.
DaumSearch.js
[code]
function searchDaum(query){
    var searchPacket = {
        method: 'get',
        parameters: {
            q: query,
            result: '10',
            start: '1',
            output: 'json',
            apikey: '발급받은 apikey',
        },
        onSuccess: parseResponse
    }
    new Ajax.Request('http://apis.daum.net/search/blog', searchPacket);
}


function parseResponse(data){
    var children;
    var results = $("results");
   
    while (results.hasChildNodes()) {
        results.removeChild(results.lastChild);
    }
   
    var json = data.responseText.evalJSON();
   
    // 개수를 air에서 제공하는 trace로 찍어보자-_-;
    air.trace(json.channel.result);
   
    for (var i = 0; i < json.channel.result; i++) {
        var title = json.channel.item[i].title;
        var summary = json.channel.item[i].description;
        var url = json.channel.item[i].link;
       
        var link = new Element("a", {
            "href": url,
            "target": "_blank"
        }).update(title);
        var header = new Element("h2").insert(link);
        var para = new Element("p").update(summary);
       
        results.insert(header);
        results.insert(para);
    }
}
[/code]
간단합니다. 그냥 다음에 url요청해서 데이터를 받아서 parseResponse메소드가 파싱하죠.
그리고, airaliases.js파일을 선언하면 air객체를 사용할 수 있는데, 기존 Flex에서 제공하는 몇몇 기능을 사용할 수 있습니다. Socket도 있고, File관련된 것도 있군요. 이건 나중에 공부해야겠군요.
air.trace하면 로그를 남길 수 있습니다.
아직 Aptana에서 디버깅이 안되기 때문에-_-;(완전 최악-_-) trace를 열심히 찍어줘야할 겁니다-_-;

실행을 해봅시다.
Ctrl + F11누르면 실행됩니다.

사용자 삽입 이미지

음....근데 <b>가 나오네. 왜그러지-_-;

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 검쉰 2008.06.27 18:03  댓글주소  수정/삭제  댓글쓰기

    디버깅이 안되는군요.. 안습;

    • 머드초보 2008.06.30 22:11  댓글주소  수정/삭제

      검쉰님 반가워요~
      아네 ^^ 디버깅이 안돼요 ^^ 디버깅만 되도 뭔가 해보려고 하겠는데 에러도 잡기힘든 자바스크립트라 ^^