CSS의 :visited pseudo-class가 흘릴지도 모를 사적인 방문 기록 노출에 대한 염려로 인해서 이 문제에 대한 처방으로 IE6-8과 Opera 11.52를 제외한 지금의 모든 최신 브라우저에선 :visited에 선언된 properties 중 color property만이 적용되고 나머진 그냥 무시한다.

자세한 설명은 이 문제를 먼저 제시해서 알게 된 인용 문서를 참고: Limitations on Styling Visited Links

덩달아 JavaScript에서 사용자가 방문했던 링크의 color property를 window.getComputedStyle을 써서 얻으려 할 때에도, 당연히 history sniffing 문제로 대신에 그냥 보통 :link에 선언된 color 값을 돌려준다.

결국, 이러한 상황에서 :visited pseudo-class엔 다른 것은 건들 필요없이 적당한 color 값만 지정해 줘도 충분하다는 얘기.

그런데 유독 Opera만이 최신 버전에서도 다른 브라우저와 달리 예외적인 모습을 보여주는데, Opera에서 이 문제와 관련한 history sniffing을 막으려면 Opera Community 포럼에서 논의된 내용으로 주소창에다 opera:config#VisitedLink|VisitedLinksState를 입력하고서, Visited Links State 값을 기본값인 2에서 1 혹은 0 값을 주면 된단다. (0 – disable :visited links state, 1 – match same domain only.)

Steve Jobs

어쩌면 당신의 영감이 만들어 낸 창조물이 아니었다면, 저의 가장 개인적인 공간, 바로 이곳은 존재하지도 않았을 겁니다.

처음 마주친 매킨토시. 그 9인치 작은 흑백 화면에서 보여주던 그림은 저에겐 꿈속의 동화 같은, 바라볼 때마다 상상력을 불러일으켜서 훨씬 드넓고 새로운 세상으로 인도하는 느낌이었습니다. 맥과의 만남 이후로 계속 이어진 인연은 벌써 20년이 흘렀군요.

너무나 일찍 떠나셨지만, 당신의 영감으로 시작된 그 푸근한 기술과 꿈의 조화로 만들어낸 결과물은 다음 세대에도 계속 이어질 것이라고 믿습니다.

Apple and Steve Jobs

편히 쉬세요.
고맙습니다. 그리고 그리울 겁니다. 

Being the richest man in the cemetery doesn’t matter to me. Going to bed at night saying we’ve done something wonderful… that’s what matters to me.

~ Steve Jobs

꼬리표:

JavaScript 파일은 페이지 로딩 속도 측면에서 페이지의 body가 닫히기 바로 전에 추가해 주는 것이 가장 좋은데, WordPress에 기본적으로 추가된 jQuery는 꼭대기 head 부분에 붙어 있다.

이놈을 맨 아랫부분에 추가하려면, 테마 파일에 있는 functions.php 파일을 열고 WordPress의 wp_register_script()wp_enqueue_script() function을 사용하는 다음과 같은 코드를 추가해 준다.

<?php
function my_scripts_enqueue() {
  wp_deregister_script('jquery');
  wp_register_script('jquery', "http" . ($_SERVER['SERVER_PORT'] == 443 ? "s" : "") . '://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', false, NULL, true);
  wp_enqueue_script('jquery');
}    

if (!is_admin()) add_action('wp_enqueue_scripts', 'my_scripts_enqueue', 11);
?>

여기에 있는 wp_register_script() function의 parameter 중 네 번째와 다섯 번째가 중요한 요소인데, 각각 $ver$in_footer 변수를 의미한다.

$ver 변수는 보통 JavaScript 파일 경로의 마지막 부분에 query string처럼 붙으면서 JavaScript 파일이 갱신되었을 때 caching된 것의 사용을 막으려고 사용되는데, jQuery처럼 Google CDN에서 불러올 때는 오히려 방해되므로 NULL 값을 줘서 없애버린다. 그리고 $in_footer 값에 true를 주면 JavaScript가 body 맨 마지막 부분에 붙게 된다.

말장난으로 시작한 제목과는 달리 역설적으로 JavaScript에선 global space를 더럽히는 일은 죄악처럼 여겨진다. 특히나 통제할 수 없는 다른 사람이 작성한 JavaScript 코드가 섞여들어 갈 가능성이 큰 Client-Side JavaScript에선 더욱 그러하다.
그래서 뜻하지 않는 이런 실수를 저지르지 않으려면 변수가 global 해지는 경우를 정확하게 알고 있어야 하는데, 그 예로 다음과 같은 몇 가지 경우가 있다.

var로 시작되지 않는 변수 선언.

잘 알려진 내용으로 var 없이 선언된 변수는 global object의 properties에 붙게 된다.
참고로, 이렇게 만들어진 property는 var 선언문으로 생성된 property와는 다르게 다시 나중에 delete로 지울 수 있다.

var x = 1;      // A properly declared global variable, nondeletable.
y = 2;          // Creates a deletable property of the global object.
this.z = 3;     // This does the same thing.
delete x;       // => false: variable not deleted
delete y;       // => true: variable deleted
delete this.z;  // => true: variable deleted

다음은 JavaScript의 delete operator 작동 원리에 대한 자세히 설명해놓은 글. – Perfection Kills – Understanding delete

글 마저 읽기 »