質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

4回答

12848閲覧

ajaxで他サイトの情報を所得したいが、失敗してしまう

GoMaSio

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/01/07 16:13

タイトルの通り、Jqueryでajaxを使用し、他サイトの情報を所得したいが所得できずに困っています。

html

1<head> 2<script> 3$(function(){ 4 $('.sample_btn').click(function(){ 5 $.ajax({ 6 url: 'https://kinocolog.com/ajax/test.html', 7 type: 'GET', 8 dataType: 'html' 9 }).done(function(data){ 10 $('.result').html(data); 11 }).fail(function(data){ 12 alert('通信失敗!'); 13 }); 14 }); 15}); 16</script> 17</head> 18<body> 19 <div class="result">ここにajaxの結果を書き換えます</div> 20<input type="button" class="sample_btn" value="ajax通信で取得する"> 21</body> 22</html>

urlのサイトから所得したhtmlデータを.resultに表示したいのですが失敗してしまいます。
Consoleには以下記載がありました。

Access to XMLHttpRequest at 'https://kinocolog.com/ajax/test.html' from origin 'http://127.0.0.1:8887' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Cross-Origin Read Blocking (CORB) blocked cross-origin response https://kinocolog.com/ajax/test.html with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

クロスドメインによるエラーなのかと思い、自分なりに調べましたが解決法が分からず質問させていただきます。上記に載っているサイトだけでなく、どんなサイトからも情報が所得できるような解決法があれば是非お教え願いたいです。ご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/07 20:53

提示されたURLは自身が管理されているサイトなのでしょうか。 管理されていないのでしたらそのサイトに迷惑がかかる可能性もあるのでexample.comなど例示ドメインにされたほうが賢明かと思います。
guest

回答4

0

こんにちは、GoMaSioさん

質問拝見しました。

取得しているページのURLから、以下のページを試されているとお見受けしました。
https://kinocolog.com/jquery_ajax/

すでにご認識の通り、こちらのサンプルコードを実行する際にhttps://kinocolog.com/ajax/test.htmlで実行すると、http://127.0.0.1:8887https://kinocolog.comが異なるhostのため、クロスドメインによるエラーが発生します。

コンソールの表示からhttp://127.0.0.1:8887でローカルサーバを起動されていると思いますので、サンプルで書かれているように、ajaxを実行するURLは以下で良いかと思います。

<head> <script> $(function(){ $('.sample_btn').click(function(){ $.ajax({ url: '/ajax/test.html', type: 'GET', dataType: 'html' }).done(function(data){ $('.result').html(data); }).fail(function(data){ alert('通信失敗!'); }); }); }); </script> </head> <body> <div class="result">ここにajaxの結果を書き換えます</div> <input type="button" class="sample_btn" value="ajax通信で取得する"> </body> </html>

次に、http://127.0.0.1:8887/ajax/test.html でアクセスできる場所に以下のHTMLを作成します。

<p>Ajax通信成功!</p> <p>おめでとう!Ajax通信は成功しました!</p>

このように、ajaxを実行するファイルと取得するファイルのhost(http://127.0.0.1:8887)が同じであれば、クロスドメインのエラーは発生しません。
これで、ajaxを試すことができると思います。

以上、参考になれば幸いです。

投稿2020/01/08 00:29

gentamura

総合スコア406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GoMaSio

2020/01/08 14:23

解決しました! gentamuraさんの言う通り、test.htmlを同ファイルに格納し仮想サーバにて実行したところ <p>要素を表示させることが出来ました!ありがとうございます! hostが異なるとajaxが実行できないのですね・・・勉強になりました
guest

0

ベストアンサー

ajax を使ってのクロスドメインでのアクセスは基本的に許可されません。それを回避する策として自分が思い付くのは:

(1) アクセスするサイトが質問者さんの管理下にあって CORS を実装できるならそうする。

(2) JSONP の API を提供していれば、JSONP を使う。

(3) ブラウザから ajax でアクセスするのではなく、サーバー側の web アプリでアクセスして (例えば C# なら HttpWebRequest を使うとかして) サーバー側でデータを入手してクライアント(ブラウザ)に渡す。

・・・ぐらいです。上記に興味があって、不明点の質問があれば聞いてください。

【追記】

gentamura さんのレスを見て気が付いたのですが、https://kinocolog.com/jquery_ajax/ に書いてあったことをそのまま自分の環境で試してみたいということだったようですね。

記事の[ajax通信で取得する]ボタンをクリックすると問題なく通信に成功して情報を取得できるのですが、それは下の画像の赤枠で囲った部分がキモです。

イメージ説明

ボタンをクリックすると記事に書いてある通り jQuery ajax を使って要求が送信しようとします。以下の画像がボタンクリックでのブラウザ ⇔ サーバー間の要求。応答をキャプチャしたものです。

イメージ説明

赤枠で囲った部分は jQuery ajax で要求した URL ですが同一オリジンポリシー(詳しくは下記 URL 参照)に違反してないので通信に成功しています。

同一オリジンポリシー
https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy

同一オリジンポリシーを満足しない場合、HTML 5 の仕様 Cross-Origin Resource Sharing (CORS) を実装している新しいブラウザであれば、ブラウザは CORS のプロトコルに従って自動的に対処しようとします。

しかしながら、サーバー側で CORS に必要な応答ヘッダ返せるような対応がされてないと通信に失敗します。質問に書いてあったエラーメッセージ "No 'Access-Control-Allow-Origin' header is present on the requested resource." はそのことを言っています。

という訳で、参考にしている記事に書いてあったことをそのまま自分の環境で試してみたいということであれば、試験用に開発環境にサーバーを立てるなどの方法で同一オリジンポリシーを守れるように設定するということになります。

投稿2020/01/07 23:46

編集2020/01/08 04:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GoMaSio

2020/01/08 15:22

ご回答と、詳しく分かりやすい説明をありがとうございます! 同一ドメインでなければajaxを使えないことが分かり、また同一オリジンポリシーについて学ぶことができとても感謝しています。 ただ自分としてはクロスドメインの回避を行ってみたく思い、 クロスドメインの回避且つ汎用性の高い方法として(3)の策がとても気になりますが・・・ まだサーバ側について勉強不足なので知識をつけてから再度質問したいと思います 分かりやすい説明ありがとうございました!
guest

0

### 結論

仕様なので、サイトの管理権限がない限り不可能。
ただし、Chromeの拡張機能を使ってインストールした人だけが、エラーを無効にできる手法も存在する。

ただし未検証であるので、利用は自己責任で

Chrome拡張機能

投稿2020/01/07 16:29

編集2020/01/07 16:30
kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

iframe に挿入

ajax でどこかhtml を変更するのでしょうか?
iframe を使えば CORS の問題は発生しません。

投稿2020/01/08 05:06

mmaeda

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問