9 Stimmen

Warum kann ich nicht eine externe Ressource von jQuery Load-Methode laden?

Im Zuge des Erlernens von Ajax-Anfragen mit jQuery habe ich versucht, die Google-Startseite beim Klicken auf einen Link zu laden. Also schrieb ich etwas wie:

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

Und irgendwo im Körper:

<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>

Das hat nicht funktioniert, und zunächst dachte ich, es gäbe einen Syntaxfehler oder so etwas. Aber später, als ich die Google-URL durch eine statische HTML-Datei auf dem Server ersetzt habe, hat es richtig funktioniert.

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

Ist das so vorgesehen (wenn ja, warum?), oder mache ich etwas falsch?

EDIT: Kann bitte jemand das Sicherheitsproblem erklären (oder darauf verweisen), das durch domänenübergreifende Ajax-Aufrufe entsteht? Mit anderen Worten, warum ist es sicher, einen anderen Browser-Tab zu öffnen und Google zu öffnen, aber NICHT von der Seite aus? Ist es zum Schutz des Anrufers oder des Angerufenen?

35voto

Emil Ivanov Punkte 36508

Jquery verwendet eine Ajax-Anfrage (XMLHttpRequest), um die Daten zu laden, aber der Browser erlaubt dies für Ressourcen auf derselben Domain. (Die Antworten oben erwähnen die Politik der gleichen Herkunft ). Deshalb funktioniert es mit Temp.htm, aber nicht mit www.google.com.

  • Eine Möglichkeit, dies zu umgehen, besteht darin, ein Serverskript zu erstellen, das die Seite für Sie lädt - im Grunde ein Proxy. Dann rufen Sie

    $('#g').load("load.php?url=google.com")
  • Die andere Lösung ist die Verwendung von iframes für die Kommunikation - ich habe diese Bibliothek gefunden, die zu sein scheint, was Sie brauchen: jquery-crossframe

  • Eine dritte Möglichkeit ist JSONP aber das würde in Ihrem Fall nicht funktionieren.

Meine Meinung: Entscheiden Sie sich für die erste Option mit einem serverseitigen Proxy.


Warum gibt es eine Politik der gleichen Herkunft?

Stellen Sie sich vor, Sie überprüfen einige Artikel in Ihrem ebay-Konto. Dann öffnen Sie in einem anderen Tab meine Seite, auf der ich ein Skript habe, das eine Reihe von Anfragen an ebay stellt (Sie sind immer noch eingeloggt) und Ihnen ein Gebot für einen Audi A8 macht, ohne dass Sie es merken. Ärgerlich... Wenn es Ihre Bank wäre, könnte es direkt Geld von Ihnen stehlen.

Die Ironie dabei ist, dass der oben beschriebene Angriff trotz der gleichen Herkunftspolitik immer noch möglich ist.

2voto

Greg Punkte 306033

Aus Sicherheitsgründen dürfen Sie keine domänenübergreifenden AJAX-Aufrufe tätigen - siehe Politik der gleichen Herkunft .

1voto

Andy Gaskell Punkte 30777

Dies ist auf die Sicherheit zurückzuführen. Sie können alles darüber lesen, zusammen mit einer Lösung unter yahoo .

1voto

Henrik Joreteg Punkte 1574

Es ist erwähnenswert, dass Sie nicht vollständig von domänenübergreifenden Anfragen in Javascript ausgeschlossen sind.

Ab jQuery 1.2 können Sie JSON-Daten laden, die sich auf einer anderen Domain befinden, wenn Sie einen JSON-P-Callback angeben und die aufgerufene URL die JSON-P-Ausgabe unterstützt.

Das folgende Beispiel stammt direkt aus den jQuery-Dokumenten. Es holt die letzten vier Flickr-Bilder, die mit "cat" getaggt sind.

$.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;
      });
    });

Sie können die Dokumente hier lesen: http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

Ich persönlich verwende es, um meine neuesten Tweets in meinen Blog einzubinden, ohne es in meinen serverseitigen Code einbauen zu müssen. Das hat auch den zusätzlichen Vorteil, dass ich keinen Code zur Fehlerbehandlung für den oft lückenhaften API-Service von Twitter schreiben muss. Sehen Sie sich einfach den Quellcode in meinem Blog an, wenn Sie ihn sehen wollen: http://joreteg.com

0voto

Aaron Digulla Punkte 308693

Zunächst einmal muss ich annehmen, dass Sie einen sehr guten Grund haben, etwas zu tun, was ein Link standardmäßig mit JavaScript tut...

Der Hauptgrund ist wahrscheinlich die Sicherheit: Sie können von JavaScript aus NICHT auf Daten außerhalb der aktuellen Domäne zugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X