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

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

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

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

jQuery

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

Q&A

解決済

1回答

2887閲覧

jQueryによるRSSの取得で日付表示の際、エラーが出る

lenlen

総合スコア44

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2017/08/09 14:21

編集2017/08/10 03:25

別ドメイン(jugemブログ)のRSSをjQueryにて取得&表示させるということを試みております。

RSSの取得表示のコードは下記の通りです。

javascript

1 $(function(){ 2 $.ajax({ 3 url: 'rss.php', 4 xmlType: 'xml', 5 cache: false, 6 success: function(xml) { 7 8 var row = 0; 9 var data = []; 10 var nodeName; 11 12 $(xml).find('item').each(function() { 13 data[row] = {}; 14 $(this).children().each(function() { 15 16 nodeName = $(this)[0].nodeName; 17 data[row][nodeName] = {}; 18 attributes = $(this)[0].attributes; 19 for (var i in attributes) { 20 data[row][nodeName][attributes[i].name] = attributes[i].value; 21 } 22 data[row][nodeName]['text'] = $(this).text(); 23 24 $(this).find('date,dc\\:date').each(function() { 25 26 var pubtime = $(this).text(); 27 pubtime = new Date(pubtime); 28 data[row].pubDate = pubtime.replace(/(\d+-\d+-\d+)T(\d+:\d+).+/,function(a,b,c) { 29 return b.replace(/-/g, '/') + ' ' + c; 30 }); 31 }); 32 33 }); 34 row++; 35 }); 36 for (i in data) { 37 38 console.log (data[i]); 39 $('#feed').append('<p>'+ data[i].pubDate +'</p><h3><a href="' + data[i].link.text + '" target="_blank">'+ data[i].title.text +'</a></h3>'); 40 } 41 } 42 }); 43 }); 44</script>

タイトルは取得に成功しているのですが、日付はdc:dateという要素に入っているためか、
日付の出力で「undefined」と出てしまいます。 これは調べてみると”未定義”ということらしいのですが、なぜ未定義なのかがわかりません。。

そしてWebデベロッパーツールのコンソールを開くと一点エラーが出ていました。それが下記のようなものです。「sun_raft is not defined」というのは見たことも聞いたこともなく、情報を調べても全くヒットせず、、どうか皆様の力をお借りしたいと思った次第です。

【エラー内容】

VM13268:1 Uncaught ReferenceError: sun_raft is not defined at <anonymous>:1:1 (anonymous) @ VM13268:1 setTimeout (async) cloud @ all.js:78 animation @ all.js:53 (anonymous) @ VM13267:1 setTimeout (async) (anonymous) @ all.js:49 i @ jquery.min.js:2 fireWith @ jquery.min.js:2 ready @ jquery.min.js:2 K @ jquery.min.js:2

主に参考にしたブログはこちらです。
http://blog.embellir-design.com/article/JQuery_RSS.html?seesaa_related=category

何卒宜しくお願い致しますm(__)m

【追記①】

ご質問頂きました件です。

