人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

あるjavascriptを書いてあるhtmlを実行すると、firefoxでは問題なく動作するのですが、chromeだと動作しません。
console.logを表示すると、下記の内容が表示されます。

Refused to execute script from 'http://www.*******/******.jsonp?jsonCallback=**********' because its MIME type ('') is not executable, and strict MIME type checking is enabled.

どうすれば、問題なく動作させられるか教えて下さい。

宜しくお願いします。

●質問者: worldtravel
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●100ポイント ベストアンサー

質問で削ってしまった、ここ。ここは大切なところです。

because its MIME type ('') is not executable, and strict MIME type checking is enabled.

想像するに、text/plain か application/json なのだと思いますが、どのバージョンからか Google Chrome は応答の MIME タイプの確認が厳しくなっているみたいです。
https://bugs.chromium.org/p/chromium/issues/detail?id=180007
http://qiita.com/yooo_gooo/items/18a63b1aadcb926e4957

JSONP は、JSON 形式の引数を持つ関数呼び出し(javascript)のコードとして応答を返します。
一般的な対処としては、以下のどちらかになります。

「あるjavascript」の実際のコードや、どこにリクエストを出しているのか、などを追記できるなら、もう少し的確な回答が付く可能性があります。


worldtravelさんのコメント
ありがとうございます。 ('') の部分は実際も空なのです。 リクエスト先は違うドメインなのですが、試しに同一ドメインにしたところ、エラーは無くなりました。 ただ、違うドメインでの設置を行ないたいと考えています。 「あるjavascript」は、こちらの部分で、役に立つでしょうか。 jQuery(function(){ jQuery('#hoge').change(function(){ jQuery.getJSON(url); jsonCallback=function(json_data){ *****(); } }); });

a-kuma3さんのコメント
>> ('') の部分は実際も空なのです。 << お、なるほど。 >> リクエスト先は違うドメインなのですが、試しに同一ドメインにしたところ、エラーは無くなりました。 << ということは、リクエストを出す先の も自分で作っている、もしくは口出しができるということでしょうか。 []http://www.[]*******/******.json の方を修正して、真っ当な Content-Type を設定する方が良いような気がします(今は、設定してない?)。

worldtravelさんのコメント
ありがとうございます。 作ったのは私ではないのですが、口は出せます。 > 真っ当な Content-Type を設定 phpでしたら1行書けば良いのでしょうけど、静的なjsonファイルを読み込んでいるだけなので、この場合はサーバの設定になるのでしょうか? もし、そうだとすると、サーバの設定までは出来ないですね。。。 jsonファイルの置き場所を変えるしか無いかもしれません。

a-kuma3さんのコメント
>> &gt; 真っ当な Content-Type を設定 phpでしたら1行書けば良いのでしょうけど、静的なjsonファイルを読み込んでいるだけなので、この場合はサーバの設定になるのでしょうか? << それは、JSON<span style="color:red;">P</span> ではありません。 JSONP は、以下ような形式の応答を返して、javascript のコードとして実行することでクロスドメイン制約を乗り越えようとするものです。 >|| my_callback_function(JSON 形式で表現されたオブジェクト); ||< JSON 形式のファイルの内容が応答として返って来ただけでは、callback 関数が呼ばれないので JSONP としては正しく動きません。 同じドメインにして動作するということなので、その辺りは、jQuery が吸収してくれているのでしょう。 >> もし、そうだとすると、サーバの設定までは出来ないですね。。。 << その json ファイルを置いている場所に、ちょっとしたプログラムを書くことはできないでしょうか。 + json ファイルを読み込む + パラメータから callback 関数の名前を切り出す + 応答ヘッダに application/javascript を設定する + 応答の内容として、「callback 関数の名前」+「(」+「json ファイルの内容」+「)」を返す というような。

worldtravelさんのコメント
お返事が遅くなりまして、申し訳ありません。 気がついておりませんでした。 再確認したのですが、この問題の置きているサーバでは 同一サーバ、同一ドメインにしてもダメでした。 別のサーバでは、全く同じ物が問題なく動作します。 問題のサーバで、http://xxxxx/hoge.jsonp とリクエストをすると Content-Type は何も返されていません。 > phpでしたら1行書けば良いのでしょうけど こちらは、phpでヘッダを出して、jsonファイルを読み込んで、そのまま表示する、 とすれば大丈夫なのかなと思って書きました。 > その json ファイルを置いている場所に、 > ちょっとしたプログラムを書くことはできないでしょうか。 残念ながら、できません。 気になったのですが、呼び出しているファイルは「hoge.jsonp」です。 中身は、下記の様になっているのですが、 これが仰っている1〜4の事かと思うのですが違いますでしょうか。 jsonCallback([省略]) > JSONP のときは応答の Content-Type ヘッダで application/javascript を返す こちらをサーバ管理者にお願いしてみます。 難しい気はしますが...

a-kuma3さんのコメント
>> 気になったのですが、呼び出しているファイルは「hoge.jsonp」です。 中身は、下記の様になっているのですが、 これが仰っている1?4の事かと思うのですが違いますでしょうか。 jsonCallback([省略]) << hoge.jsonp の中身がそうなっているのであれば、それは JSONP の形式です。 静的なファイルだと url につけている <code>?jsonCallback=xxx</code> は無駄な記述ですが、JSONP として jsonCallback 関数が呼び出されます。 >> &gt; JSONP のときは応答の Content-Type ヘッダで application/javascript を返す こちらをサーバ管理者にお願いしてみます。 難しい気はしますが... << そうですか、難しいですか。 .jsonp の MIME タイプを application/javascript にすれば、動くようになると思うのですが。

worldtravelさんのコメント
ありがとうございます。 取り敢えずは、返事待ち状態です。 ダメ元ですが、数日待ってみます。

a-kuma3さんのコメント
その hoge.jsonp ファイルは、自由に名前を付けられるのでしょうか。 静的なファイルで JSONP 形式ならば、hoge.js という名前で保存して、$.getJSON で hoge.js にアクセスすれば、application/javascript で返される可能性がかなり高いと思います。

worldtravelさんのコメント
ありがとうございます。 現在、諦めて、jsonpを使わない作りに変えました。 色々とありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