[英]Is there a way to make a text area partially editable? (make only portions of the text editable)
我剛剛遇到一種情況,它只是一個優雅的解決方案,只有部分文本區域(以前加載文本)可編輯而其他部分不是(“灰色”,可以這么說)。
通常使用javascript可以實現這一點嗎?
我會使用jQuery。
如果您使用的是純文本區域元素,則無法設置所需內容的樣式(基於該內容是否可編輯)。 您最多可以檢查用戶嘗試更改的內容是在黑名單還是白名單上,然后相應地停止編輯。 您可能還會提供一些視覺反饋,例如警告信息“您不能這樣做”。
我的建議是利用contenteditable屬性,這可能需要更多的時間來設置樣式,但從長遠來看,它將為您提供更大的靈活性。
您可以將div元素設置為與所需的textarea類似,然后使用其中的可編輯跨度來設置是否可以編輯特定的文本塊。 然后,您可以使用JavaScript命令(請參閱上面的鏈接)或使用“保存”按鈕檢索此內容,將其設置為實際文本區域(您可能已隱藏)的值,並正常發回您的頁面。
使用以下代碼作為粗略示例。
<div id="editable-content">
<span id="block1" class="editable" contenteditable="true">This is some editable content which will </span>
<span id="block2" class="non-editable">quickly be followed by some non-editable content</span>
</div>
<div style="display: none;">
<textarea id="PostedContent"></textarea>
</div>
<div>
<input id="save-page" type="submit" value="Save Page" />
</div>
<script type="text/javascript">
$(function () {
$('#save-page').click(function () {
$('#PostedContent').val($('#editable-content').text());
});
});
</script>
你可以這樣做(只是一個概述的想法,沒有代碼):
設計與整個文本匹配的正則表達式。 對不可修改的部分使用固定字符串,並使用[\\s\\S]*?
對於可修改的部分。 使用^
和$
來錨定正則表達式。
/^This is fixed text\. Now something editable:[\s\S]*?Now fixed again\.$/
現在對keyup
事件做出反應,也可能對其他事件做出反應(比如paste
)。
對於每個相關事件,請檢查正則表達式是否仍然匹配。
如果沒有,請取消該活動。
實際上,這應該停止對正則表達式中文字部分的修改,從而使文本的某些部分成為只讀。
不要忘記在表單發布后測試服務器端的字符串 - 永遠不要相信客戶端無法發送無效值。
編輯
您可以使用正則表達式引用函數從字符串動態構建該正則表達式,這可以為您節省很多麻煩。
function regexQuote(s) { return s.replace(/[\[\]^$*+?{}.|\\]/g, "\\$&") }
用法
var re = new Regex(
"^" +
[regexQuote(fixedPart1), regexQuote(fixedPart2)].join("[\\s\\S].*?")
+ "$"
);
好吧,你可以做這樣的事情。 這段代碼效率很低,我只想概述這個概念。
JS:
$(function () {
var tb = $("#t").get(0);
$("#t").keydown(function (event) {
var start = tb.selectionStart;
var end = tb.selectionEnd;
var reg = new RegExp("(@{.+?})", "g");
var amatch = null;
while ((amatch = reg.exec(tb.value)) != null) {
var thisMatchStart = amatch.index;
var thisMatchEnd = amatch.index + amatch[0].length;
if (start <= thisMatchStart && end > thisMatchStart) {
event.preventDefault();
return false;
}
else if (start > thisMatchStart && start < thisMatchEnd) {
event.preventDefault();
return false;
}
}
});
});
HTML
<textarea id="t" rows=5 cols="80">Hello this is a test @{stuff}
this part is editable @{other stuff}
</textarea>
這使用了你的“標記”的概念。 一般的想法是說好的,是用戶試圖在我們的一個標記內編輯的文本范圍? 顯然,每次按下鍵時使用regexp並不是確定這一點的最佳方法,我不會忽略箭頭鍵等等,但這給了你一個大致的想法。
有趣的想法,但遺憾的是,文本區域內的文本必須統一對待,即您不能禁用文本區域內容的子部分。
但是,你有選擇權。 如果您可以識別需要禁用的文本,則可以將其添加為DOM元素(即div),然后將其定位為暗示它位於文本區域內的方式。
您可以通過使文本區域變大並使用position:relative / absolute styles在文本區域上移動div來暗示此div位於文本區域內。 或者,您可以刪除文本區域上的邊框並將其放在一個容器中,該容器也包含帶有“禁用”文本的div。
我建議,不要試圖將input
的內容分解為可編輯/不可編輯內容的子字符串,而是使用HTML元素的contentEditable
屬性,並使用JavaScript將該編輯后的值傳遞給其他地方的隱藏input
在頁面中。
在父元素中,您可以將邊框設置為1px實心灰色,然后在其中放置
1)textarea(修改css沒有邊框)2)標簽(也沒有邊框)
在這種情況下,它看起來像1)和2)中的兩個文本在一起,因為它們被放在一個盒子里。 1)雖然可以編輯,而另一個是灰色的。
我建議兩個textareas一個readonly和另一個可編輯的,重疊,所以它看起來像它唯一的一個
搜索后發現很難使文本區域部分可編輯
這是我用於此要求的代碼
input { width:100%; border:0px solid; outline:none }
<!DOCTYPE html> <html> <div style="padding: 2px;border:1px solid #ccc;width: 82%;max-height:100px;min-height: 51px;overflow:auto;outline: none;resize: both;" contenteditable="true" unselectable="on"> <input placeholder="enter prefix..." value="editable postfix..." ></input> <div id='unEditable' style="background-color:yellow;width: fit-content;padding-left:10px;padding-right:10px;border-radius:10px;height: fit-content;" contenteditable="false" unselectable="off" onkeyup="" > fixed content non-editable </div> <input placeholder="enter postfix..." value="editable prefix..." style='width:97%'></input> </div> </html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.