點兩下修改文字

  • 2466
  • 0
  • 2013-01-17

摘要:點兩下修改文字

首先,思考是:
雙點table(也就是顯示文字的部份),
接著輸入框顯示,輸入完內容後按下enter,則輸入框隱藏,而原本table的字改變成跟輸入框的一樣。
然後將tabel與輸入框的位置差不多~

以下是程式碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html"; charset="utf-8">
<title></title>
</head>
<script type="text/javascript">
    function CanModify()
    {
        document.getElementById('input').style.display='block';
        document.getElementById('input').select();
    }
    function DisModify()
    {
        if (event.keyCode == 13)
        {
            document.getElementById('input').style.display='none';
        
            var contents=document.getElementById('input').value;
            document.getElementById('content').innerHTML = contents;
            
        }
    }
</script>
<body bgcolor="#FFCC99">
<table style="z-index: 2; border: 1px; background-color: #aaeeaa; width: 155px;" ondblclick="CanModify()">
<tr>
<td><div id="content">123</div>
</td>
</tr>
</table>
<input type="text" id="input" name="test" value="123" style="display:none; height:20px; z-index: 1; position: absolute; top: 7px;" onKeyDown="DisModify()" onKeyPress="DisModify()">
</body>    
</html>

此程式以IE瀏覽器為主,若要適用火狐或crome,可能要去查語法相容性(因為火狐好像不適用→都是onkeypress還是onpeydown的關 係!!!就是因為這樣我才用兩個,其實用一個就可以了。我記得還有另一個是火狐才看得懂的 但是因為工作只要求IE就算了)

因為文字的大小table和輸入框的不太一樣,可以再思考font-size。
還有位置要小心有些人螢幕大小不同(像SV的螢幕就是大螢幕不是4比3),
所以要用絕對位置(但因為每個螢幕可能不同,顯示的位置也可能....要測才知道)。

感覺是很簡單的東西,可是上網都沒查到,可能是太簡單所以沒人需要,也可能我搜尋文字打錯......

實際作用可以這樣:

table中的文字是從資料庫撈出來的,
使用者點兩下文字做修改,接著按下enter後送出資料到資料庫做修改(update)。
因此這個程式碼我放在php裡,因為接下來的確認送出就跟一般使用form沒什麼差別了~

換湯不換藥,總之秘技就是隱藏與顯示,因此下拉式選單、按鈕等等都可以照做。

還有很簡單的就是按下enter等於按下submit,然後將submit的按鈕隱藏,
這樣就可以用比較習慣的方式來呼叫php的function了
(因為我通常都是用form來使用php的function,先用php監聽是按了哪個submit,當然,也可以用javascript做出submit,因為我程式思考比較憨慢,就用比較笨的方法了)

111.240.154.234/yokunandu/testPHP/testInput.php

點入可以查看效果(但只適用ie瀏覽器)

追加:

我後來加入了onblur功能,這樣火狐就可以用失焦來實現(而且實際inline操作也確實要如此):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html"; charset="utf-8">
<title></title>
</head>
<script type="text/javascript">
    function CanModify()
    {
        document.getElementById('input').style.display='block';
        document.getElementById('input').select();
    }
    function DisModify()
    {
        if (event.keyCode == 13)
        {
            document.getElementById('input').style.display='none';
       
            var contents=document.getElementById('input').value;
            document.getElementById('content').innerHTML = contents;
           
        }
    }
    function DisModify2()
    {
        document.getElementById('input').style.display='none';
       
        var contents=document.getElementById('input').value;
        document.getElementById('content').innerHTML = contents;
    }
</script>
<body bgcolor="#FFCC99">
<table style="z-index: 2; border: 1px; background-color: #aaeeaa; width: 150px;" ondblclick="CanModify()">
<tr>
<td><div id="content">123</div>
</td>
</tr>
</table>
<input type="text" id="input" name="test" value="123" style="display:none; height:20px; z-index: 1; position: absolute; top: 7px;" onKeyPress="DisModify()" onblur="DisModify2()">
</body>    
</html>

 

