Posts Tagged ‘Webkit’

[jQuery]Uncaught TypeError: Property ‘submit’ of object が出た時のTips


2012
02.08

ちょっとハマったのでメモ。

 

静的な項目をチェックするなら jquery.validate.js で一発OKなのですが、動的に項目が増減するフォームで入力チェックをしたい時は自作しなきゃならない事がまま有ります。

今回複数ページに渡りそう言うフォームになっていて、一つ手前のページでは行けるのに次のページでは Uncaught TypeError: Property ‘submit’ of object と言うエラーが出てしまう。

 

どうやらその関数は既に有るから重複したものは作らないでくださいよー

 

と言うコンフリクト系のエラーらしい。

いや、でも一つ前のページでは機嫌良く動いてるじゃないですかやだー。と言う状態で少しハマったが、解決出来ました。

 

再現方法

javascript

1
2
3
4
5
6
$(function() {
    $('#submit').click(function() {
        /*  小難しい処理とか色々 */
        $('#form').submit();
    });
});

html

1
2
3
4
<form name="form" id="form" action="hoge.php" method="post">
    <input type="text" name="hoge" id="hoge" value="" />
    <img src="path/button.gif" id="submit" />
</form>

これで少なくとも webkit 系のブラウザなら再現します。

 

ちなみに「onsubmit 使えよ!」と言われるかも知れませんが、私が今作成しているフォームはサブミットしなければならないボタンが同一フォーム上に3つ以上あります。

なので type に submit や image は使えなくて、img や button に関数を割り当てて各々パラメータ変更してから submit() してやると言う仕組みなんですね。

 

さてさて、google 先生に聞いても有効な回答が得られなかったので自分で考えてみます。

まずこのエラーはコンフリクト系のエラーと言う事は解ったので、ソースを見直して見る。

JS 側は動いているページが有るので問題無いはずなので、html に注目。

ああ、ひょっとして form 内から実行してるからか…?怪しいので html を変更。

 

html(訂正版)

1
2
3
4
<form name="form" id="form" action="hoge.php" method="post">
    <input type="text" name="hoge" id="hoge" value="" />
</form>
<img src="path/button.gif" id="submit" />

 

直りました。

 

要するに #submit が form 内に入っていると form 自体が持っている function submit を継承か何かするようで、そこで submit() を実行するとエラーになる。と言う事らしい。

外に放りだした事により、親要素(書いてないけど)の div は funciton submit を持っていないからエラーが無くなった。やったね!

 

変な所でハマると時間気になって精神衛生上宜しく無いですよね。

 

[CSS3|jQuery|Webkit]translate3d等のtransformで設定した現在値を取得したい


2011
09.26

皆さんご無沙汰しております、Web屋の中の人です。

手術やらリハビリやら、少々複雑なシステム開発案件等でお勉強の方を長期に渡り休止しておりましたが久々にやってみようと言う事でインターフェイスの調整やバグ取り、むしろソースの整理なんかをしているとタイトルの状況になりました。

iPhoneiPad 上でアニメーションしたい時は、jQuery.animate は原則使い物になりませんので CSS3transform を利用してグリグリします。

 

ちなみに今回はタイトルに記載している通り「webkit」ブラウザのみ対象としていますのでご注意ください。
※Safari、Chromeなどなど。

 

ありがちな例を挙げると、js でスライダーなんかを作っている時に「この要素の x 座標は今ナンボ程動いてますか」と言う状況です。
jQuery を使っているなら簡単ですよね、

1
alert($('#hoge').css("left"));

これでパパッと解っちゃう訳で、非常に便利です。

所が CSS3transform で設定する時は、

1
2
3
#hoge {
    -webkit-transform: translate3d(237px, 5px, 0px);
}

こんな感じなので、x 座標ってどうやって書けば取得出来るの?となった訳です。

1
alert($('#hoge').css("-webkit-transform"));

取りあえずこう書いてみると、下記のように出力されました。

matrix(1, 0, 0, 1, 237, 5)

うーん、4番目が x で5番目が y なんだろうな…じゃあ z はどこに出るんだろう。

 

ブラウザ限定の強み、と言う事で素直に WebKitCSSMatrix で分解する事にした。仕様書通り使うと

1
2
3
var obj = document.getElementById('hoge');
var m = new WebKitCSSMatrix(obj.style.webkitTransform);
alert(m.e);

こんな感じになりますが、折角 jQuery を使っているので…

1
2
var m = new WebKitCSSMatrix($('#hoge').css('-webkit-transform'));
alert(m.e);

こんな感じでも取得可能です、結構乱暴に使えますね。
取得出来る値はコチラの仕様書に網羅されています、かなり色々設定出来るだけに複雑ですね…単純な物は a〜f って覚えておくのが良さそうです。

 

 

それではまた。

 

 

[iPhone/iPad]WebApp制作における読み込み時間/オフライン問題


2011
05.18

皆さんこんにちわ、最近随分日が長くなったなぁとしみじみ思います。

そして随分書きかけのエントリーが溜まって来たなぁと思います。

消化しないとただの豪華なオンラインメモ帳になってしまいます、これはいけません。

 

そう言う事も踏まえてなお、単発ネタです。

iPhone / iPad をターゲットにした WebApp でネックになるのは読み込み時間とオフライン時の挙動です、普通にブラウザアプリを作る感覚で行くと下記のような問題にブチ当たります。

  • ページ遷移の度に読み込んでたらストレス溜まる
  • かと言って全部最初に読み込んでおいてメモリに展開すると色々と苦しい
  • そもそもオフラインだとページ遷移とか非同期通信自体不可能じゃない

ネイティブアプリは全てローカルにリソースを置く事で回避出来るのですが、Web ブラウザを使っている以上このような問題が起こります。

 

困りました、調べました、解決しました。

 

なんの事は無い、iOSAndroidWEB Database API を実装しているじゃないか。良く考えると双方 Webkit 系だもんね、今更気づいたのかよ!と言わざるを得ません。てへ。

この API はブラウザの JS から双方のネイティブアプリを触っている方はお馴染みの SQLite3 へとアクセスする事が出来ます、つまり始まる前に全部ローカルにデータを保存しておく事が出来ます。ちょっと試した事が無いのですが blob 型が有るのでバイナリも突っ込めるはず。

そしてもう1つの問題、オフライン時にページを開こうとしたりリロードしたりしようとすると「ページを開けません。インターネットに接続していません。」みたいなエラーが出るのですが、これも .manifest を使えば回避可能です。

オフラインだとこうなります

これは強力なキャッシュ機能で、指定したファイルを全てローカルに保存して次回からはとにかくここから読み出すようです。中身を更新したい時は .manifest の中身の文字を1文字でも変えれば再構成されるようなので、ページの要素を読み込む前に .manifest のチェックが先に実行されているみたいです。

要するにバージョン管理をきちんと行い、.manifest にはそのバージョン名を入れておけば常に最新の状態をユーザーに提供出来ると言う訳ですね。

 

さて、これで…かなりネイティブアプリに迫る事が出来るようになったハズです。

思っていた以上に私は WebApp について解っていなかったのがショックですが、これで同じ土俵には上がれたと思うので益々精進したいと思います。

 

それではまた。