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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

9820閲覧

jqueryの一部が、ChromeやSafariでうまく動作しない

hirottsu76

総合スコア13

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/09/16 01:41

編集2016/09/16 02:50

###前提・発生している問題
jqueryのajaxメソッドで、DBのデータをJSON形式で取得し、
jqueryでhtmlを動的に書きかえてダイアログを表示するプログラムを書いています。
これが、IEでは想定通りの動作をしますが、ChromeやSafariだと、
jqueryの一部メソッド(.html と .attr)がうまく動作しておらず、ダイアログは空欄のまま表示されます。

###該当のソースコード(抜粋)
○表示するダイアログ部分

html

1<template id="dialog" hidden> 2<article> 3<header> 4<p id="name">投稿者:<span></span></p> 5<p id="date">投稿日時:<time datetime=""></time></p> 6</header> 7<p id="text"><span></span></p> 8</article> 9</template>

○取得されるJSONデータ(例)

json

1{ "article" : [ 2 { 3 "id" : "777", 4 "name" : "john", 5 "date" : "2016-09-16T10:30:00.000", 6 "dateString" : "2016年9月16日10:30", 7 "text" : "hogehoge" 8 }] 9}

○htmlを書きかえてダイアログ表示している部分(ajaxメソッドのsuccess関数)

javascript

1function(json){ 2 $("#dialog").dialog("option", { title : json.article[0].id }); 3 $("#name span").html(json.article[0].name); 4 $("#date time").attr("datetime", json.article[0].date); 5 $("#date time").html(json.article[0].dateString); 6 $("#text span").html(json.article[0].text); 7 8 $("#dialog").dialog("open"); 9}

###試したこと
・span要素やtime要素にid属性を付与して、jqueryのセレクタを変更しても、動作は変わりませんでした。
・firefoxでも同様に動作しませんでした。
・success関数の先頭に、以下を追記すると、どのブラウザでも「john」のアラートが表示できます。
(jsonの取得には成功している)

javascript

1alert(json.article[0].name);

・success関数の先頭に、以下を追記すると、
IEでは空欄のアラートが表示され、その他は「undefined」のアラートが表示されます。
(やはりhtmlメソッドの挙動が怪しい)

javascript

1alert($("#name span").html());

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

kei344

2016/09/16 03:31

jQuery以外の使用しているライブラリを提示ください。
hirottsu76

2016/09/16 05:10

jquery本体と、jquery ui を使用していました。
guest

回答4

0

ベストアンサー

手元でも色々試してみましたが、template要素を使っていることが原因と思われます。一度、template要素をdiv要素あたりにでも変えて、動作が変わるか確認してみてください。

IEはtemplate要素に対応していないので、逆に問題無く動作しているのだと思います。

JavaScript

1console.log($("#dialog").prop("content")); 2//IE : undefined 3//Firefox: DocumentFragment 4//Chrome : #document-fragment 5//Safari : インストールしていないので試していませんが、 6// きっとDocumentFragmentが返ってくるはず…

template要素を使うことで、その内容は、表の世界から切り離されたような状態となります。

HTML

1<template id="dialog"> 2 <p id="hoge"></p> 3</template> 4 5<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script> 6<script> 7console.log($("#dialog").length); //1 8console.log($("#hoge").length); //IE: 1, Other: 0 9</script>

個人的には、スクリプトからHTMLを生成するようにしたほうが早いような気がしますが、template要素のままで行くなら、先にフラグメントから中身をコピーしてから、$.dialogを動かしたり、内容を設定したりする必要があります。

JavaScript

1var json = JSON.parse('{"article":[{"id":"777","name":"john","date":"2016-09-16T10:30:00.000","dateString":"2016年9月16日10:30","text":"hogehoge"}]}'); 2 3var $dialog = $("<div></div>"); 4//dialog用の要素を生成 5 6var frag = $("#dialog").prop("content") ? $($("#dialog").prop("content")).clone() : $("#dialog").contents(); 7$dialog.append(frag); 8//template要素にcontentプロパティがある=template要素に対応しており、内容がフラグメントになっている 9 10//IEはtemplate要素に対応しておらず、template要素の内容がフラグメントになっていないので、cloneするとidが重複してしまう 11//そのため、IEは複製した内容ではなく、template要素の中身をまるっと$.appendで移す 12//(もし、ダイアログをdestroyする場合は、template要素に戻さないとtemplate要素の中身が空です) 13//あるいは、事前にtemplate要素の内容をフラグメントに移しておくという手も 14 15//idをやめてclassにでもすると、このような煩雑さは回避できます 16//あるいは、先述のように使うHTMLを全てスクリプトから生成する 17 18$dialog.dialog({autoOpen: false}); 19$dialog.dialog("option", { title : json.article[0].id }); 20$("#name span").html(json.article[0].name); 21$("#date time").attr("datetime", json.article[0].date); 22$("#date time").html(json.article[0].dateString); 23$("#text span").html(json.article[0].text); 24$dialog.dialog("open");