後記:

 

為什麼要用這麼費工夫的東西呢?

用JQUERY或者JGRID不是就有很好的inline操作欄位嗎?

答案就是因為IE這個怪獸,

之前想說排版漂亮就用jquery,用ie開啟網頁整個傻眼!

於是只好自力救濟用這種笨方法了~

雖然還要自己找位置,

但是為了ie,我目前就是先用這個方法囉~

 

第一次發這種文章(雖然也稱不上技術文),

有些小缺點而改了多次~

希望以後能多多成為發表者而不是googler!!!

 

再追加:將focus()改成select()!

再修改:只要將event帶入事件處理就可以解決瀏覽器相容問題了!

以下是final程式碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html"; charset="utf-8">
<title></title>
</head>
<script type="text/javascript">
    function CanModify()
    {
        document.getElementById('input').style.display='block';
        document.getElementById('input').select();
    }
    function DisModify(e)
    {
        if (e.keyCode == 13)
        {
            document.getElementById('input').style.display='none';
       
            var contents=document.getElementById('input').value;
            document.getElementById('content').innerHTML = contents;
           
        }
    }
    function DisModify2()
    {
        document.getElementById('input').style.display='none';
       
        var contents=document.getElementById('input').value;
        document.getElementById('content').innerHTML = contents;
    }
</script>
<body bgcolor="#FFCC99">
<table style="z-index: 2; border: 1px; background-color: #aaeeaa; width: 150px;" ondblclick="CanModify()">
<tr>
<td><div id="content">123</div>
</td>
</tr>
</table>
<input type="text" id="input" name="test" value="123" style="display:none; height:20px; z-index: 1; position: absolute; top: 7px;" onKeyPress="DisModify(event)" onblur="DisModify2()">
</body>    
</html>

現在,你可以隨心所欲的測試看看囉(因為是全螢幕才對到位置,或視窗是縮小可能位置不會對好):

111.240.154.234/yokunandu/testPHP/testInput.php

 

因為是用位置遮掩,因此每個元件都要對位置......這是很大的缺點Orz

 

2013.01.17:

然後把看起來比較實用的範例給大家(不然可能實在看不出有什麼用處):

111.240.154.234/yokunandu/testPHP/testUI.php

之後就可以開始加入php撈資料庫加上按下Enter與輸入完畢後送出資料囉~

 

結果我又要新增了XDD

這太有趣了,我的第一篇可以被我一而再的改~

為什麼呢,

原來我才發現,我們可愛的新版MySQL的php的inline也是類似的用法!

那SV真是無師自通呀~(吹牛!)

不過它還有個讓人移動輸入框的功能,是說這有什麼好處呢?

讓使用者回顧看他原本填入的資料嗎?(因為我的不能移動,但其實就壓在下面)

然後為什麼用淺綠色呢?

本來討論UI時,用淺綠色是為了方便說明(因為到時候還要翻譯成日文)。

後來這樣的設定反而成了不錯的規則。

因為SV是用白色、淺綠色與淺藍色來劃分table的功能。

白色是只能看的,淺綠色則是點兩下就可修改(用點兩下是怕點一次會嚇到人,所以確定要修改就要點兩下),淺藍色則是可以當超連結。

(不然藍線藍色的超連結實在不是很可愛呀,只好把這樣的設定重設了)

最後SV還是決定用Dreamweaver大神來排版,

因為排位置部分隨著不同電腦不同瀏覽器都會跑掉sad

不過換湯不換藥,只要了解這樣的原理→隱藏、覆蓋、顯現,用z-index來疊在上面,

就可以製造出inline修改的假象了~

其實SV是有看過別人用這樣的手法在C#做inline效果,

(C#果然是SV的好朋友呀!!!)

才會想到網頁也可以依樣畫葫蘆~

當然,如果有別人現成做好的能用,是最好的!

難過IE與其他瀏覽器的相容問題Orz

 

好了,分享到這!應該是最後修改了吧XDDDD?