2010-06-07 3 views
0

мне нужна помощь ..JQuery AJAX (Google PageRank)

iv'e разрабатывает Jqery плагин, чтобы получить ряды страницы с адресами на сайте с помощью XHR,

Проблема заключается в том при запросе ранга с серверов google на страницу возвращается содержимое без содержания, но если я использую инспектор и получаю URL-адрес, который был запросом, и перейдите к нему через мой браузер, будут показаны столбцы. так что это должно быть что-то с заголовками, но это только озадачило меня.

Имеет некоторый исходный код, но я удалил несколько аспектов, которые не нужны для просмотра.

pagerank.plugin.js
(
    $.fn.PageRank = function(callback) 
    { 
     var _library = new Object(); 

     //Creat the system library 
     _library.parseUrl = function(a) 
     { 
      var b = {}; 
      var a = a || ''; 
      /* 
       * parse the url to extract its parts 
      */ 
      if (a = a.match(/((s?ftp|https?):\/\/){1}([^\/:]+)?(:([0-9]+))?([^\?#]+)?(\?([^#]+))?(#(.+))?/)) { 
       b.scheme = a[2] ? a[2] : "http"; 
       b.host  = a[3] ? a[3] : null; 
       b.port  = a[5] ? a[5] : null; 
       b.path  = a[6] ? a[6] : null; 
       b.args  = a[8] ? a[8] : null; 
       b.anchor = a[10] ? a[10] : null 
      } 
      return b 
     } 

     _library.ValidUrl = function(url) 
     { 
      var b = true; 
      return b = url.host === undefined ? false : url.scheme != "http" && url.scheme != "https" ? false : url.host == "localhost" ? false : true 
     } 

     _library.toHex = function(a){ 
      return (a < 16 ? "0" : "") + a.toString(16) 
     } 

     _library.hexEncodeU32 = function(a) { 
     } 

     _library.generateHash = function(a) 
     { 
      for (var b = 16909125, c = 0; c < a.length; c++) 
      { 
      } 
      return _library.hexEncodeU32(b) 
     } 

     var CheckPageRank = function(domain,_call) 
     { 
      var hash = _library.generateHash(domain); 
      $.ajax(
      { 
       url: 'http://www.google.com/search?client=navclient-auto&ch=8'+hash+'&features=Rank&q=info:' + escape(domain), 
       async: true, 
       dataType: 'html', 
       ifModified:true, 
       contentType:'', 
       type:'GET', 
       beforeSend:function(xhr) 
       { 
        xhr.setRequestHeader('Referer','http://google.com/'); //Set Referer 
       }, 
       success: function(content,textS,xhr){ 
        var d = xhr.responseText.substr(9, 2).replace(/\s$/, ""); 
        if (d == "" || isNaN(d * 1)) d = "0"; 
        _call(d); 
       } 
      }); 
     } 
     //Return the callback 
     $(this).each(function(){ 
      urlsegments = _library.parseUrl($(this).attr('href')) 
      if(_library.ValidUrl(urlsegments)) 
      { 
       CheckPageRank(urlsegments.host,function(rank){ 
        alert(rank) 
        callback(rank); 
       }); 
      } 
     }); 
     return this; //Dont break any chain. 
    } 
)(jQuery); 

index.html (пример)

<html> 
    <head> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
     <script type="text/javascript" src="pagerank.plugin.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
      $('a').PageRank(function(pr){ 
       alert(pr); 
      }) 
     }); 
     </script> 
    </head> 
    <body> 
     <a href="http://facebook.com">a</a> 
<a href="http://twitter.com">a</a> 
     <div></div> 
    </body> 
</html> 

я просто не могу понять, почему это его делает.

-

Примечания:

использованием и XHR Вне JQuery работает просто отлично!

function getPageRank(a, b) { 
    a = "http://www.google.com/search?client=navclient-auto&ch=8" + awesomeHash(a) + "&features=Rank&q=info:" + a; 
    var c = new XMLHttpRequest; 
    c.open("GET", a, true); 
    c.onreadystatechange = function() { 
     if (c.readyState == 4) { 
      console.log("reponse text is " + c.responseText); 
      var d = c.responseText.substr(9, 2).replace(/\s$/, ""); 
      if (d == "" || isNaN(d * 1)) d = "0"; 
      b(d) 
     } 
    }; 
    c.send() 
} 
+0

Вы пробовали JSONP? У этого вопроса есть ответ с хорошими ссылками: http://stackoverflow.com/questions/333532/cross-site-ajax-requests –

+0

Я не могу использовать jsonp, поскольку это автономный плагин jQuery и не должен быть вызван ни в один из наши серверы, но googles! что так всегда. – RobertPitt

ответ

1

Вы не можете получать какие-либо материалы с другого сервера (чем тот, на котором размещена страница), используя AJAX. Браузеры запрещают это явно как меру безопасности.

Лучшее, что вы можете сделать, это сделать запрос AJAX на серверный сценарий, размещенный на вашем собственном сервере, и позволить этому скрипту общаться с Google.

+0

Это неверно, у меня есть отдельная версия, которая создает XMLHttpRequest и делает это примерно так же, и работает отлично! – RobertPitt

+0

@ Robert: Когда вы говорите «автономный», вы имеете в виду, что вы загружаете файл или страницу с локального веб-сервера? –

+0

Я имею в виду автономный файл в формате javascript, но я забыл упомянуть, что этот код работает в плагинах Google Chrome и имеет привилегии от самого браузера Chrome :(вы были правы .. – RobertPitt

-1

для безопасности, ни один браузер не разрешает ajax связывать аннуитетный домен, в противном случае появится много google, weber может разместить страницу «html» для обслуживания?

но json может сделать, он вставляется в скрипт на странице, а свойство скрипта src установлено.

google page rank api возвращает текст типа «1: 1: 5», который не может быть объяснен скриптором, поэтому все прошло!

Итак, ajax не может этого сделать.