2010-08-04 5 views
6

Google은이 분석 회사에서 제공하는 타사 분석 보고서 스크립트를 사용하고 있습니다. DOM은 이미지 URL에보고 데이터가있는 1x1 픽셀 이미지를 추가합니다.DOM에 <img> 삽입 감지/차단

DOM을 모니터링하고이 <img> 요소를 가로 채고 브라우저가 이미지를 요청하기 전에 "src"속성을 변경하는 방법이 있습니까?

소리가 정말 이상한 일처럼 들리지만,이보고 스크립트 (스크립트는 obsfucated)에 해킹하고 싶은 기능이 있습니다.

+0

어떻게해야할지 모르지만 실제로 사용해 보셨습니까? $ ('img'). live ('load', function() {alert ("DOM에 이미지가 추가되었습니다!");}); – Adam

+0

@ Adam : 페이지가 말 그대로 수백 개의 이미지를 가질 수 있다는 점을 고려하면 짧은 순서로 미칠 수 있다고 확신합니다. – Robusto

+0

@Robusto True이지만 클래스, ID, src 또는 크기별로 선택기를 필터링 할 수 있습니다.로드 이벤트를 첨부하기 위해 라이브를 사용하는 것이 좋았지 만 이미지가 DOM에 추가 될 때 호출되는지 여부는 확실하지 않습니다. 그렇다면 언제. – Adam

답변

2

IE가 아닌 브라우저의 경우 DOMNodeInserted 이벤트를 사용하여 DOM 노드 삽입을 감지 할 수 있습니다. 이벤트가 시작될 때까지 브라우저가 HTTP 요청을했는지는 알 수 없습니다. 파이어 폭스에서는 빠른 테스트에서 제외되었다. 이것은 IE에서 작동하지 않으므로이 방법은 수용 가능한 해결책이 아닙니다. 아담이 어떤 제안에

document.body.addEventListener("DOMNodeInserted", function(evt) { 
    var node = evt.target; 
    if (node.nodeType == 1 && node.tagName == "IMG") { 
     node.src = "http://www.gravatar.com/avatar/be21766f09e0e5fd3a2f8cc721ceba2e?s=32&d=identicon&r=PG"; // Your gravatar 
    } 
}, false); 
0

건물 :

$(document).ready(function() { 
    $("img[src='http://example.com/example.gif']").attr('src','http://example.com/new_src.gif'); 
}); 
+0

Adam은 앞으로 생성되는 요소에 적용되는 'live'사용을 제안했습니다.이 스크립트는 현재 DOM에있는 요소 만 분석합니다. – mattbasta

+0

이 DOM 뒤에있는 javascript를 통해 추가되는 경우 로드 된, 나는 동의하지만, 그는 라이브를 사용하고 싶다. 그러나 그가 사용하기를 원하는 셀렉터는 이것과 매우 유사 할 것이다. – calvinf

1

이 갈주십시오. 나는 그것이 얼마나 유용 모르겠지만, 땜질 같은 느낌과는 다소 타사가 의도적으로 지연 통합함으로써 시나리오를 차지한다 :

$(document).ready(function() { 
// match an image with specific dimension, return it 
function imgNinja() { 
    var $img = $("img").filter(function() { 
     return ($(this).height() == 1 && $(this).width() == 1); 
    }); 
    return $img; 
} 

// periodically execute this to check for matches 
function keepSeeking() { 
    $img = imgNinja(); 
    if($img.length) { 
     alert('found it'); 
     clearInterval(i); 
     // do something with image 
    } 
} 

// insert a fake into the DOM at a bit of an interval 
function addNastyImage() { 
    var $invader = $('<img src="foo.jpg" height="1px" width="1px"/>'); 
    $('html').append($invader); 
} 


setTimeout(addNastyImage, 5000); 
var i = setInterval(keepSeeking, 1000); 
}); 

데모 : http://jsfiddle.net/NyEdE/3/

+0

픽셀이 메트릭 스위트의 일부로 추가되면, DOM의 ready 이벤트가 발생하기 전에로드 될 가능성이 높습니다. – mattbasta

1

써드하는 경우를 파티 스크립트는 (.appendChild과 같은) 메소드를 사용하여 요소를 문서에 추가하면 관련 객체의 해당 메소드를 사용자 고유의 기능으로 대체하여이를 수행 할 수 있습니다.

모든 브라우저에서 작업 할 수 있다는 장점이 있습니다. 변경된 URL은 원본 URL이 아니라 하나의 HTTP 요청 만 생성 할 것입니다.

관련 문제