Whiteship's Note


[JQuery] J쿼리 이용해서 속성 값 변경하기, 엘리먼트 셀렉션, 이벤트 추가하기

View/JavaScript : 2009.05.27 16:13


attr을 사용하면 됩니다. 이전에 작성한 탭 만들기 글에서 a 엘리먼트의 onclick 속성을 사용하여, 자바스크립트 함수를 호출했었는데, J쿼리를 이용해서 그런 부분을 완전히 자바스크립트 쪽으로 떼어 낼 수 있게 되었습니다.

            $(document).ready(function() {
                $("#topnav a").bind("click", function () {
                    var id = $(this).parents("li").attr("id");
                    $("body").attr("class", id);
                });
            });

이 간단한 코드에 위 제목에서 언급한 모든 것들이 들어있습니다. 먼저, 이벤트 등록을 html에서 완전히 분리할 수 있게 도와주는 코드는 바로..

$(document).ready(function() {

});

이 녀석입니다. 이 안에서 이벤트 등록 작업을 해주면,

<a href="#" onclick="changeMenu('report');">

HTML에서 이런 코드를 작성하지 않아도 됩니다.

다음은 이벤트를 등록하는 코드입니다.

$("#topnav a").bind("click", function () {

});

그 전에 셀렉션을 보겠는데, #topnav a 이 부분은 topnav id를 가진 엘리먼트 하위의 a 엘리먼트를 모두 선택하라는 것입니다. API를 보면 더 다양한 방법들이 예제와 함께 잘 나와있습니다.

다시 이벤트 코드로 돌아가서 bind는 특정 이벤트에 어떠한 함수를 호출하도록 등록하는 함수인데, 이것을 특정 이벤트에 맞게 줄여서 다음과 같이 쓸 수도 있습니다.

$("#topnav a").click(function () {

});

간단하죠. click은 클릭하라는게 아니라 click 이벤트 핸들러를 등록하는 겁니다.

var id = $(this).parents("li").attr("id");

이 코드에서는 parents를 사용해서 자신을 감싸고 있는(여기서 자신은 사용자가 클릭한 a 엘리먼트겠죠.) 엘리머먼트 중에 li를 선택하고, 그 엘리먼트의 id 속성 값을 가져옵니다.

attr(속성이름)은 보시다시피 속성의 값을 가져오는 게터와 비슷합니다.

이와 반대로 세터 역할을 하는 함수도 역시 attr인데 사용법이 조금 다릅니다. 이번에는 인자를 하나 더 줍니다.

$("body").attr("class", id);

이렇게, attr(속성이름, 값) 형태로 사용하면 세터같이 동작합니다. 참~~ 편리하군요.


ps: 원래는 body의 class가 아니라 id를 변경하도록 코드를 작성했었는데, 잘 되지 않아서 class를 이용해봤는데 잘 동작하네요. 왜 그런지는 모르겠습니다. $(document).ready(function(){}); 이 것을 사용하지 않으면 id 변경도 잘 되는데 말이죠.. 저것과 관련이 있어 보입니다.
top

  1. Favicon of https://yangwansu.tistory.com BlogIcon 양완수 2009.05.28 10:39 신고 PERM. MOD/DEL REPLY

    추측컨데 이미 존재하는 id를 중복되게 생성해서 나오는 문제가 아닐까요?

    Favicon of http://whiteship.me BlogIcon 기선 2009.05.28 13:54 PERM MOD/DEL

    id 중복 생성이라~ 흠.. 몰겠네요. @_@

Write a comment.


ApplicationEvent 사용 예

Spring/Chapter 3 : 2007.03.16 18:53


ApplicationContext를 중개자 삼아서 Event를 발생시키거나 처리 할 수 있습니다. Event는  ApplicationEvent 클래스를 상속하여 만들 수 있으며 Event를 처리 할 클래스는 ApplicaionListener 인터페이스를 구현하면 됩니다.

Reference에 나와있는 예제는 email을 보낼 때 Black List에 있는 email 주소로는 email을 보내지 않고 BlackListEvent를 발생시키고 이 이벤트가 발생하면 담당자에게 알리도록 하는 핸들러가 작동하게 됩니다.

먼저 ApplicationEvent를 상속하여 BlackListEvent를 만들겠습니다.
import org.springframework.context.ApplicationEvent;

public class BlackListEvent extends ApplicationEvent {

    private String message;

    public BlackListEvent(Object souce, String message) {
        super(souce);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
이 때 ApplicationContext의 생성자가 주의해야 합니다. 인자가 하나인 생성자 하나밖에 없기 때문에 super()를 사용해서 명시적으로 호출해 줘야 합니다.

다음은 ApplicationListener를 구현하는  BlackListEvent를 처리할 BlackListNotifier를 만들겠습니다.
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class BlackListNotifier implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof BlackListEvent)
            System.out.println("메일 보내지마~");
    }
}
구현해야 할 메소드는 onApplicationEvent 하나 입니다.

그럼 이제 위에서 만든 BlackListEvent를 특정 상황에서 발생시켜야 하는데요. ApplicationContext의 publishEvent() 메소드를 이용하면 됩니다. 그럼 이벤트를 발생 시킬 클래스에서 ApplicationContext를 알고 있어야 하니까 ApplicationContextAware 인터페이스를 구현해야겠습니다.
ApplicationContextAware 인터페이스를 구현한 EmailBean을 만듭니다.
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class EmailBean implements ApplicationContextAware {

    private List blackList;

    private ApplicationContext ctx;

    public void setBlackList(List blackList) {
        this.blackList = blackList;
    }

    public void setApplicationContext(ApplicationContext ctx) {
        this.ctx = ctx;
    }

    public void sendEmail(String address, String text) {
        if (blackList.contains(address)) {
            BlackListEvent evt = new BlackListEvent(address, text);
            ctx.publishEvent(evt);
            return;
        }
        // send email...
    }
}

이제 BlackListEvent를 실제 발생 시키고 화면에 메시지가 출력 되는지 확인해 봐야 합니다. 그럼 먼저 EmailBean을 context에 등록하고 EmailBean의 blackList에 이벤트를 발생시킬 이메일 주소를 넣어줍니다. 그리고 Event를 핸들링할 bean을 설정해 줍니다.

      <bean id="emailBean" class="event.EmailBean" >
          <property name="blackList">
              <list>
                  <value>monster@email.com</value>
              </list>
          </property>
      </bean>

    <bean id="blackListListener" class="event.BlackListNotifier" />

그리고 이벤트가 발생하는지 확인하기 위해서 monster@email.com으로 간단한 메시지를 날려봅니다. 그럼 화면에는 "메일 보내지마~"라고 출력이 될 것입니다.
        EmailBean emailBean = (EmailBean) bf.getBean("emailBean");
        emailBean.sendEmail("monster@email.com", "I'm gonna kill u");

top

  1. Favicon of http://sehaeng.tistory.com BlogIcon 쌩이~ 2008.11.17 10:12 PERM. MOD/DEL REPLY

    주말에 공부하면서 테스트해보려고 했던건데

    자료 잘읽었습니다.^^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.11.17 11:02 신고 PERM MOD/DEL

    :)

Write a comment.