2010-08-04 9 views
6

Stiamo utilizzando uno script di reporting di analitica di terze parti fornito da questa società di analisi. Aggiunge un'immagine del pixel 1x1 nel DOM con i dati di segnalazione nell'URL dell'immagine.Rilevamento/intercettazione dell'inserimento di <img> in DOM

È possibile monitorare il DOM e intercettare questo elemento <img> e modificare l'attributo "src" prima che il browser richieda l'immagine?

Suona come una cosa davvero strana da fare, lo so, ma c'è una funzione che vorremmo incidere su questo script di segnalazione (la sceneggiatura è ovvia).

+0

Non sai come farlo, ma hai provato dal vivo? come: $ ('img'). live ('load', function() {alert ("Immagine aggiunta a DOM!");}); – Adam

+0

@Adam: Sono abbastanza sicuro che ti farebbe impazzire in breve tempo, specialmente considerando che una pagina può contenere letteralmente centinaia di immagini. – Robusto

+0

@Robusto True, ma è possibile filtrare il selettore per classe, id, src o dimensione, stavo suggerendo di utilizzare live per collegare l'evento load, ma non sono sicuro che venga chiamato quando un'immagine viene aggiunta al DOM e se così quando. – Adam

risposta

2

Nei browser non IE, è possibile rilevare l'inserimento di un nodo DOM utilizzando l'evento DOMNodeInserted. Non so se il browser avrà effettuato la richiesta HTTP prima che l'evento venga attivato; non sembra in Firefox da un test rapido. Poiché ciò non funziona in IE, questa potrebbe non essere una soluzione accettabile in ogni caso.

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

Costruire su ciò che Adam ha suggerito:

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

Questo non funziona. Adam ha suggerito l'uso di 'live', che si applica agli elementi creati in futuro.Questo script analizza solo gli elementi attualmente nel DOM. – mattbasta

+0

Se il viene aggiunto tramite javascript dopo che il DOM ha caricato, sono d'accordo, vorrebbe usare dal vivo.Tuttavia, il selettore che vorrebbe usare sarebbe abbastanza simile a questo. – calvinf

1

dare un'andare. Non so quanto sia utile sarà, ma mi sentivo come armeggiare e rappresenta un po 'per lo scenario in cui la terza parte comprende volutamente un ritardo:

$(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); 
}); 

Demo: http://jsfiddle.net/NyEdE/3/

+0

Se il pixel viene aggiunto come parte di una suite di metriche, carichi probabili prima che venga attivato l'evento pronto del DOM. – mattbasta

1

Se il terzo lo script party utilizza un metodo (come .appendChild) per aggiungere l'elemento al documento, è possibile farlo sostituendo il metodo dell'oggetto rilevante con la propria funzione.

Questo avrebbe il vantaggio di funzionare in tutti i browser e penso che si genererebbe solo una richiesta HTTP (per l'URL modificato, non per quello originale).

Problemi correlati