success: function(xml) {
の直後で
console.log (xml);
として確認いたしました。

確かにタイトルやリンク、日付など、必要なRSSフィード情報が全て入っておりました。

またPHPの動作環境は整っております。

ちなみにPHPファイル(rss.php)の中身は下記のようになっております。

php

1<?php 2$url = "URLが入っています"; 3$xml = file_get_contents($url); 4header("Content-type: application/xml; charset=UTF-8"); 5print $xml; 6?>

【追記②】

$(this).find('date,dc\:date').each(function() {

の後でconsole.log($(this)); をしても何も返ってきていないようでした。
もしかして、ヒットすらしていないということでしょか?

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

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

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

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

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

m.ts10806

2017/08/09 22:43 編集

success 時点でxmlをコンソール出力すると想定した情報が取得できていますか?また、rss.phpの内容は参照先と変更ありませんか?(あとPHP動作環境はできていますか?)
lenlen

2017/08/10 00:41

有難うございます!m(__)m ご質問頂いた点について追記を致しました。何卒宜しくお願い致します。
guest

回答1

0

ベストアンサー

日付はdc:dateという要素に入っているため

なら、素直にこれでいいんではないでしょうか?

javascript

1 $(this).find('dc:date').each(function() {

##追記

jQueryでdc:titleのような : (コロン) があるXMLタグの中身を読む
http://qiita.com/futosu/items/ad61eb7584dc70ccce76

なるほど、\でエスケープと書いてありますね。

ただ、この\エスケープはFirefoxとIE用とも書いてあります。
元表記のコードを、chromeで確認しようとしてたので取得できなくてundefinedだった、とかではありませんか?
このサイトの情報に従って、

javascript

1$(this).find('date , dc\\:date').each(function() {

とすれば全ブラウザでいけるのではないでしょうか。

投稿2017/08/10 02:08

編集2017/08/10 02:33
zohnam

総合スコア1441

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

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

lenlen

2017/08/10 02:19

ご回答有難うございますm(__)m $(this).find('dc:date').each(function() { としても、「undefined」となってしまいます。。 :コロンは\\バックスラッシュを入れる必要があるとどこかのサイトで知ったのですが、その必要はないのでしょうか?
lenlen

2017/08/10 03:09

貴重なお知恵を追記頂きありがとうございます! バックスラッシュのエスケープはFirefoxとIE用だったのですね。 しかし、$(this).find('date , dc\\:date').each(function() { と記述してもundefinedになっていまいました。 ちなみに全ブラウザでこのようになっております。
zohnam

2017/08/10 04:14

undefinedはどの時点ででていますか? たとえば、 var pubtime = $(this).text(); console.log(pubtime); としたとき、予定通りpubtimeは出力されますか?
lenlen

2017/08/10 05:14

console.log(pubtime);とすると何も返っていませんでした! $(this).find('date,dc\\:date').each(function() { の中身の全てが実行されていないようです。。
zohnam

2017/08/10 05:26

$(this).find('date,dc\\:date').each(function() { この$(this)の子要素として、たしかに<dc:date>は存在していますか? この1行上に、 console.log(["dc",$(this).html(),$(this).find('date,dc\\:date').length]); と入れたら、どう表示されます?
lenlen

2017/08/10 05:45

本当にご親切に有難うございます。 そのような検証方法があるんですね!下記のように出力されていました。 (3) ["dc", "URLが入っていました", 0] (3) ["dc", "タイトルが入っていました", 0] ↑ このような並びの中に ["dc", "2014-06-11T17:18:37+09:00", 0] と日付がはいっていました。 dc:dateがそもそも入っていなかったんですね。。 これを出力するようにしてみます。
zohnam

2017/08/10 06:05

入っていなかったというか、探している場所が深すぎるんじゃないかと疑ってましたが、やはりそうだったようですね。 こういう構造 $(this).children().each(function() {// xmlのitemの子要素全部 の中に $(this).find('date , dc\\:date').each(function() { が入ってましたけど、この時点の$(this)のうちのひとつが<dc::date>のはずです。 .find()は「全ての子要素・孫要素など」から探すものですから、「自分自身は対象外」です。 探せないのも当然ですよね。
lenlen

2017/08/10 06:14

あ、そういうことなのですね!>< 理解致しました。 子孫がないのに子孫を探していたということですか。なるほどです!
lenlen

2017/08/10 07:56

ここまでご親切にご対応頂きありがとうございました!結果、日付を取得することができましたm(__)m --------------- $(this).find('date,dc\\:date').each(function() { var pubtime = $(this).text(); pubtime = new Date(pubtime); data[row].pubDate = dateFormat(pubtime); }); おっしゃる通りにこちらの塊を外へ出してやることで、dc:dateを探すことが出来ました。 最後に日付の整形部分で関数未定義エラーが出ていたので、日付の整形は下記の関数を使いました。 ------------------------------------ function dateFormat(date) { var y = date.getFullYear(); var m = date.getMonth() + 1; var d = date.getDate(); var w = date.getDay(); m = ('0' + m).slice(-2); d = ('0' + d).slice(-2); return y + '年' + m + '月' + d + '日'; } ------------------------------------ この度は親切丁寧にコメントを頂き大変助かりましたのでベストアンサーに選ばさせて頂きました。 とても勉強になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問