If the line starts with a U+003A COLON character (:)
Ignore the line.
If the line contains a U+003A COLON character (:)
Collect the characters on the line before the first U+003A COLON character (:), and letfieldbe that string.
Collect the characters on the line after the first U+003A COLON character (:), and letvaluebe that string. Ifvaluestarts with a U+0020 SPACE character, remove it fromvalue.
Process the fieldusing the steps described below, usingfieldas the field name andvalueas the field value.
Otherwise, the string is not empty but does not contain a U+003A COLON character (:)
Process the fieldusing the steps described below, using the whole line as the field name, and the empty string as the field value.
Once the end of the file is reached, any pending data must be discarded. (If the file ends in the middle of an event, before the final empty line, the incomplete event is not dispatched.)
The steps toprocess the fieldgiven a field name and a field value depend on the field name, as given in the following list. Field names must be compared literally, with no case folding performed.
If the field name is "event"
Set theevent namebuffer to field value.
If the field name is "data"
Append the field value to thedatabuffer, then append a single U+000A LINE FEED (LF) character to thedatabuffer.
If the field name is "id"
Set thelast event IDbuffer to the field value.
If the field name is "retry"
If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then interpret the field value as an integer in base ten, and set the event stream'sreconnection timeto that integer. Otherwise, ignore the field.
Otherwise
The field is ignored.
[Event Stream onmessage Event - data]
[Case 1]
data: 1
data: 2
data: 3
[Case 1's onmessage]
- onmessage 이벤트는 두번처리 됩니다.
- data: 1, data: 2 를 묶어서 하나의 이벤트로 그리고 data: 3 을 또 다른 이벤트로 처리 합니다.
- 결국, empty line 이 없이 바로 연결된 경우는 data buffer 에 메시지가 함께 들어가게 되는 구조 입니다.
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
Type name:
text
Subtype name:
event-stream
Required parameters:
No parameters
Optional parameters:
charset
Thecharsetparameter may be provided. The parameter's value must be "utf-8". This parameter serves no purpose; it is only allowed for compatibility with legacy servers.
Encoding considerations:
8bit (always UTF-8)
Security considerations:
An event stream from an origin distinct from the origin of the content consuming the event stream can result in information leakage. To avoid this, user agents are required to apply CORS semantics.[CORS]
Event streams can overwhelm a user agent; a user agent is expected to apply suitable restrictions to avoid depleting local resources because of an overabundance of information from an event stream.
Servers can be overwhelmed if a situation develops in which the server is causing clients to reconnect rapidly. Servers should use a 5xx status code to indicate capacity problems, as this will prevent conforming clients from reconnecting automatically.
Interoperability considerations:
Rules for processing both conforming and non-conforming content are defined in this specification.
Published specification:
This document is the relevant specification.
Applications that use this media type:
Web browsers and tools using Web services.
Additional information:
Magic number(s):
No sequence of bytes can uniquely identify an event stream.
File extension(s):
No specific file extensions are recommended for this type.
Macintosh file type code(s):
No specific Macintosh file type codes are recommended for this type.
※ 추가적으로 CORS 관련 문제는 이전에 작성한 PostMessage API 를 참고 하시면 좋을 것 같습니다.
JSONP 의 기초개념은 JSON String + CallBack 함수의 결합만 이해 하면 될 것 같습니다.
Request API 하나에 callback 함수를 지정해서 이걸 <script> 태그에 삽입하여 body 에서 callback 함수를 실행 하도록 하면 끝....
역시 모든 구현 예제 코드의 기본은 상단의 원문과 참고사이트의 코드를 기반으로 한 것입니다.
이를 가지고 응용하는 방법은 Biz 요구사항에 맞춰서 구현을 하시면 좋겠죠..
- Chrome 에서 테스트 된 것이구요.
- 관련 코드는 html 파일로 해서 서버에 올려 놓고 테스트 한 내용입니다.
- local file 형태로 실행 시키기면 동작 하지 않습니다.
- 동작하지 않는다는건 notification 의 show() 함수 실행 시 dialog 가 뜨지 않는다는 의미 입니다.
window.postMessage 는 cross domain 간 데이터를 주고 받는데 아주 유용한 기법을 제공 합니다.
자세한 spec 은.. 위 URL 참고 하시면 됩니다.
http://192.168.1.1/siteA.html
0. siteB 를 allow 할 allowOrigin 정의를 합니다.
var allowOrigin = "http://192.168.2.1";
1. siteB 에서 전송한 postMessage 이벤트를 catch 하기 위해서 event 등록을 합니다.
window.addEventListener("message", postMessageController, true); 또는
window.attachEvent("onmesage", postMessageController);
2. siteB 의 postMessage 이벤트를 catch 해서 실행 시킬 postMessageController 함수 작성을 합니다.
function postMessageController(e) {
if ( e.origin === allowOrigin ) {
// 실행 시킬 코드를 작성 하세요.
alert(e.data); // e.data 는 siteB 에서 전달 받은 message 입니다.
}
}
http://192.168.2.1/siteB.html
0. siteA 와 통신 하기 위한 allowOrigin 을 정의 합니다. (allowOrigin 은 그냥 임의 정의한 변수명 입니다. 바꾸셔도 되요.)
var allowOrigin = "http://192.168.1.1";
1. siteA 로 전달할 message 용 함수를 작성 합니다.
function sendMessage () {
window.parent.postMessage("Hi! Good to see you.", allowOrigin);
}
이 함수를 실행 시키면 siteA 의 postMessageController 가 동작 하게 됩니다.
이 두개 파일의 구조는 siteA.html 에 iframe 으로 siteB.html 을 embedded 시켜놓은 구조 입니다.
위의 샘플 pseudo code 는 siteB 에서 siteA 로 메시지를 전달 하는 예 입니다.
그렇기 때문에 siteA 에서 siteB 로 메시지를 전달하고 싶을 경우는 siteB 에 event 등록해 주시고 siteA 에서 iframe 의 window 객체를 얻어서 postMessage 를 실행 시키시면 됩니다.
HTML 5 defines three modes: quirks mode, limited quirks mode and no quirks mode, of which only the latter is considered conforming to use. The reason for this is due to backwards compatibility. The important thing to understand is that there are some differences in the way documents are visually rendered in each of the modes; and to ensure the most standards compliant rendering, it is important to ensure no-quirks mode is used.
Quirks mode는 오래된 웹 브라우저들을 위해 디자인된 웹 페이지의 하위 호환성을 유지하기 위해 W3C나 IETF의 표준을 엄격히 준수하는 Standards Mode를 대신하여 사용되는 웹 브라우저의 기술을 나타낸다. 같은 코드라도 웹 브라우저마다 서로 해석을 달리 하기 때문에, 전혀 다른 결과물을 보여주게 된다.