У меня есть плагин javascript, который ищет в DOM любые элементы, начиная с имени класса «tracking», и добавляет к этому элементу прослушиватель события щелчка (или другой тип прослушивателя, если указан).Идея состоит в том, что каждый раз, когда это событие происходит с этим элементом, он запускает функцию javascript, которая отправляет данные на наши серверы трафика.Вот как выглядит код.
// Once the page is completed loaded
window.mmload(function() {
// Get the container object
obj = document.getElementById(name);
if ( obj.length < 0 )
throw ("The Id passed into the tracker does not exist ("+name+")");
// Find all the elements belonging to the tracking class
var trackingClass = new RegExp( /tracking\[[a-zA-Z0-9\.\-_]+\]/g );
var myElements = getElementsByRegex( trackingClass, obj );
//For each of those elements...
for( var i in myElements ) {
var elm = myElements[i];
var method = elm.className.match( /tracking\[[a-zA-Z0-9\.\-_]+\]/ )[0].split('[')[1].replace(']','').split('.')[2];
method = typeof( method ) == 'undefined' ? 'click' : method;
// Add a click event listener
myElements[i].addEventListener( method, function(e){
// Get the element, the link (if any), and the args of the event
var link = elm.getAttribute('href') == null ? "" : elm.getAttribute('href');
var args = elm.className.match( /tracking\[[a-zA-Z0-9\.\-_]+\]/ )[0].split('[')[1].replace(']','').split('.');
// If a link existed, pause it, for now
if ( link != '' )
e.preventDefault();
// Track the event
eventTracker( args[0], args[1], ( method == 'click' ? 'redirect' : 'default' ), link );
return false;
}, true);
}
});
Прямо сейчас у меня работает этот кусок кода, когда окно полностью загружено (window.mmload () - это функция, которую я сделал для добавления событий window.onload).Однако, может быть, иногда мне нужно снова запустить эту функцию, потому что я добавил новые элементы в DOM через javascript с этим именем класса и тоже хочу их отслеживать.
Моим первоначальным решением было запустить эту функцию, используяsetInterval для проверки DOM каждые несколько миллисекунд или секунд или что-либо еще, что имеет смысл.Тем не менее, я был обеспокоен тем, что при таком подходе он может замедлить работу веб-сайта, тем более что он работает на мобильном веб-сайте для смартфонов.Я не уверен, какой удар по производительности я мог бы предпринять, если бы часто искал в DOM.
Другой подход, который я имел в виду, - просто вызвать функцию после добавления отслеживаемых элементов вDOM.Это, вероятно, самый эффективный способ справиться с этим.Тем не менее, люди, с которыми я работаю, и очень умные люди, являются веб-дизайнерами, которые не часто думают и не очень хорошо понимают код.Так что чем проще я это сделаю, тем лучше.Вот почему мне понравился подход setInterval, потому что от них не требуется ничего дополнительного.Но если это заметно замедляет работу сайта, возможно, мне придется использовать другой подход.