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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

Q&A

解決済

2回答

1527閲覧

jsonを使ってjQueryで機能するモーダルウィンドウを作りたい

nabisuke78

総合スコア6

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Underscore.js

Underscore.jsは、JavaScriptのためのユーティリティライブラリです。JavaScriptの関数・配列、オブジェクトを扱う際に度々発生する処理がメソッドとしてまとめられています。他のライブラリに依存しないため、稼働中のアプリケーションにも導入可能です。

0グッド

0クリップ

投稿2018/07/27 06:31

編集2018/07/27 06:41

初めまして、以下のことを質問させてください。
jsonでモーダルウィンドウのボタンとモーダルウィンドウのhtmlを書き出しするのはできたのですが、
ボタンをクリックしてもモーダルウィンドウの中に描画したhtml(文字や画像)が出なくて困っています。
jsonでの出力ではなく、htmlにjsonの部分も全部書いた場合はモーダルウィンドウはうまく機能します。

どうすればうまくいくか試行錯誤しています。
モーダルウィンドウのjsに、例えばA会社のボタンをクリックしたら、A会社のidnameを取得するというようにjsを書き換えたらうまくいくのでは?と思い以下のことを試しています。

jsonの"idname"を
jsのvar link = self.attr(users.idname); で取得しようとしました。
うまく行きません。
jsonを読み込ませず、htmlとjsのみにした場合は、
var link = self.attr(users.idname);のところは、
var link = self.attr('href'); になります。

jsはunderscore.jsも使っています。

お忙しいところすみません、是非よろしくお願いいたします。

<jsonの部分>

json

1{"users": [ 2 3{ 4 "title":"A株式会社", 5 "cat":"website", 6 "filename":"a-company", 7 "idname":"#modal1", 8 "url":"http://a-company.co.jp/" 9}, 10{ 11 "title":"B株式会社", 12 "cat":"website", 13 "filename":"b-company", 14 "idname":"#modal2", 15 "url":"http://a-company.co.jp/" 16} 17 ] 18} 19

<jsの部分>

javascript

1(function($){ 2 3 $(document).ready(function(){ 4 $.ajax({ 5 dataType: "json", 6 url: "works.json", 7 success: function(data) { 8 // バインドするオブジェクト定義 9 var users = data.users; 10 // テンプレートを取得 11 var template = $("#external-template").text(); 12 // テンプレートを定義 13 var compiled = _.map(users, function(user) { 14 return _.template(template, user); 15 }); 16 outputResults(users); 17 outputResults2(users); 18 simpleModalWindow(users); 19 } 20 }); 21 }); 22 23(ここには、function outputResults(users); 24  function outputResults2(users); でhtmlにボタンとモーダルウィンドウのhtml出力 を記述) 25 26 function simpleModalWindow(users){ 27 28 var sp = 500; //アニメーション速度 29 var win = $(window); 30 var body = $('body'); 31 var bg = $('<div id="modal-bg"></div>'); 32 bg.css('opacity', '0'); 33 34 //モーダルウィンドウ表示クリックイベント 35 $(document).on('click', '.modal-open', function(){ 36 var py = win.scrollTop(); 37 var wh = win.height(); 38 var self = $(this); 39 var link = self.attr(users.idname); 40 var check = link.match(/^#.+/); 41 var mWin = $('<div id="modal-win"><div id="modal-win-inner"></div></div>'); 42 var mInner = mWin.find('#modal-win-inner'); 43 mInner.css('opacity', '0'); 44 body.append(mWin); 45 mWin.prepend(bg); 46 if(!check){ 47 mInner.append('<img src="' + link + '" alt="" />'); 48 var img = mWin.find('img'); 49 img.on('load', function(){ 50 view(img); 51 }); 52 } 53 else { 54 var contents = $(link); 55 mInner.append(contents); 56 contents.css({display: 'block', zIndex: '20001'}); 57 view(contents); 58 } 59 function view(a_elm){ 60 var w = a_elm.outerWidth(); 61 var h = a_elm.outerHeight(); 62 var mt = (wh - h) / 2 + py; 63 bg.animate({opacity: '.75'}, sp); 64 mWin.css('top', mt + 'px'); 65 mInner.css({width: w, height: h}).animate({opacity: '1'}, sp); 66 } 67 return false; 68 }); 69 70 //モーダルウィンドウ内要素変更クリックイベント 71 $(document).on('click', '.modal-move', function(){ 72 var py = win.scrollTop(); 73 var wh = win.height(); 74 var self = $(this); 75 var link = self.attr(users.idname); 76 var check = link.match(/^#.+/i); 77 var mWin = $('#modal-win'); 78 var mInner = mWin.find('#modal-win-inner'); 79 if(check){ 80 mInner.animate({opacity: '0'}, sp, function(){ 81 var nowContents = $(this).children(); 82 body.append(nowContents); 83 nowContents.hide(); 84 var contents = $(link); 85 mInner.append(contents); 86 contents.css({display: 'block', zIndex: '20001'}); 87 var w = contents.outerWidth(); 88 var h = contents.outerHeight(); 89 var mt = (wh - h) / 2 + py; 90 bg.animate({opacity: '.75'}, sp); 91 mWin.css('top', mt + 'px'); 92 mInner.css({width: w, height: h}).animate({opacity: '1'}, sp); 93 }); 94 } 95 return false; 96 }); 97 98 //モーダルウィンドウクローズクリックイベント 99 $(document).on('click', '#modal-bg, .modal-close', function(){ 100 var mWin = $('#modal-win'); 101 var mInner = mWin.find('#modal-win-inner'); 102 var contents = mInner.children(); 103 mInner.animate({opacity: '0'}, sp, function(){ 104 if(contents.attr("id")){ 105 body.append(contents); 106 contents.hide(); 107 } 108 mWin.remove(); 109 }); 110 bg.animate({opacity: '0'}, sp); 111 return false; 112 }); 113 114 }; 115 116})(jQuery);

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

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

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

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

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

guest

回答2

0

var link = self.attr(users.idname);

このusersというのはajaxのコールバック内のsimpleModalWindow(users);で送られてきているユーザー(会社?)情報ですよね。
おそらくusersは配列だと思いますのでアクセスするなら

var link = self.attr(users[i].idname);

のようにしないといけないのではないでしょうか?

投稿2018/07/28 06:15

keisukeh

総合スコア657

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

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

nabisuke78

2018/07/28 09:14

ご回答ありがとう御座います。 ご回答のようにして、var i = 1;も入れたらそこのエラーは消えました。 でも、 var check = link.match(/^#.+/); の部分で、 Cannot read property 'match' of undefined とエラーが出てしまいました。
nabisuke78

2018/07/28 09:28

このエラーは、要素が入っていない場合に起きるそうなので、users[i].idnameには要素が入っていないという事になりますね。 別の方法考えてみます。
nabisuke78

2018/07/28 09:52

alert(users[i].idname); で呼び出したら取得してました!! なので、 var link = self.attr(users.idname); のself.attrの部分を他の記述にしたらうまくいくかもしれないです。
guest

0

自己解決

すみません、jsonだと描画されたのをソースに直接描画できないので、htmlに直打ちして対応しました。
ご回答いただいたのに解決できなくて申し訳ないです。

投稿2018/07/31 03:05

nabisuke78

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問