2011-05-06 5 views
0

URL을 저장하고 태그를 적용 할 수있는 웹 페이지 (PHP에서는이 문제가 PHP에는 포함되지 않지만)가 작성되므로 URL을 검색 할 수 있습니다. 태그별로.링크 대상을 동적으로 설정하면 아무 반응이 없음

URL을 새 탭으로 열 것인지 또는 기본적으로 JavaScript 탭과 같은 탭을 자바 스크립트와 쿠키로 열 것인지를 지정하는 확인란을 설정하는 기능을 추가하려고했습니다. 체크 박스는 페이지 로딩 사이에 상태를 올바르게 유지하지만 링크에는 target = "_ blank"가 주어지지 않습니다.

나는 모든 URL에 "아웃 바운드"클래스를 부여했으며 문서화되지 않은 약간의 document.getElementsByClassName() 함수를 사용하여이 클래스의 모든 링크를 가져 왔으며이 파트가 제대로 작동 함을 확인했습니다. 페이지의 URL 수와 동일한 크기의 링크 배열을 반환합니다.

는 여기에 내가 뭘하는지의 예 :

function onload() { 
    newtab = readCookie("newtab"); 
    if (newtab == null) { 
     createCookie("newtab", "true"); 
     newtab = "true"; 
    } 
    newtab = (newtab == "true"); 
    updateLinks(newtab); 
} 
function updateLinks(newtab) { 
    if (newtab) 
     target="_blank"; 
    else 
     target=""; 
    for (link in document.getElementsByClassName("outbound")) { 
     link.target = target; 
    } 
} 
function checkboxToggled(checkbox) { 
    updateLinks(checkbox.checked); 
} 

내가 모든 링크를 통해 루프 전에 '대상'제대로 updateLinks()에 설정되어있는 것을 확인했습니다. 아무도 실패 할 수있는 것에 관해 제안을 가지고 있습니까?

Google 크롬 (기본 브라우저)과 Firefox에서이 기능을 테스트했으며이 중 하나에서 제대로 작동하지 않았습니다. (이상하게도 파이어 폭스에서 "재귀"가 너무 많음)

답변

1

for 루프의 링크는 개체를 나타내지 않으며 단지 증분 값입니다.

for (link in document.getElementsByClassName("outbound")) { 
     document.getElementsByClassName("outbound")[link].target = target; 
    } 
+0

'for..in'을 전혀 사용하지 않으려 고합니다. . 그리고 각 루프 반복에서 검색을 반복하고 싶지는 않습니다. –

+0

동의하지만, 그럼에도 불구하고 그는 그가 고심하고있는 것을 해결합니다. –

2

두 가지 문제가 있습니다. 실제로는 요소에 전혀 target을 설정하지 않았습니다. 문자열, 아래 내용 참조).

난 강력하게 당신이 무슨 일을하는지 인하는 NodeListfor..in를 사용에 대해 권하고 싶습니다 :

for (link in document.getElementsByClassName("outbound")) { 

for..in 루프를 객체의 모든 열거 속성을 통해. (그리고 link는 재산 이름에 관계없이 속성이 아닌 이 될 것입니다.) 내가 명시 적으로 걸을 것 :

var index, list; 
list = document.getElementsByClassName("outbound"); 
for (index = 0; index < list.length; ++index) { 
    link = list[index]; 
    // ... 
} 

또한 getElementsByClassName 모든 브라우저에서 지원되지 않습니다.

+0

Arg, 다른 언어와 다른 JavaScript를 사용하십시오. 오, 그리고 for..in을 목록에 사용하는 것에 대해 싫어하는 점은 무엇입니까? – Raceimaztion

+0

@Raceimaztion : JavaScript에서'for..in'이 작동하는 방식은 매우 강력하고 편리합니다. (별도의'foreach'는 좋겠지 만, ECMAScript5에 새로운'Array # forEach' 함수가 있습니다.)'NodeList'에서는 사용하지 않습니다 : 모든 호스트 객체를 신뢰하지 않습니다. 비 숫자 형 프로퍼티를 비 - 열거 형으로 구현하거나 프로퍼티 이름 열거 (what forin ')가 제대로 지원되지 않도록 모든 환경이 필요합니다. 일반적으로 배열과 같은 객체의 경우 ** 수행중인 작업을 알고 올바른 예방 조치를 취하는 것이 좋습니다. ** http://blog.niftysnippets.org/2010/11/myths-and-realities-of- forlin.html –

+0

@ 앤드류 (Antrew)의 코멘트는 디버거를 통해 걷는 것의 가치에 관해서는 매우 옳습니다. 더 이상 클라이언트 측 JavaScript를 사용하지 않을 이유가 없습니다 : http://blog.niftysnippets.org/2011/03/no-excuse.html –

관련 문제