Почему я не могу загрузить внешний ресурс из метода загрузки jQuery?

в процессе изучения Ajax-запросов с помощью jQuery я попытался загрузить домашнюю страницу google по щелчку ссылки. Поэтому я написал что-то вроде:

$("#ajax").click (function (event) {
    $("#g").html("Loading...");
    $("#g").load("http://www.google.com");
    event.preventDefault ();
});

и где-то в теле:

<a id="ajax" href="http://www.google.com">Load file ajax way</a>
<div id="g">Click the above link to load the page...</div>

который не работал, и изначально я думал, что есть какая-то синтаксическая ошибка или что-то еще. Но позже, когда я заменил url google статическим html-файлом на сервере, он работал правильно.

$("#g").load("Temp.htm");

предназначен ли он для такой работы (если да, то почему?) или я делаю что-то не так?

EDIT: пожалуйста, кто-нибудь может объяснить (или сослаться) проблему безопасности, введенную междоменными вызовами ajax? Другими словами, почему безопасно открыть другую вкладку браузера и открыть google, но не изнутри страницы? Это для защиты звонящего или вызываемого?

6 ответов


Jquery использует запрос ajax (XMLHttpRequest) для загрузки данных, но браузер разрешает это для ресурсов в том же домене. (В ответах выше упоминается та же политика происхождения). Вот почему он работает с Темп.htm, но не www.google.com.

  • один из способов обойти это-создать сценарий сервера, который загрузит страницу для вас - в основном прокси. Тогда вы звоните

    $('#g').load("load.php?url=google.com")
    
  • другое решение-использовать iframes для связи - я нашел эту библиотеку, это, кажется, то, что вам нужно:в jQuery-crossframe

  • третий вариант -JSONP но это не сработает в вашем случае.

мое мнение-перейдите к первому варианту с прокси на стороне сервера.


почему же происхождения политики?

представьте, что вы проверяете некоторые вещи на своей учетной записи ebay. Затем в другой вкладке вы открываете мой сайт, где у меня есть скрипт, который делает серию запросов на ebay (вы все еще вошли в систему) и предлагает вам Audi A8, даже не заметив. Раздражающий... Если это был ваш банк, он может напрямую украсть у вас деньги.

ирония заключается в том, что, несмотря на ту же политику происхождения, вышеуказанная атака все еще возможна.


вам не разрешено совершать междоменные вызовы AJAX по соображениям безопасности-см. Та Же Политика Происхождения.


Это из-за безопасности. Вы можете прочитать все об этом вместе с раствором в yahoo.


стоит отметить, что вы не полностью исключены из междоменных запросов в javascript.

начиная с jQuery 1.2, вы можете загрузить данные JSON, расположенные в другом домене, если вы укажете обратный вызов JSON-P, а URL-адрес, который вы вызываете, поддерживает вывод JSON-P.

следующий пример прямо из документов jQuery. Он захватывает последние четыре фотографии flickr с тегом "cat".

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
    function(data){
      $.each(data.items, function(i,item){
        $("<img/>").attr("src", item.media.m).appendTo("#images");
        if ( i == 3 ) return false;
      });
    });

вы можете прочитать здесь документы : http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

лично я использую его, чтобы вытащить мои последние твиты в моем блоге без необходимости встроить его в мой серверный код. Это также имеет дополнительное преимущество в том, что не нужно писать код обработки ошибок для часто пятнистой службы API из Twitter. Просто посмотреть источник на мой блог, если хочешь увидеть это: http://joreteg.com


прежде всего, я должен предположить, что у вас есть очень веская причина сделать что-то, что ссылка делает по умолчанию с JavaScript...

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


попробуйте добавить

<IfModule mod_headers.c>Header add Access-Control-Allow-Origin: "http://yoursite.com/"

в htaccess.отправить некоторые параметры с помощью

$("#g").load("http://www.google.com",{nomeaning:'nomeaning'});

это отправит запрос post.это сработало для меня