2012-05-18 1 views
0

페이지의 코드를 이미지 링크가 아닌 실제 이미지로 바꾸고 싶습니다. 나는 이미 다른 stackoverflow 대답을 기반으로 할 수 있습니다.Javascript 이미지 텍스트 링크를 이미지로 바꾸지 만 기존 IMG 태그는 무시

그러나 IMG 태그에 포함 된 것을 무시하는 방법이 있는지 궁금합니다. 감사합니다.

$("#photos li").each(function() { 
     $(this).html($(this).html().replace(/(http:\/\/\S+(\.png|\.jpg|\.gif))/g, '<a href="$1" class="fancybox" rel="gallery1"><img src="$1" /></a>')); 
    }); 

답변

1

목록에는 링크가 아닌 URL 집합이있는 것 같습니다.

$("#photos li").each(function() { 
    if(!$(this).find('img').length){ 
     $(this).html($(this).html().replace(/(http:\/\/\S+(\.png|\.jpg|\.gif))/g, '<a href="$1" class="fancybox" rel="gallery1"><img src="$1" /></a>')); 
    } 
}); 

물론 이것은 HTML의 구조에 따라 다릅니다.

JSFiddle.

+0

JSFIDDLE의 데모를 보내 주셔서 감사합니다. 공장! –

+1

어쩌면 일어날 가능성은 없지만 깨뜨릴 수 있습니다. http://jsfiddle.net/9aK7L/ – yankee

+0

그래, 내 솔루션은 HTML의 무결성에 달렸지 만 태그가 URL 내부에 있을지는 의문입니다. –

1

html에 정규식을 적용하면 안됩니다. 어떤 부작용이 있는지 예측하기 란 쉽지 않습니다. 오히려 당신은 완전히 파싱 된 DOM 트리를 가지고 있고 당신이 신경 써야 할 그 요소들을 전달하는 이점을 사용해야한다 : 텍스트 노드들!

또한 나는 "<img src="$1" />"과 같은 것을 쓰지 말 것을 조언합니다. $ 1에 이상한 것이 들어 있다면 이상한 일이 일어날 것입니다. 이 간단한 해결 방법으로 인해 발생할 수있는 모든 일에 대해 생각할 필요가 없습니다. jQuery('<img />').attr('src', someTextWithNotTooWellCheckedContent). 여기

어떻게 작동하는지에 대한 예는 다음과 같습니다

행동
jQuery('#photos li').find('*').contents().filter(function() { 
    return this.nodeType == 3; 
}).each(function(i, elem) 
     { 
      var matches = /(.*)(http:\/\/\S+(?:\.png|\.jpg|\.gif))(.*)/g.exec(elem.wholeText); 
      if (matches) 
      { 
       var parent = elem.parentNode; 
       var before = matches[1]; 
       var replace = jQuery('<a />').attr('href', matches[2]).append(jQuery('<img />').attr('href', matches[2]))[0]; 
       var after = matches[3]; 
       parent.insertBefore(document.createTextNode(before), elem); 
       parent.insertBefore(replace, elem); 
       parent.insertBefore(document.createTextNode(after), elem); 
       parent.removeChild(elem); 
      } 
     }); 

: http://jsfiddle.net/B4GPt/

PS : 당신은 나 HTML에 따라 find('*').andSelf()find('*')를 대체하여 위의 코드를 확장 할 필요하지 않을 수도 있습니다 구조 및 의도.

+0

굉장한 해결책! 감사! 그것은 훨씬 더 많은 일을하는 것처럼 보이지만 ... 다른 답변의 성능 측면에서 어느 것이 더 빠를 것입니까? –

+0

@Scott : 브라우저의 최적화 엔진 구현에 많은 영향을주기 때문에 명확하게 말할 수 없습니다. 하지만 대부분의 브라우저에서 Little Big Bot의 솔루션이 더 빨리 작동 할 것입니다. 내 솔루션은 당신이 "모퉁이의 경우"를 고려할 수있는 더 많은 경우와 함께 작동하지만, 나는 갖고 싶지 않을 것입니다. http://jsfiddle.net/LaEpj/1/를 생각해보십시오. Little Big Bot의 해결책은 당신이 원하는 바가 아닐 수도 있습니다. 비록 당신의 html 구조에 달려있다 ... – yankee

관련 문제