<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Webkit &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/webkit/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sat, 29 May 2010 19:15:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>実験室: 編集可能なTableをcontentEditableで実装してみたかった</title>
		<link>https://blog.mach3.jp/2010/05/29/table-contenteditable.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sat, 29 May 2010 19:15:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[contentEditable]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Webkit]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/05/29/%e5%ae%9f%e9%a8%93%e5%ae%a4-%e7%b7%a8%e9%9b%86%e5%8f%af%e8%83%bd%e3%81%aatable%e3%82%92contenteditable%e3%81%a7%e5%ae%9f%e8%a3%85%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f%e3%81%8b%e3%81%a3%e3%81%9f.html</guid>

					<description><![CDATA[この記事の情報は古くなっています。 jQuery.fn.live は既に現行バージョンで削除されています。 contentEditableは、要素をユーザ側で編集可能にする為の属性です。 ブラウザ毎でちょっとクセのある機 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="caution">
    この記事の情報は古くなっています。<br />
    jQuery.fn.live は既に現行バージョンで削除されています。
</p>



<p>contentEditableは、要素をユーザ側で編集可能にする為の属性です。<br />
ブラウザ毎でちょっとクセのある機能ですが、<br />
これで編集可能Tableを作ったらどうなるか、という実験です。</p>



<span id="more-29"></span>



<h2 class="wp-block-heading">書いてみたもの（Webkit/Firefox）</h2>



<p>まず「myEdit」というidを持つTableを用意し、<br />
その子要素のtdをダブルクリックした際にそのセルを編集可能にトグルし、<br />
編集が終了したら編集不可に戻します。</p>



<p>※ChromeとFirefoxのみで動作確認 ※jQueryを使用</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myEdit td"</span>).live(<span class="hljs-string">"dblclick"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{

    e.target.contentEditable = <span class="hljs-literal">true</span>;
    e.target.focus();

}).live(<span class="hljs-string">"blur"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{

    e.target.contentEditable = <span class="hljs-literal">false</span>;

}).live(<span class="hljs-string">"keydown"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{

    <span class="hljs-keyword">var</span> code = e.which;
    <span class="hljs-keyword">var</span> ctrl = (<span class="hljs-keyword">typeof</span> e.modifiers == <span class="hljs-string">"undefined"</span>) ?
    e.ctrlKey : e.modifiers &amp; Event.CONTROL_MASK;
    <span class="hljs-keyword">if</span>(ctrl &amp;&amp; code == <span class="hljs-number">86</span>){
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(e.keyCode == <span class="hljs-number">13</span>){
        e.target.blur();
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }

}).live(<span class="hljs-string">"contextmenu"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{

    <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;

});
</code></span></pre>


<p><a href="http://jsbin.com/ayuhi">デモを見る（JSBin）</a></p>



<p>各ブラウザのcontentEditableでの改行の仕様が安定していないので、<br />
改行を含まない一行のみのコンテンツに制限して実装しています。<br />
また、改行以外にも余計な要素を挿入させない為、ctrl+vは弾き、<br />
かつコンテキストメニューを無効にしています。</p>



<p>なんだか、問題点いっぱいですぞ？</p>



<h2 class="wp-block-heading">問題点</h2>



<h3 class="wp-block-heading">IE/Operaでの動作</h3>



<p>上のスクリプトはIE/Operaでは動作しません。<br />
というのは、どうやらtdにおけるcontentEditableが動作しない為です。<br />
なので、何か別の要素をtdにappendして、<br />
その要素でcontentEditableをtrueにしてやらなければなりません。</p>



<p>しかし、それをやるなら巷で多く使われている<br />
input要素でスワップしてやる手法の方がよりスマートで楽です。</p>



<h3 class="wp-block-heading">挙動が本当にばらばらである</h3>



<p>各ブラウザでの挙動は本当にまちまちです。<br />
この差異は果たしてハックで埋められるものなのか、甚だ疑問です。</p>



<h3 class="wp-block-heading">データの保護が面倒</h3>



<p>input要素ならば、「一行のテキスト」のみに制限する事は容易ですが、<br />
contentEditableでは上記スクリプトのように面倒な処理をせねばなりません。<br />
そもそも一行に制限しなければならない理由が「安定しないから」ですからね。</p>



<p>保護の為にコンテキストメニューを無効にしている点についても、<br />
ユーザフレンドリーにする為の実装なのに、ユーザの操作を妨げるとは本末転倒。<br />
代替で自前のコンテキストメニューを表示すれば良いですが、<br />
果たしてそこまでしてcontentEditableでやりたいのでしょうか…</p>



<h2 class="wp-block-heading">私的結論</h2>



<p>Webサイト上でクロスブラウザな運用をするのは、<br />
労力的な意味でも報われない感がいっぱいです。</p>



<p>ですが、より限定された使い方、<br />
例えばChromeエクステンションのオプション画面等ならば<br />
使えるのではないでしょうか。</p>



<p>実は、はじめからそれに使いたくて書いたんですけどね…</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>2010/8/23 : メニューバーからのペーストに対応出来てないことに気付く。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
