teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

編集

2018/01/13 14:09

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -45,6 +45,8 @@
45
45
 
46
46
 
47
47
  以下以前の回答。お恥ずかしい限りです。
48
+
49
+ <以前の回答>
48
50
  #
49
51
 
50
52
  まさか、`#a`が表す要素がなかったとかそんなオチじゃないでしょうね?
@@ -205,4 +207,6 @@
205
207
 
206
208
  - [クロスドメインアクセスを理解してWeb APIを楽しく使おう](https://www.slideshare.net/mobile/kitfactory/web-api-34814937)
207
209
 
208
- - [Ajaxのjsonp・callbackの仕組みについて解説します。](http://javatechnology.net/ajax/jsonp-callback/)
210
+ - [Ajaxのjsonp・callbackの仕組みについて解説します。](http://javatechnology.net/ajax/jsonp-callback/)
211
+
212
+ </以前の回答>

5

真の解法の発見

2018/01/13 14:09

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -1,3 +1,52 @@
1
+ # 真・解法の発見
2
+
3
+ 散々追記した後になって初めて質問者様に挙げていただいた[1分でわかるjQuery $.ajaxによるJSON・JSONP読み込み方法](https://iwb.jp/jquery-ajax-jsonp/)を読み、さらにもうすでにクロスドメインについてこの記事で記述されていることに気づきショックを受けた上で、ようやく解法を見つけたので、上に載せます。何度も何度も追記してごめんなさい。一気にしろって感じですよね(^ ^;
4
+
5
+ ```html
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <meta charset="UTF-8">
10
+ <title>107356</title>
11
+ </head>
12
+ <body>
13
+ <table id="a" border=1>
14
+ <tr>
15
+ <th>version</th>
16
+ <th>codename</th>
17
+ </tr>
18
+ </table>
19
+
20
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
21
+ <script>
22
+ $.ajax({
23
+ type: 'GET',
24
+ url: 'https://iwb.jp/s/js/data.jsonp',
25
+ jsonpCallback: 'android',
26
+ dataType: 'jsonp'
27
+ }).then(
28
+ function(json){
29
+ var a = $("#a");
30
+ json.forEach(function(val){
31
+ a.append("<tr><td>" + val.version + "</td><td>"+ val.codename + "</td></tr>");
32
+ });
33
+ },
34
+ function(a,b,c){ // ここテキトーに書いてますので真に受けないでください。
35
+ alert('ERROR');
36
+ alert(a.status);
37
+ alert(b);
38
+ alert(c);
39
+ }
40
+ );
41
+ </script>
42
+ </body>
43
+ </html>
44
+ ```
45
+
46
+
47
+ 以下以前の回答。お恥ずかしい限りです。
48
+ #
49
+
1
50
  まさか、`#a`が表す要素がなかったとかそんなオチじゃないでしょうね?
2
51
 
3
52
  ```html

4

一部訂正

2018/01/13 14:04

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -43,9 +43,9 @@
43
43
 
44
44
  ローカルサーバーを立ち上げた場合はもちろん、ローカルファイル(file://)からの実行でも同様のエラーが生じるみたいですね。html文書を介さずそのままアクセスする場合はこの限りでは無いのでしょう。
45
45
 
46
- とりあえず、解決法としては本末転倒かもしれませんけど、[https://iwb.jp/s/js/data.json](https://iwb.jp/s/js/data.json)の先にあるjsonファイルをローカルサーバーに置き、ローカルサーバーにアクセスさせるしかないような気がします。
46
+ ~~とりあえず、解決法としては本末転倒かもしれませんけど、[https://iwb.jp/s/js/data.json](https://iwb.jp/s/js/data.json)の先にあるjsonファイルをローカルサーバーに置き、ローカルサーバーにアクセスさせるしかないような気がします。~~
47
47
 
48
- または先に挙げたQiitaの記事にあるようにブラウザ側の設定を変える(というよりは違うモードで起動する)というのも手かもしれません。
48
+ ~~または~~先に挙げたQiitaの記事にあるようにブラウザ側の設定を変える(というよりは違うモードで起動する)というのも手かもしれません。
49
49
 
50
50
  ##検証用コード
51
51
 
@@ -141,4 +141,19 @@
141
141
  httpd.serve_forever()
142
142
  ```
143
143
 
144
- このまま実行するとおそらくreturn_json.pyに実行権限がないために`403 forbidden error`になりますので、return_json.pyに実行権限を付けてから実行してみてください。m(_ _)m
144
+ このまま実行するとおそらくreturn_json.pyに実行権限がないために`403 forbidden error`になりますので、return_json.pyに実行権限を付けてから実行してみてください。m(_ _)m
145
+
146
+ #
147
+
148
+ 2018/1/13(土)追記:
149
+
150
+ `jsonp`という指定方法があるみたいですね。
151
+ [dendenmushi様の次の質問](https://teratail.com/questions/108809)のおかげで知ることができました。ありがとうございます。m(_ _)m
152
+
153
+ 適当なこと(取り消し線内部)を書いて勝手に決めつけてかかりすみません…(本質問2回目の失敗…(^ ^;)
154
+
155
+ 以下適当に検索をかけてヒットしたサイトです。この回答を見た人のために一応載せるという感じで特に意味はないです。
156
+
157
+ - [クロスドメインアクセスを理解してWeb APIを楽しく使おう](https://www.slideshare.net/mobile/kitfactory/web-api-34814937)
158
+
159
+ - [Ajaxのjsonp・callbackの仕組みについて解説します。](http://javatechnology.net/ajax/jsonp-callback/)

3

ミスの編集、他

2018/01/13 12:55

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -47,12 +47,12 @@
47
47
 
48
48
  または先に挙げたQiitaの記事にあるようにブラウザ側の設定を変える(というよりは違うモードで起動する)というのも手かもしれません。
49
49
 
50
- ##
50
+ ##検証用コード
51
51
 
52
52
  ディレクトリ構成
53
53
 
54
54
  /
55
- cgj-bin/
55
+ cgi-bin/
56
56
  ┃ ┣ data.json
57
57
  ┃ ┗ return_json.py
58
58
  ┣ index.html

2

追記

2018/01/08 16:40

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -33,4 +33,112 @@
33
33
  </html>
34
34
  ```
35
35
 
36
- 私の環境ではこれでうまくいきましたがどうでしょうか?
36
+ 私の環境ではこれでうまくいきましたがどうでしょうか?(※注 追記: コメント欄みてください。m(_ _)m)
37
+
38
+ ##追記
39
+
40
+ 私はサーバーには全く明るく無いのですけど、原因がわかりましたので追記させてください。
41
+
42
+ `クロスドメイン制約`(参考:[【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法 - Qiita](https://qiita.com/growsic/items/a919a7e2a665557d9cf4))が今回の諸悪(むしろ悪いのは我々ですが笑)の根源のようです。
43
+
44
+ ローカルサーバーを立ち上げた場合はもちろん、ローカルファイル(file://)からの実行でも同様のエラーが生じるみたいですね。html文書を介さずそのままアクセスする場合はこの限りでは無いのでしょう。
45
+
46
+ とりあえず、解決法としては本末転倒かもしれませんけど、[https://iwb.jp/s/js/data.json](https://iwb.jp/s/js/data.json)の先にあるjsonファイルをローカルサーバーに置き、ローカルサーバーにアクセスさせるしかないような気がします。
47
+
48
+ または先に挙げたQiitaの記事にあるようにブラウザ側の設定を変える(というよりは違うモードで起動する)というのも手かもしれません。
49
+
50
+ ##
51
+
52
+ ディレクトリ構成
53
+
54
+ /
55
+ ┣ cgj-bin/
56
+ ┃ ┣ data.json
57
+ ┃ ┗ return_json.py
58
+ ┣ index.html
59
+ ┗ server.py
60
+
61
+ data.json
62
+
63
+ ```json
64
+ [
65
+ {
66
+ "version": "1.5",
67
+ "codename": "Cupcake"
68
+ },
69
+ {
70
+ "version": "1.6",
71
+ "codename": "Donut"
72
+ },
73
+ {
74
+ "version": "4.4",
75
+ "codename": "KitKat"
76
+ }
77
+ ]
78
+ ```
79
+
80
+ return_json.py
81
+
82
+ ```python
83
+ #!/usr/bin/env python
84
+ # -*- coding: UTF-8 -*-
85
+
86
+ with open('data.json') as f:
87
+ json = f.read()
88
+
89
+ print('Content-type: application/json\n')
90
+ print(json)
91
+ ```
92
+
93
+ index.html
94
+
95
+ ```html
96
+ <!DOCTYPE html>
97
+ <html>
98
+ <head>
99
+ <meta charset="UTF-8">
100
+ <title>107356</title>
101
+ </head>
102
+ <body>
103
+ <table id="a" border=1>
104
+ <tr>
105
+ <th>version</th>
106
+ <th>codename</th>
107
+ </tr>
108
+ </table>
109
+
110
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
111
+ <script>
112
+ $.ajax({
113
+ type: 'GET',
114
+ url: './cgi-bin/return_json.py',
115
+ dataType: 'json'
116
+ }).then(
117
+ function(json){
118
+ var a = $("#a");
119
+ json.forEach(function(val){
120
+ a.append("<tr><td>" + val.version + "</td><td>"+ val.codename + "</td></tr>");
121
+ });
122
+ },
123
+ function(){
124
+ alert('ERROR');
125
+ }
126
+ );
127
+ </script>
128
+ </body>
129
+ </html>
130
+ ```
131
+
132
+ server.py
133
+
134
+ ```python
135
+ from http.server import HTTPServer, CGIHTTPRequestHandler
136
+
137
+ class Handler(CGIHTTPRequestHandler):
138
+ cgi_directories = ["/cgi-bin"]
139
+
140
+ httpd = HTTPServer(("", 8080), Handler)
141
+ httpd.serve_forever()
142
+ ```
143
+
144
+ このまま実行するとおそらくreturn_json.pyに実行権限がないために`403 forbidden error`になりますので、return_json.pyに実行権限を付けてから実行してみてください。m(_ _)m

1

コードの編集

2018/01/08 16:25

投稿

namnium1125
namnium1125

スコア2045

answer CHANGED
@@ -8,7 +8,12 @@
8
8
  <title>107356</title>
9
9
  </head>
10
10
  <body>
11
- <div id="a"></div>
11
+ <table id="a" border=1>
12
+ <tr>
13
+ <th>version</th>
14
+ <th>codename</th>
15
+ </tr>
16
+ </table>
12
17
 
13
18
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
14
19
  <script>
@@ -19,7 +24,7 @@
19
24
  success: function(json){
20
25
  var a = $("#a");
21
26
  json.forEach(function(val){
22
- a.append("<div>version: " + val.version + "</div><div>codename: "+ val.codename + "</div><br />");
27
+ a.append("<tr><td>" + val.version + "</td><td>"+ val.codename + "</td></tr>");
23
28
  });
24
29
  }
25
30
  });