2013-05-16 82 views
0

因此,我有一個頁面,其中的字段是s,當用戶點擊它們時,它們會更改爲輸入以允許更改它們的值。當用戶在輸入之外單擊時,它將變回一個範圍。下面是我使用的代碼:使用jQuery製作一個<span>到和<input>和

$(function() { 
$('.txtToInput').live('click', function() { 
    var input = $('<input />', {'type': 'text','class': 'txtToInput', 'name': 'aname', 'value': $(this).html()}); 
    $(this).parent().append(input); 
    $(this).remove(); 
    input.focus(); 
}); 

$('.txtToInput').live('blur', function() { 
    var span = $('<span />', {'class': 'txtToInput'}); 
    $(this).parent().append($(span).html($(this).val())); 
    $(this).remove(); 
}); 
}); 

這工作得很好,但有一個問題:當用戶突出顯示文本輸入內容跳轉輸入外部和元素不能被改回跨度。任何想法是什麼導致這一點以及如何解決?

這裏是a fiddle表明這種行爲。

+0

爲什麼不能有一個輸入元素和跨度?在任何情況下,其中一個是隱藏的。當在輸入上觸發模糊事件時,您將更新span元素的文本或內部HTML。 – Terry

+0

@Terry這正是我所建議:) – Alnitak

回答

1

問題修正:

textbox = false; 
$(function() { 
    $('.txtToInput').live('click', function() { 
     if (!textbox) { 
      var input = $('<input />', { 
       'type': 'text', 
       'class': 'txtToInput', 
       'name': 'aname', 
       'value': $(this).html() 
      }); 
      $(this).parent().append(input); 
      $(this).remove(); 
      input.focus(); 
      textbox = true; 
     } 
    }); 

    $('.txtToInput').live('blur', function() { 
     if (textbox) { 
      var span = $('<span />', { 
       'class': 'txtToInput' 
      }); 
      $(this).parent().append($(span).html($(this).val())); 
      $(this).remove(); 
      textbox = false; 
     } 
    }); 
}); 

小提琴:http://jsfiddle.net/QNR5z/1/

你只需要檢查的對象是在「輸入」版本或「跨度」的版本,因爲這個問題是,雖然對象是在「輸入」版本,但如果用戶點擊對象代碼創建一個新的文本框

4

操縱DOM中出現和消失的元素並且可能需要事件委託(即使用.live,或者首選.on方法),這很麻煩。

考慮將這兩個元素放在DOM中,並且只使用.show().hide()來確定哪一個可見。

+0

這是一個很好的解決方案,但是後來我提取父元素的值,並去掉HTML標籤。這種方法會導致文本內容兩次,或者我需要額外的正則表達式來刪除整個「輸入」,包括它的內容在提交之前 – harryg

+0

@harryg將一個':可見'過濾器,當你提取的內容修復? – Alnitak

1

一個非常好的方式不再做一遍就是使用x-editable。見here

+0

你的鏈接似乎不工作 – harryg

+0

@ harryg你的意思是鏈接無法打開,因爲它確實如此。如果沒有,你可以谷歌X可編輯和理想的第一個鏈接應該是一個。 – Arindam

+0

是的,當我嘗試它時,網站一定會關閉 - 現在沒事了! X-editable看起來不錯,但我實際上最終選擇了[Jeditable](http://www.appelsiini.net/projects/jeditable)。似乎很相似,除了它允許內聯編輯。 AJAX也內置於其中。 – harryg