【メモ】vue-chartjs を入れて「[Vue warn]: Invalid prop: type check failed for prop “chartData”」が出る場合の対処方法【#np2020】

グラフを描くJavaScriptライブラリとして最近人気なのが「Chart.js」というやつらしいです。このサイトでもいくつかグラフを作っていますが、いまだにFlashを利用していていい加減切り替えたいと思ってテスト中です。

続きを読む

JavaScript エラー「Uncaught SyntaxError: Unexpected end of input」への対応

記録されたエラーは下記の通り。

"message": "Uncaught SyntaxError: Unexpected end of input",
"file": "",
"lineNo": 1,
"colNo": 158,
"stack": "SyntaxError: Unexpected end of input",
"user_agent": "Mozilla/5.0 (Linux; Android 7.1.1; OPPO A79; Build/N6F26Q; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.92 Mobile Safari/537.36 SogouMSE,SogouMobileBrowser/5.6.0"
このエラーは一般的にはコーディングのミスで発生するものです。例えば閉じ括弧を付け忘れたとか。 Uncaught SyntaxError: Unexpected end of inputというエラー でもこのエラーは長く安定して動いている(はずの)スクリプトで生じていて、十分にチェックしてもそのての文法ミスは見つかりません。しかも毎回記録されるわけではなく、何か特定の条件が重なったときにだけ記録されるようです。もし閉じ括弧の付け忘れなら、毎回エラーが記録されるはず。 致命的な問題にはなっていなさそうだけれど、気持ち悪いので調査を続けたところこんな情報が。

analog_MultiMeter: JSON.parseでハマった

原因 ChromeのJSON.parseは、空文字が入るとおかしなことになるらしい。 JSでは空文字列はfalse性を持つので、上記の対策で通るという事。 そのエラー発生は良いとしても、JSON.parse()のエラーでなくてEnd of Inputなんてわかりづらいエラー、それもHTMLの1行目なんかに出るのが悲しい。

なるほど。 ChromeのJSON.parse()に空文字を入れるとエラーになると。エラーログからでは具体的にどのJavaScriptファイルでエラーが出ているのかわからないし、そもそも1行目のエラーとなっていて問題の特定が難しかったけれど、幸いサイト内で「JSON.parse()」を使っている部分は限られていたので、そこを改修。 もともと発生頻度の低いエラーなのでこれで効果があるかどうかは不明だが、しばらく様子を見たいと思います。 ちなみに僕が見た環境での「JSON.parse()」は、こんな感じで使われていました。
function (error) {
var obj_error = JSON.parse(error);
}
どこかで生じたエラーをキャッチしてエラー処理を行う的な感じの部分。errorはエラーメッセージを格納するようでPHPとの連携がある部分なんですが、コードを追っていくとどうやら、一部の古いコードで例外は投げるがエラーメッセージは投げない、という処理がなされている模様。それがJavaScript側に渡され、空のerrorが作られ、それを JSON.parse() しようとしてエラーが出る……みたいな流れ。 そう考えると悪いのはPHPのコードの方なんじゃないのという気もしないでもないけど、だとしても空文字に対する処理は必要だし。とりあえず解決したっぽくて良かった。

続きを読む

米Yahoo!のYQLサービスが終了してました(なんてことだ)

先月の頭くらいに、動かなくなっていたGoogle Feed API を YQL で置き換えるということをやりました。 Google Feed API を YQL で置き換え | mutter これを使ってサイト内でRSSを読み込んで表示するということをやって上手く行っていたんですけど、最近また上手く表示されていないようなので見に行ったら……YQL終わってました。

YQL – Yahoo Developer Network

Important EOL Notice: As of Thursday, Jan. 3, 2019, the YQL service at query.yahooapis.com will be retired.

マジかー。まあいかにもYahoo!らしい時代遅れな感じのサービスではあったけども、それなりに便利そうだったのに。今どきは流行らないか。 仕方ない、Vue.jsで実装するかなあ……と思ったけど、そうだ、相手がはてなブックマークRSSの時のCoRSの解決方法が僕にはわからないんだった。一旦サーバ側で情報を取得してから、 ヘッダ付けてVue.js用に出力し直せば出来るかなあ。面倒くさすぎるけど。 ……復活は引っ越し後かな。。