投稿2016/09/16 04:17

編集2016/09/16 04:20
sii_side

総合スコア849

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

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

hirottsu76

2016/09/16 05:12

ご回答ありがとうございました。 templateタグをdivタグに変えたところ、想定通りの動作をしました。 template要素の働き方までご丁寧にお教えいただき、とても勉強になりました。 ベストアンサーとさせていただきます。
guest

0

template要素の使い方がマズイかなと。テンプレートそのものにデータを入れるのではなく、
テンプレートから要素を複製した上で、そこにJSONのデータを挿入する形になります。
一旦Ajax抜きで試せる形にしていますので、必要に応じて書き換えてみてください。

html

1<template id="dialog"> 2<article id="article"> 3<header> 4<p id="name">投稿者:<span></span></p> 5<p id="date">投稿日時:<time datetime=""></time></p> 6</header> 7<p id="text"><span></span></p> 8</article> 9</template>

javascript

1var json = { "article" : [ 2 { 3 "id" : "777", 4 "name" : "john", 5 "date" : "2016-09-16T10:30:00.000", 6 "dateString" : "2016年9月16日10:30", 7 "text" : "hogehoge" 8 }] 9} 10 11var show = function(json){ 12 var $dialog = $("#dialog"), // template取得 13 clone = $dialog[0].content.cloneNode(true), // templateから複製 14 $content = $(clone.querySelector('#article')), // 複製したコンテンツをjQueryオブジェクトに変換 15 data = json.article[0]; 16 17 $content.find("#name span").html(data.name); 18 $content.find("#date time").attr("datetime", data.date); 19 $content.find("#date time").html(data.dateString); 20 $content.find("#text span").html(data.text); 21 $('body').append($content); // 指定位置(今回はbody)に挿入 22} 23 24show(json);

参考

投稿2016/09/16 03:25

yamato_hikawa

総合スコア2092

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

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

hirottsu76

2016/09/16 05:13

ご回答ありがとうございました。 ご指摘の通り、template要素の使い方に問題がありました。 勉強になりました。
guest

0

もっと該当箇所をしぼった方がよさそうですね

HTML

1<script> 2$(function(){ 3 $.ajax({ 4 url:"対象ファイル", 5 success:function(){ 6 console.log($('#name span').html()); 7 }, 8 }); 9}); 10</script> 11<p id="name">投稿者:<span>test</span></p> 12

これで通るなら徐々に設定を足していってください

投稿2016/09/16 03:25

yambejp

総合スコア114784

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

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

hirottsu76

2016/09/16 05:10

ご回答ありがとうございました。
guest

0

このソースだけだと断定できませんが…

コンソールにはどのようにエラーが出ますか?
これはローカルで実行していますか?
ローカルの場合、Chromeなどはajaxでjsonを取得する際にXHRエラーを出すと思います。
(セキュリティの関係でほかのローカルファイルにはアクセスしない)
データが入っていないためダイアログが空欄なのではないかと想像します。

投稿2016/09/16 02:21

NatsumiOki

総合スコア1298

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

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

hirottsu76

2016/09/16 02:39

ご回答ありがとうございます。 ご確認いただいた点ですが、 ①コンソールには全くエラーが出ません。 ②ローカル・リモートサーバ、同様の結果が出ます。 ③alertでJSONの中身を表示させると、Chromeでも問題なく表示できます。 以上から、jqueryの動作の問題だと睨んでいます...
NatsumiOki

2016/09/16 02:54

ajaxは非同期なので、 successで $("#name span").html(json.article[0].name); が実行されるまでのわずかな間に、 alert($("#name span").html()); が先に実行されているのではないでしょうか? そうするとここに辿り着いた時点ではspanにデータが入っていないと思うのですが…
NatsumiOki

2016/09/16 02:56

失礼、successの中に入れているのですね 先頭に入れてるなら、やはりspanにデータが入る前なのでは?と思います コード全体を掲載することはできませんか?
hirottsu76

2016/09/16 05:13

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問