<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
<title>Suinasia(javascript)</title>
<subtitle>「javascript」なエントリー</subtitle>
<link rel="alternate" type="text/html" href="http://suin.asia/tag/javascript"/>
<link rel="self" type="application/atom+xml" href="http://suin.asia/feed/atom/tag/javascript"/>
<author>
<name>suin</name>
</author>
<updated>2012-02-04T14:07:02Z</updated>
<id>http://example.com/atom1.xml</id>
<entry>
<title>jQueryの世界で最も単純なプラグインの作り方サンプル</title>
<link href="http://suin.asia/2010/02/04/the_simplest_plugin_for_jquery"/>
<summary>jQueryは要素セレクターやクロスブラウザ対応が優れたjavascriptのライブラリで、prototype.jsと並んで広く使われています。そのjQueryでは、独自に自前の関数をプラグインという形で作ることが</summary>
<published>2010-02-03T23:29:00Z</published>
<updated>2010-02-03T23:17:00Z</updated>
<id>http://suin.asia/2010/02/04/the_simplest_plugin_for_jquery</id>
<category term="jQuery" label="jQuery" scheme="http://suin.asia/tag/jQuery" />
<category term="javascript" label="javascript" scheme="http://suin.asia/tag/javascript" />
<category term="Tips" label="Tips" scheme="http://suin.asia/tag/Tips" />
<content type="html" xml:lang="ja" xml:base="http://suin.asia/tag/javascript">
<![CDATA[<p>jQueryは要素セレクターやクロスブラウザ対応が優れたjavascriptのライブラリで、prototype.jsと並んで広く使われています。そのjQueryでは、独自に自前の関数をプラグインという形で作ることができます。jQueryプラグインの作り方は検索すれば山ほど出てきますが、その第一歩となるプラグインの基本的な書き方が見つからなかったので記事にしておこうと思います。</p>
<p>次のプラグインは、単に文字色を赤くするだけのものです。<code>myplugin</code>がプラグイン名です。<code>$(this).css('color', 'red');</code>の部分以外がプラグインの骨組みとなり、この部分だけ差し替えれば、全く別のプラグインを作ることができます。</p>
<pre name="code" class="js">
(function($){
	$.fn.myplugin = function() {
		return this.each(function() {
			$(this).css('color', 'red');
		});
	};
})(jQuery);
</pre>
<p>このプラグインの<a href="http://suin.org/jquery/jquery_the_simplest_plugin.html">動作デモ</a></p>]]>
</content>
</entry>
<entry>
<title>ローカルストレージを使ってiPhoneのcookie健忘症対策: ウェブアプリ開発者の立場から</title>
<link href="http://suin.asia/2009/09/13/iphone_local_strage_for_email_password_remainder"/>
<summary>iPhoneのsafariはcookieが勝手に消える。IDやパスワードの記憶機能もない。その代替策として、ローカルストレージを使用する。</summary>
<published>2009-09-13T07:46:40Z</published>
<updated>2009-09-13T07:43:04Z</updated>
<id>http://suin.asia/2009/09/13/iphone_local_strage_for_email_password_remainder</id>
<category term="iPhone" label="iPhone" scheme="http://suin.asia/tag/iPhone" />
<category term="Tips" label="Tips" scheme="http://suin.asia/tag/Tips" />
<category term="JavaScript" label="JavaScript" scheme="http://suin.asia/tag/JavaScript" />
<content type="html" xml:lang="ja" xml:base="http://suin.asia/tag/javascript">
<![CDATA[<p>iPhoneはcookieがしばしば勝手に消えるようだ。そのせいで、セッションが切れる。すると、GmailやDropboxなどのウェブアプリはログアウトしていまい、IDとパスワードを入力し直す手間が出るので、たちまち不便になる。</p>
<p>セッションが落ちるのは仕方がないとする。それでも、IDやパスワードの記憶ぐらいはしておきたい。iPhoneのキーボードでメールアドレスとパスワードを入力するのは、えらく苦痛だからだ。iPhone向けウェブアプリの開発者としては、できるだけユーザの不便を解消してやりたいはずだ。</p>
<p>iPhoneのsafariにはパスワードの記憶機能がない。その代替策として、パスワードなどをcookieに保存する方法が考えるかもしれない。mixiなどもこの方法だ。しかし、上で述べたが、iPhoneのcookieはよく無くなる。そこで、さらにcookieの代替策として、safariのローカルストレージを使う手がある。</p>
<p>ローカルストレージとは？</p>
<p>iPhoneのsafariにはjavascriptで使えるSQLiteが用意されている。ローカルストレージはcookieと違い、有効期限がない。つまり、勝手に消えることは永久的にない。ただし、次のような制約がある。</p>
<ul>
<li>
データベースはドメインごと。したがって、他のドメインのデータベースを参照することはできない。(逆にできたら、セキュリティ的に怖い)</li>
<li>データベースの容量は5MBまで。</li>
</ul>
<p>ローカルストレージの詳細は、分かりやすくまとめている「<a href="http://d.hatena.ne.jp/amachang/20080327/1206607704">Safari 3.1 に実装された「Client-side database storage (SQL API)」とは何か？ - IT戦記:</a>」をご覧いただきたい。</p>
<p>では、具体的にローカルストレージを使った、ID・パスワードの記憶機能の実装を紹介する。コード量は多いが、やっていることは大して複雑ではない。</p>
<p>まずは、HTMLは次のように書く。</p>
<pre name="code" class="html">&lt;form name=&quot;login&quot; action=&quot;login.php&quot; method=&quot;post&quot; onsubmit=&quot;return emai_pass_remaind()&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;email&quot; value=&quot;&quot; placeholder=&quot;メールアドレス&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; /&gt;&lt;br /&gt;
&lt;input type=&quot;password&quot; name=&quot;pass&quot; value=&quot;&quot; placeholder=&quot;パスワード&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; /&gt;&lt;br /&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;save_pass&quot; value=&quot;1&quot; /&gt;メアドとパスワードを記憶&lt;br /&gt;
&lt;input type=&quot;submit&quot; value=&quot;送信&quot; /&gt;
&lt;/form&gt;</pre>
<p>つぎに、javascriptは次のように書く。</p>
<pre name="code" class="javascript">// ロード時に、データベースからメアドとパスワードを取得、フォームにセットする関数
window.onload = function() {
  var db = openDatabase('mydatabase', '1.0');

  db.transaction(
    function(tx)
    {
      tx.executeSql(&quot;SELECT email, pass FROM login WHERE id = 1&quot;, [],
        function(tx, rs)
        {
          // ロードに成功したら、フォームに値をセット
          document.login.email.value = rs.rows.item(0).email; // htmlspecialchars?
          document.login.pass.value  = rs.rows.item(0).pass;
          document.login.save_pass.checked = true;
        }
      );
    }
  );
}

// フォーム送信時に、メアドとパスワードをデータベースに保存・削除する関数
function emai_pass_remaind()
{
  // フォームから値を取得
  var email = document.login.email.value;
  var pass  = document.login.pass.value;

  /* ここらへんにvalidationの処理を入れたり... */

  var db = openDatabase('mydatabase', '1.0');

  if ( document.login.save_pass.checked == true )
  {
    db.transaction(
      function(tx) {
        // テーブルがあるかな?
        tx.executeSql(&quot;SELECT count(*) FROM login&quot;, [],
          function(tx, rs) {
            // テーブルあるよ
            if ( rs.rows.item(0) == 0 )
            {
              // テーブル初利用の場合は、追加
              tx.executeSql('INSERT INTO login VALUES(1, ?, ?)', [email, pass], // escape?
                function() {},
                function(error) {
                  alert('save failed: ' + error.message);
                }
              );
            }
            else
            {
              // テーブル初利用じゃない場合は、更新
              tx.executeSql('UPDATE login SET email = ?, pass = ? WHERE id = 1', [email, pass], // escape?
                function() {},
                function(error) {
                  alert('update failed: ' + error.message);
                }
              );
            }
          },
          function(tx, error) {
            // テーブルないよ、テーブルつくろ
            tx.executeSql('CREATE TABLE login (id INTEGER PRIMARY KEY, email TEXT, pass TEXT)', [],
              function() {
              // テーブル初利用だから、追加
                tx.executeSql('INSERT INTO login VALUES(1, ?, ?)', [email, pass], // escape?
                  function() {},
                  function(error) {
                    alert('save failed: ' + error.message);
                  }
                );
              },
              function(error) {
                alert('Database creation failed.' + error.message);
              }
            );
          }
        );
      }
    );
  }
  else
  {
    // チェックボックスにチェックがないときは、テーブル削除
    db.transaction(
      function(tx) {
        tx.executeSql('DROP TABLE login', [],
          function() {},
          function(error) {
            alert('delete failed: ' + error.message);
          }
        );
      }
    );
  }
}</pre>
<p>これで、あなたのウェブアプリも、かなり便利になると思う。</p>]]>
</content>
</entry>
<entry>
<title>拒JavaScript症</title>
<link href="http://suin.asia/2006/06/05/javascript"/>
<summary>自分が慣れていないだけだろうけど、JavaScriptってほんと判りにくい。&lt;br /&gt;&lt;br /&gt;↓みたいな配列をどうやって取得すればいいのか悩むこと数時間……orz&lt;br /&gt;&amp;lt;form name=&amp;quot;frm&amp;quot;&amp;gt;&lt;br /&gt;　&amp;lt;input type=&amp;q...</summary>
<published>2009-03-30T11:24:28Z</published>
<updated>2006-06-05T11:10:00Z</updated>
<id>http://suin.asia/2006/06/05/javascript</id>
<category term="JavaScript" label="JavaScript" scheme="http://suin.asia/tag/JavaScript" />
<content type="html" xml:lang="ja" xml:base="http://suin.asia/tag/javascript">
<![CDATA[自分が慣れていないだけだろうけど、JavaScriptってほんと判りにくい。<br /><br />↓みたいな配列をどうやって取得すればいいのか悩むこと数時間……orz<br />&lt;form name=&quot;frm&quot;&gt;<br />　&lt;input type=&quot;checkbox&quot; name=&quot;hoge1[]&quot; value=&quot;aaa&quot;&gt;<br />　&lt;input type=&quot;checkbox&quot; name=&quot;hoge1[]&quot; value=&quot;dd&quot;&gt;<br />　&lt;input type=&quot;checkbox&quot; name=&quot;hoge1[]&quot; value=&quot;cc&quot;&gt;<br />&lt;/form&gt;<br /><br />document.write(document.frm.hoge1[i].length);<br />document.write(document.frm.hoge1.length);<br />document.write(document.frm.element[i].length);<br />って罠にはまりまくった。<br /><br />正解は↓だったのね……(ノ_・。)<br />document.write(document.frm.elements[&#039;hoge1[]&#039;].length);<br /><br />やっぱりJavaScriptって最近使わないから、訳が分からなくなってきてる。変数のあたまに＄とかつけちゃうし。もういやだ(;´▽｀A``]]>
</content>
</entry>
</feed>
