2015-03-30 4 views
4

Я получил предупреждение от поставщика рекламной системы о мошенничестве с кликом. Никакая дополнительная информация, все, что они рекомендуют, - «скрыть объявления для пользователей, которые быстро нажимают на объявления». Я написал фрагмент JS-скрипта, который скрывает все DIV с объявлениями в течение N секунд (с использованием cookie) при нажатии, но это решение не работает, поскольку «внутренний» контент (с рекламой) генерируется скриптом JS, который вызывает и отображает содержимое с внешнего сервера (как и следовало ожидать от рекламной системы). Таким образом, когда вы принимаете во внимание междоменную безопасность, это выглядит как Catch 22. Как я могу обнаружить щелчок внутри DIV (локально определенный), какой контент отображается внешним JS и iframe?Как обнаружить щелчок внутри iframe (междоменного)? Aka предотвратить мошенничество с кликом

Пример:

<div class="ad-class"> <!-- locally defined div --> 
    <div id="my-id"> </div> <!-- identifies my ad in the provider's system --> 
    <script> 
     var foo = blah // declares the ad dimensions and stuff 
     // and renders the contextual ad in #my-id DIV 
    </script> 
</div> 

Если бы все местные, решение было бы легко, как внутренний DIV наследует родительский класс («ад-класс»). В случае перекрестного домена это недопустимо. Любые советы, парни?

+0

вы всегда можете обнаружить щелчок на 'div', используя событие' onclick', не заботясь о том, что находится внутри 'div'. но вы можете проверить, есть ли 'div'' innerHTML', чтобы увидеть, загружено ли объявление или оно пустое, и если объявление было загружено, запустите свой скрипт. – EhsanT

+0

Hi EhsanT, я бы хотел, чтобы вы были правы, но, к сожалению, onclick здесь не работает. – olaf

+0

Возможный дубликат [Обнаружение щелчка в iframe с использованием JavaScript] (https://stackoverflow.com/questions/2381336/detect-click-into-iframe-using-javascript) –

ответ

5

Невозможно обнаружить события click в междоменном iframe.

Это говоря, вы можете иметь один плохой вариант:

Один из ближайших вещей, которые вы можете сделать, это обнаружить, что фокус переселившихся из окна в IFRAME:

window.focus(); //force focus on the currenct window; 
window.addEventListener('blur', function(e){ 
    if(document.activeElement == document.querySelector('iframe')) 
    { 
     alert('Focus Left Current Window and Moved to Iframe/Possible click!'); 
    } 
}); 

http://jsfiddle.net/wk1yv6q3/

Однако он не является надежным, свободный фокус не означает щелчок, он может быть перемещен пользователем через веб-сайт, используя TAB.

Другая проблема заключается в том, что вы обнаруживаете, что фокус в первый раз перемещается в iframe, вы не знаете, что делает пользователь, он может щелкнуть миллион раз, и вы никогда не узнаете.

+0

Большое спасибо, Luizgrs. Это лучшее решение. Вероятность ppl-серфинга на веб-сайте с использованием TAB очень низка. То есть вероятность нажатия на текст объявления вместо ссылок. Как я уже сказал, после щелчка (или любого взаимодействия в этом случае) div div будут скрыты, время такого взаимодействия в iframe сохраняется в файле cookie. Если посетитель просматривает веб-сайт, cookie снова считывается, и рекламные блоки снова отображаются после N секунд. – olaf

+0

Но да, я считаю, что требования к рекламодателю выглядят глупо. Кстати, интересно, как можно защитить Adsense divs от мошенничества с кликами (я не использую Adsense сейчас, но думал о переходе на него.) – olaf

+0

Это решение не работает в последней версии Firefox. Любой способ исправить это? –

0

Хорошо, некоторое время назад я нашел this plugin for WordPress. Очевидно, что он делает то, что мне нужно - просто интересно, как этот парень заставил его работать, он подсчитывает клики по Adsense iframe. Я должен поближе посмотреть, хотя я не программист на PHP. Я программирую в основном на Python и нуждаюсь в таком решении для Django. Если кто-нибудь может легко прочитать код, я был бы признателен за любую помощь.

0

Плагин ищет сначала для любого iframe, обернутого предыдущим указанным именем класса.

The IFrame id's будут собраны в массив и для каждого из этих id's будет создано событие Mouseover, который срабатывает скрипт, который скрывает класс «cfmonitor». В результате объявление, содержащее iframe, больше не отображается.

// IFRAME ACTION 
    function iframeAction() { 
     jq.each(jq.cfmonitor.iframes, function(index,element) { 
      frameID = jq(element).attr('id') || false; 
      if (frameID) initiateIframe(frameID); 
      //alert (frameID); 
     }); 
    } 

    // INIT IFRAME 
    function initiateIframe(elementID) { 
     var element = document.getElementById(elementID); 
     // MOUSE IN && OUT 
     if (element) { 
      element.onmouseover = processMouseOver; 
      element.onmouseout = processMouseOut; 
      //console.log("mouse on out"); 
     } 
     // CLICKS 
     if (typeof window.attachEvent !== 'undefined') { 
      top.attachEvent('onblur', processIFrameClick); 
     } 
     else if (typeof window.addEventListener !== 'undefined') { 
      top.addEventListener('blur', processIFrameClick, false); 
     } 
} 

// IFRAME CLICKS 
    function processIFrameClick() { 
     // ADD A CLICK 
     if(isOverIFrame) { 
      //addClick(); 
      // Some logic here to hide the class 'cfmonitor' 
      //console.log("Go"); 
      top.focus(); 
     } 
} 
4

Luizgrs вдохновил меня это решение:

var clickIframe = window.setInterval(checkFocus, 100); 
 
var i = 0; 
 

 
function checkFocus() { 
 
    if(document.activeElement == document.getElementById("ifr")) { 
 
    \t console.log("clicked "+(i++)); 
 
    \t window.focus(); 
 
    } 
 
}
<!DOCTYPE html> 
 
<h2>Onclick event on iframe</h2> 
 
<iframe src="https://www.brokenbrowser.com/" id="ifr"></iframe>

Функция обнаружения, если IFrame имеет фокус, если да, то пользователь нажал в IFRAME. Затем мы возвращаем фокус на наши основные окна, которые позволяют нам найти, если пользователь нажмет на другое время.

Этот трюк был полезен для меня для POC на двухступенчатом развороте iframe. Знакомство с тем, когда пользователь впервые нажал на iframe, позволил мне реорганизовать мои разные слои, чтобы прекратить иллюзию.

 Смежные вопросы

  • Нет связанных вопросов^_^