続きを読む

【今日のハマり処】コンポーネントのテンプレートをnew Vue のルートに入れて `Property is not defined on the instance.`

Vue.js logo

別々のページで開発していた機能を一つのファイルにまとめることとして、そのままだと全部のページで 他サービスのAPIにGETリクエストを投げてしまうからそこをコンポーネントに切り分けて、必要なときだけリクエストを投げるようにした……まではよかったんだけど、描画されない。

続きを読む

Google Feed API を YQL で置き換え

yql.jpg RSSフィードを読み込むためのGoogleライブラリ「Google Feed API」が正式に廃止されたのは2017年1月ということなので、もう2年近く放置してたってことになりますが、サイトをいろいろ直しているついでにそれも何とかしておこうと言うことで代替手段を探すとYQLで代替するのが一番スマートそう。

続きを読む

【メモ】jQueryのPOST通信エラー

5aeea1845616c563c675a7c6424b9d21_s.jpg jQueryのajax関数で送信したときのエラーをハンドリングすると、

  • textStatus : error
  • errorThrown.message: 空
となって原因の特定に時間が掛かってしまいましたが、解決後に症状と原因を考えて列挙するとこんな感じ。

スクリプトの流れ

  1. フォームを生成
  2. buttonをクリックし、イベントハンドラでAjax処理
  3. 引数を付加してPOST通信
  4. サーバ側でDB処理を行う
  5. 成功したらページを再読込み

サンプルコード

$.ajax({
type : 'post',
url : 'sample.php',
data : {
'id' : 'sampleID'
}
}).done(function(data, textStatus, jqXHR) {
// ページを再読み込み
window.location.reload(true);
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
console.log(errorThrown);
});

続きを読む

【メモ】タグに独自属性を設定してjQueryで取得する

独自データ属性 – グローバル属性 – HTML5 タグリファレンス – HTML5.JP

独自データ属性は、名前空間に属さない属性で、その名前は文字列 “data-” で始まり、ハイフンの後に少なくとも一文字が続きます。これは XML 互換で、ASCII 大文字 を含みません。 (中略) すべての HTML 要素に対して、独自データ属性をいくつでも、どんな値でも指定することができます。

使用例

Ippei Suzuki
これを取得するには、 関数data()を使うと便利です。
$('#userName').data('userId');

注意

data()は、もともとは要素にデータを付与しそれを取得するための関数で、HTMLのパースとは関係がありません。付与されたデータはjQueryのキャッシュデータとして保存されます。一方で属性を取得する関数attr()の方は、キャッシュは利用をせずHTMLを読みに行くので、この2つを同時に使うと混乱します。具体的には、atr()で更新したデータがdata()で取得出来ないなど。
$('#userName').data('userId'); //1234
$('#userName').attr('data-userId', '5678');
$('#userName').data('userId'); //1234 ← キャッシュを読み込む
$('#userName').attr('data-userId'); //5678 ← 属性を見る
その辺りは気をつけて上手いこと処理してやる必要があるようです。

参考

独自データ属性 – グローバル属性 – HTML5 タグリファレンス – HTML5.JP jQueryのdata-*属性キャッシュ仕様と対策

続きを読む

コンテンツの終わりまで読み込むと次のコンテンツを自動的に読み込む(autoload) 【feedpost tips】

jQuery.jpg 先日リリースしたTumblr用ツール「feedpost」で採用している技術を紹介するシリーズ。 5回目はコンテンツの終わりまで読み込むと次のコンテンツを自動的に読み込む仕組み、通称「autoload」とか「autopager」とか言われている仕組みの実装です。

続きを読む

スマートフォンでのタッチアクションを実装するjQueryプラグイン「hammer」 【feedpost tips】

jQuery.jpg 先日リリースしたTumblr用ツール「feedpost」で採用している技術を紹介するシリーズ。4回目はスマートフォンでのタッチアクションを実装するjQueryプラグイン「hammer」。独立版とjQuery版とあるのだけど、その辺はお好みで。ここではjQuery版。導入はとっても簡単で、jQueryと一緒に読み込むだけ。使い方の例は例えばこんな感じ。

続きを読む