2010-07-12 3 views
3

사파리 확장 기능을 사용하고 있으며 사파리 확장 기능에서 동기 메시지 전달 방법이 있는지 궁금합니다.사파리 확장 기능에서 전달되는 동기 메시지

내 주사 된 자바 스크립트에서 글로벌 페이지로 메시지를 보내려면 결과가 반환 될 때까지 기다려야합니다. 내 코드를 글로벌 페이지에서 메시지를받는 다른 함수로 분할하는 것은 지나치게 복잡해 보입니다.

답변

4

"특별"canLoad 메시지를 사용할 수 있습니다. 기술적으로 이것은 메시지를 보내고 페이지의 요소가로드 될 수 있는지 여부와 관련된 값을 반환하기위한 것이지만 실제로는 다른 모든 것과 같은 방법으로 전역 HTML 페이지에서 응답하는 동기 메시지입니다. 당신은 대신 사용자 지정 메시지 이름을 전달하는 'canLoad'를라는 메시지를보고 싶은데 :

// injected script 
var myVar = safari.self.tab.canLoad(event); 

// global HTML file 
<!DOCTYPE html> 

<script type="text/javascript" charset="utf-8"> 
    safari.application.addEventListener('message', listen, true); 

    function listen(msgEvent) { 
    switch(msgEvent.name) { 
     case 'canLoad': 
     msgEvent.message = 'My return value'; 
     break; 
    } 
    } 
</script> 

당신은 개발 가이드의 canLoad 메시지에 대한 자세한 내용을보실 수 있습니다.

+1

canLoad 함수에 대해 읽었지만 첫 번째 인수는 beforeLoad 이벤트 객체 여야한다는 점을 기억합니다. beforeLoad 이벤트에 의해 코드가 트리거되지 않기 때문에이 코드를 사용할 수 없습니다. –

+0

동기식 canLoad 이벤트는 브라우저가 내용을로드하려고 할 때만 트리거됩니다. 그것은 동기 발생이 아니어야로드의 일부가 발생하는 것을 방지 할 수 없습니다. 다른 모든 형태의 통신은 비동기식입니다. – olliej

+1

똑똑한 오류 : "beforeLoadEvent new"로 dummy beforeLoad 이벤트 객체를 만들 수 있다고 생각합니다. 적어도 Safari 6.0.2에서 나에게 도움이되었습니다. –

0

Safari 개발자 포럼에서 같은 질문을 한 다른 사람이있었습니다. 요컨대, 당신은 할 수 없습니다. (저의 겸허 한 견해로는, canLoad의 기능은 완전히 바보입니다.)

그러나 가능한 한 고통을 없애기 위해 클로저를 사용할 수는 있습니다.

관련 문제