web-dev-qa-db-ja.com

JSONPを使用してhtmlページをロードします

JSONPを使用して外部ページを読み込もうとしていますが、ページはHTMLページであるため、ajaxを使用してコンテンツを取得したいと思います。

編集:私がこれをしている理由は、サーバーではなくページをロードするときに、ヘッダー、IP、エージェントなどのすべてのユーザー情報を渡したいからです。

これは実行可能ですか?現在、ページを取得できますが、jsonpはjsonを解析しようとし、エラーを返します:Uncaught SyntaxError: Unexpected token <

サンプルコード:

$.post('http://example.com',function(data){
    $('.results').html(data);
},'jsonp');

私は人々がテストするためにjsfiddleをセットアップしました: http://jsfiddle.net/8A63A/1/

24
Korvin Szanto

http://en.wikipedia.org/wiki/JSONP#Script_element_injection

JSONP呼び出しを行う(つまり、この使用パターンを使用する)には、スクリプト要素が必要です。したがって、新しいJSONPリクエストごとに、ブラウザは新しい要素をHTML DOMに追加(または再利用)する必要があります。つまり、「src」属性に必要な値を指定してHTMLDOMに挿入する必要があります。次に、この要素が評価され、src URLが取得され、応答JSONが評価されます。

今あなたのエラーを見てください:

キャッチされないSyntaxError:予期しないトークン<

<は任意のhtmlタグの最初の文字であり、おそらくこれは<DOCTYPEの始まりです。この場合、これはもちろん、無効なJavaScriptです。 。

そして[〜#〜] no [〜#〜]、HTMLデータのフェッチにJSONPを使用することはできません。

16
c69

私はあなたが望むことをしましたが、私の場合、HTMLを返すサーバー側のコードを制御できます。それで、私がしたことは、返されたオブジェクトのJsonプロパティの1つにHTMLコードをラップし、クライアント側で次のように使用しました。

callback({"page": "<html>...</html>"})

直面している構文エラーは、使用しているライブラリがjsonを予期しているが、応答がHTMLであるためです。

12
martosoler

私はあなたのために3つの言葉を持っています: 同一生成元ポリシー

リモートURLが実際に適切なJSONPリクエストをサポートしていない限り、あなたはあなたがしようとしていることをすることができません。そして、それは良いことです。

編集:もちろん、サーバーを介してリクエストをプロキシすることもできます…

2
vzwick

クライアントを使用してHTMLファイルを取得したいだけの場合は、flyJSONPを使用することをお勧めします。これはYQLを使用します。または、いくつかの優れた手法を使用するjankyPOSTを使用します。

jankyPOSTは、非表示のiframeを作成し、フォーム(iframe [0] .contentWindow.document.body.form.name)を詰め込みます。

次に、HTML5(レガシーブラウザをご覧ください!)webMessaging APIを使用して他のiframeに投稿し、iframeのフォーム要素の値をuが指定した値に設定します。

フォームをリモートサーバーに送信します...完了しました。

または、PHP curl、解析、エコーなどを使用することもできます。

IDKは、正確に何に使用するのかというと、これがお役に立てば幸いです。

また...サーバーコードからの出力であるものなら何でもJSONPできると確信しています。私はClientLoginでkeyGenページをJSONPするだけでこれを行い、b/wタグであったとしても、テキストを正常にconsoleLoggedしました。他にもいくつかエラーがありましたが、ポイントはその出力をスクレイピングしたことです。

現在、私はあなたがしていることをやろうとしているので、成功したら投稿します。

2
Cody

これは不可能だと思います。 JSONPでは、応答が適切にレンダリングされる必要があります。

別の解決策が必要な場合は、iframeにURLを読み込んで、iframeを介して通信しようとするとどうでしょうか。私はそれがうまくいくと100%肯定的ではありませんが、一見の価値があります。

0
jesse reiss