2012-02-09 3 views
2

Мой скрипт отслеживает клики на странице клиента и загружает это на мой сервер (назовем его .http: //fancyclickserver23.net)нужно передавать данные с одного сайта на другой асинхронно

Теперь я хочу, чтобы клиент поместите скрипт на свой сайт, и этот скрипт пометит клики на странице и отправит данные на .http: //fancyclickserver23.net на странице или может быть время от времени.

Я не могу использовать Ajax из-за ограничений браузера, конечно. Итак, как мне это сделать? Я дам небольшой гипотетический код, который поможет вам понять. У меня есть закрывающий трекер, который загружается, когда пользователь помещает

<script src="http://fancyclickserver23.net/loadtracker.php?client_id=2332"></script> 

код загружает трекер = функцию закрытия() {....}; Пользователь должен создать объект трекера

<script> 
track=new tracker(); 
track.init(); 
</script> 

track.init() в основном связывает функцию которая получает Xpath элемента и сохраняет его в track.clicks. Теперь мне нужно иметь функцию track.send(), которая отправит массив кликов как json (я знаю, как его преобразовать в json) и отправить на закрытие страницы.

Как это сделать. Также я видел, что некоторые сайты используют что-то вроде:

document.write("<sc"+"ript"+" src='https://fancyclickserver23.net/loadtracker.php?client_id=2332'"+"></scr"+"ipt>"; 

Почему это вместо прямого тега скрипта? И почему бы не поместить его в одну строку, если мы вообще должны использовать document.write().

Так эти два вопроса:

  1. Как отправить данные асинхронным (или иначе) при загрузке страницы?
  2. Что делает вышеуказанный код?
  3. Я видел, как Google Analytics и Facebook делают это, у них нет никаких проблем. Facebook infact отображает диалоговое окно на экране. Как?

ответ

3

Несмотря на ограничения безопасности между доменами, вы все еще можете использовать AJAX (XHR) в какой-то степени.

Браузер не может уничтожить междоменный запрос именно так. Он должен видеть, что сервер думает об этом в первую очередь. Он делает это, отправляя фактический запрос на сервер и получая инструкции вместе с ответом в HTTP-заголовках. Если заголовок Access-Control-Allow-Origin не поступает или не совпадает с исходным доменом, браузер удаляет ответ и выдает предупреждение о безопасности в консоли.

Из моего личного опыта, Access-Control-Allow-Origin заголовок или нет, когда сайт aaa.com посылает запрос AJAX на сайт bbb.com доставки в одну сторону полезной нагрузки данных на сервер происходит в любом случае. Это всего лишь монолог, но что еще нужно для сбора данных, не так ли? ;)

Я, например, использую одностороннюю технику для чего-то подобного вашему - я собираю отчеты JSON о unit tests результатах моего проекта с открытым исходным кодом here. Вы можете обнаружить предупреждение о безопасности на консоли, но в то время отчет уже безопасно хранится на сервере.

1

Если вы можете превратить ваш массив данных по кликам в строку запроса, вы можете сделать следующее:

var img = new Image(1,1); 
img.src = "http://example.com/clicks-receiver?" + query_string; 
+0

Я могу, но есть ли более элегантное решение. Интересно, как это работает Google –

3

Использование:

function sendData(data){ 
    var scr = document.getElementById("scriptExchange"); 
    if(typeof scr == "undefined"){ 
    var scr=document.createEelement("script"); 
    scr.id="scriptExchange"; 
    document.body.appendChild(scr); 
    scr = document.getElementById("scriptExchange"); 
    } 
    scr.src = "http://another-website.com/?query="+data; 

} 

всякий раз, когда вы хотите отправить данные называют это Funciton , ,

Теперь на другом сервере задан ответ на чистый JS-код, например.

alert("Data Received"); 

и от другого сервера поставить

1

Для этого вы можете использовать jQuery и jsonP.

1) делает Ajax вызов, как следующее:

var url = your_other_domain_url + "jsoncallback=?"; 
var params = {param1:val1, param2:val2}; 
$.ajax({ 
    type: 'POST', 
    url: url, 
    data: params, 
    success: function(data){ 
      //success jsonp handler - assume content in data.response 
      if(data.response){ 
       //do something with the remote site content 
      } 
    }, 
    dataType: "json" 
}); 

2) на стороне сервера, отслеживать любой запрос, который имеет параметр 'jsoncallback' и поместить ответ внутри объекта обратного JSON, такие как

{status: 'success', response: "<html>.....resposne conent...</html>"} 
+0

Браузер не разрешает запрос –

+0

Запрос всегда будет отправляться с клиента на сервер, но ответ может не отображаться на клиенте, если это HTTP-запрос как ограничение XSS. Но использование json для инкапсуляции ответа с сервера позволит вам отобразить код (javascript и html) на странице клиента. –

+0

Если ваш клиент неизвестен, вы можете написать сам вызов ajax, а не использовать jQuery, а затем сохранить свой код в общедоступном js-файле и включить пользователя в свою страницу как тег сценария. В любом случае, идея получения данных кросс-домена одинакова. –

0

Невозможно использовать iframe. Родитель имеет видимость в iframe, iframe может запускать скрипты обратно на другой сервер, не перескакивая через кучу обручей. Я считаю, что наша реализация omniture использует этот метод.

Метод img, как указано выше, также является потенциалом.

Старшая статья о нем:

http://www.codecouch.com/2008/10/cross-site-scripting-xss-using-iframes/

или другого

http://blog.kotowicz.net/2010/11/xss-track-how-to-quietly-track-whole.html

Это плохая форма, чтобы распространить этот материал?

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