ฉันสงสัยว่าฉันสามารถแทรกข้อความลงในพื้นที่ข้อความโดยใช้ jquery ได้อย่างไรเมื่อคลิกแท็กจุดยึด
ฉันไม่ต้องการแทนที่ข้อความเป็น textarea อยู่แล้วฉันต้องการผนวกข้อความใหม่เข้ากับ textarea
ฉันสงสัยว่าฉันสามารถแทรกข้อความลงในพื้นที่ข้อความโดยใช้ jquery ได้อย่างไรเมื่อคลิกแท็กจุดยึด
ฉันไม่ต้องการแทนที่ข้อความเป็น textarea อยู่แล้วฉันต้องการผนวกข้อความใหม่เข้ากับ textarea
คำตอบ:
จากสิ่งที่คุณมีในความคิดเห็นของ Jason ลอง:
$('a').click(function() //this will apply to all anchor tags
{
$('#area').val('foobar'); //this puts the textarea for the id labeled 'area'
})
แก้ไข -หากต้องการต่อท้ายข้อความให้ดูที่ด้านล่าง
$('a').click(function() //this will apply to all anchor tags
{
$('#area').val($('#area').val()+'foobar');
})
ฉันชอบส่วนขยายฟังก์ชั่น jQuery อย่างไรก็ตามสิ่งนี้อ้างถึงวัตถุ jQuery ไม่ใช่วัตถุ DOM ดังนั้นฉันจึงปรับเปลี่ยนเล็กน้อยเพื่อให้ดียิ่งขึ้น (สามารถอัปเดตในกล่องข้อความ / ข้อความหลายรายการพร้อมกัน)
jQuery.fn.extend({
insertAtCaret: function(myValue){
return this.each(function(i) {
if (document.selection) {
//For browsers like Internet Explorer
this.focus();
var sel = document.selection.createRange();
sel.text = myValue;
this.focus();
}
else if (this.selectionStart || this.selectionStart == '0') {
//For browsers like Firefox and Webkit based
var startPos = this.selectionStart;
var endPos = this.selectionEnd;
var scrollTop = this.scrollTop;
this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
this.focus();
this.selectionStart = startPos + myValue.length;
this.selectionEnd = startPos + myValue.length;
this.scrollTop = scrollTop;
} else {
this.value += myValue;
this.focus();
}
});
}
});
มันใช้งานได้ดีจริงๆ คุณสามารถแทรกในหลาย ๆ สถานที่พร้อมกันได้เช่น:
$('#element1, #element2, #element3, .class-of-elements').insertAtCaret('text');
sel
ความหมายว่าเป็นโลกหรือไม่
ฉันใช้ฟังก์ชั่นนี้ในรหัสของฉัน:
$.fn.extend({
insertAtCaret: function(myValue) {
this.each(function() {
if (document.selection) {
this.focus();
var sel = document.selection.createRange();
sel.text = myValue;
this.focus();
} else if (this.selectionStart || this.selectionStart == '0') {
var startPos = this.selectionStart;
var endPos = this.selectionEnd;
var scrollTop = this.scrollTop;
this.value = this.value.substring(0, startPos) +
myValue + this.value.substring(endPos,this.value.length);
this.focus();
this.selectionStart = startPos + myValue.length;
this.selectionEnd = startPos + myValue.length;
this.scrollTop = scrollTop;
} else {
this.value += myValue;
this.focus();
}
});
return this;
}
});
input{width:100px}
label{display:block;margin:10px 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Copy text from: <input id="in2copy" type="text" value="x"></label>
<label>Insert text in: <input id="in2ins" type="text" value="1,2,3" autofocus></label>
<button onclick="$('#in2ins').insertAtCaret($('#in2copy').val())">Insert</button>
มันไม่ใช่ของฉัน 100% ฉันไปหาที่ไหนสักแห่งแล้วปรับหาแอพของฉัน
การใช้งาน: $('#element').insertAtCaret('text');
ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับผู้ที่ค้นหาวิธีนี้มีประโยชน์ที่คุณไม่ควรใช้ผนวก () เพื่อเพิ่มเนื้อหาลงใน textarea เมธอด append () เป้าหมาย innerHTML ไม่ใช่ค่าของ textarea เนื้อหาอาจปรากฏใน textarea แต่จะไม่ถูกเพิ่มลงในค่าฟอร์มขององค์ประกอบ
ตามที่ระบุไว้ข้างต้นโดยใช้:
$('#textarea').val($('#textarea').val()+'new content');
จะทำงานได้ดี
อันนี้อนุญาตให้คุณ "ฉีด" ชิ้นส่วนของข้อความไปยังกล่องข้อความ, inject หมายถึง: ผนวกข้อความที่เคอร์เซอร์อยู่
function inyectarTexto(elemento,valor){
var elemento_dom=document.getElementsByName(elemento)[0];
if(document.selection){
elemento_dom.focus();
sel=document.selection.createRange();
sel.text=valor;
return;
}if(elemento_dom.selectionStart||elemento_dom.selectionStart=="0"){
var t_start=elemento_dom.selectionStart;
var t_end=elemento_dom.selectionEnd;
var val_start=elemento_dom.value.substring(0,t_start);
var val_end=elemento_dom.value.substring(t_end,elemento_dom.value.length);
elemento_dom.value=val_start+valor+val_end;
}else{
elemento_dom.value+=valor;
}
}
และคุณสามารถใช้สิ่งนี้:
<a href="javascript:void(0);" onclick="inyectarTexto('nametField','hello world');" >Say hello world to text</a>
ตลกและมีความรู้สึกมากขึ้นเมื่อเรามีฟังก์ชั่น "แทรกแท็กเป็นข้อความ"
ทำงานได้ในเบราว์เซอร์ทั้งหมด
.focus()
ร้องขอและการอัปเดตไปยังselectionStart
และselectionEnd
หลังการแก้ไข ตัวแปรภาษาสเปนอาจถูกนำมาใช้เพื่อพิสูจน์คำตอบอื่น ...
เฮ้นี่เป็นรุ่นที่แก้ไขแล้วซึ่งใช้งานได้ดีใน FF @least สำหรับฉันและแทรกที่ตำแหน่งคาเร็ต
$.fn.extend({
insertAtCaret: function(myValue){
var obj;
if( typeof this[0].name !='undefined' ) obj = this[0];
else obj = this;
if ($.browser.msie) {
obj.focus();
sel = document.selection.createRange();
sel.text = myValue;
obj.focus();
}
else if ($.browser.mozilla || $.browser.webkit) {
var startPos = obj.selectionStart;
var endPos = obj.selectionEnd;
var scrollTop = obj.scrollTop;
obj.value = obj.value.substring(0, startPos)+myValue+obj.value.substring(endPos,obj.value.length);
obj.focus();
obj.selectionStart = startPos + myValue.length;
obj.selectionEnd = startPos + myValue.length;
obj.scrollTop = scrollTop;
} else {
obj.value += myValue;
obj.focus();
}
}
})
คุณเคยลองไหม:
$("#yourAnchor").click(function () {
$("#yourTextarea").val("your text");
});
ไม่แน่ใจเกี่ยวกับการปรับแสงอัตโนมัติ
แก้ไข :
ในการผนวก:
$("#yourAnchor").click(function () {
$("#yourTextarea").append("your text to append");
});
append()
วิธีเป้าหมาย innerHTML ไม่คุ้มค่าของ textarea ที่ textarea
append()
สิ่งที่คุณขอควรตรงไปตรงมาใน jQuery-
$(function() {
$('#myAnchorId').click(function() {
var areaValue = $('#area').val();
$('#area').val(areaValue + 'Whatever you want to enter');
});
});
วิธีที่ดีที่สุดที่ฉันคิดว่าการเน้นข้อความที่แทรกไว้คือการพันในคลาส CSS พร้อมกับbackground-color
กำหนดสีที่คุณต้องการ ในการแทรกครั้งต่อไปคุณสามารถลบคลาสออกจากช่วงที่มีอยู่ใด ๆ (หรือดึงช่วงออก)
อย่างไรก็ตามมีบรรณาธิการ WYSIWYG HTML / Rich Text จำนวนมากให้บริการฟรีในตลาดฉันแน่ใจว่าจะตอบสนองความต้องการของคุณ
นี่คือโซลูชันด่วนที่ทำงานใน jQuery 1.9+:
a) รับตำแหน่งคาเร็ต:
function getCaret(el) {
if (el.prop("selectionStart")) {
return el.prop("selectionStart");
} else if (document.selection) {
el.focus();
var r = document.selection.createRange();
if (r == null) {
return 0;
}
var re = el.createTextRange(),
rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
return rc.text.length;
}
return 0;
};
b) ต่อท้ายข้อความที่ตำแหน่งคาเร็ต:
function appendAtCaret($target, caret, $value) {
var value = $target.val();
if (caret != value.length) {
var startPos = $target.prop("selectionStart");
var scrollTop = $target.scrollTop;
$target.val(value.substring(0, caret) + ' ' + $value + ' ' + value.substring(caret, value.length));
$target.prop("selectionStart", startPos + $value.length);
$target.prop("selectionEnd", startPos + $value.length);
$target.scrollTop = scrollTop;
} else if (caret == 0)
{
$target.val($value + ' ' + value);
} else {
$target.val(value + ' ' + $value);
}
};
c) ตัวอย่าง
$('textarea').each(function() {
var $this = $(this);
$this.click(function() {
//get caret position
var caret = getCaret($this);
//append some text
appendAtCaret($this, caret, 'Some text');
});
});
มันใช้งานได้ดีสำหรับฉันใน Chrome 20.0.11
var startPos = this[0].selectionStart;
var endPos = this[0].selectionEnd;
var scrollTop = this.scrollTop;
this[0].value = this[0].value.substring(0, startPos) + myVal + this[0].value.substring(endPos, this[0].value.length);
this.focus();
this.selectionStart = startPos + myVal.length;
this.selectionEnd = startPos + myVal.length;
this.scrollTop = scrollTop;
หากคุณต้องการเพิ่มเนื้อหาลงใน textarea โดยไม่ต้องแทนที่คุณสามารถลองด้านล่าง
$('textarea').append('Whatever need to be added');
ตามสถานการณ์ของคุณมันจะเป็น
$('a').click(function()
{
$('textarea').append($('#area').val());
})
ฉันคิดว่ามันจะดีกว่า
$(function() {
$('#myAnchorId').click(function() {
var areaValue = $('#area').val();
$('#area').val(areaValue + 'Whatever you want to enter');
});
});
มีการอธิบายวิธีแก้ไขปัญหาอื่นที่นี่ในกรณีที่สคริปต์อื่นบางตัวไม่ทำงานในกรณีของคุณ
นี่คล้ายกับคำตอบที่ได้รับจาก @panchicore พร้อมแก้ไขข้อผิดพลาดเล็กน้อย
function insertText(element, value)
{
var element_dom = document.getElementsByName(element)[0];
if (document.selection)
{
element_dom.focus();
sel = document.selection.createRange();
sel.text = value;
return;
}
if (element_dom.selectionStart || element_dom.selectionStart == "0")
{
var t_start = element_dom.selectionStart;
var t_end = element_dom.selectionEnd;
var val_start = element_dom.value.substring(value, t_start);
var val_end = element_dom.value.substring(t_end, element_dom.value.length);
element_dom.value = val_start + value + val_end;
}
else
{
element_dom.value += value;
}
}
วิธีแก้ปัญหาง่ายๆคือ: ( ข้อสันนิษฐาน : คุณต้องการสิ่งที่คุณพิมพ์ในกล่องข้อความเพื่อต่อท้ายสิ่งที่มีอยู่แล้วในtextarea )
ในเหตุการณ์onClickของแท็ก <a> ให้เขียนฟังก์ชันที่ผู้ใช้กำหนดเองซึ่งทำสิ่งนี้:
function textType(){
var **str1**=$("#textId1").val();
var **str2**=$("#textId2").val();
$("#textId1").val(str1+str2);
}
(โดยที่ id, textId1 - สำหรับ o / p textArea textId2 - สำหรับ i / p textbox ')
$.fn.extend({
insertAtCaret: function(myValue) {
var elemSelected = window.getSelection();
if(elemSelected) {
var startPos = elemSelected.getRangeAt(0).startOffset;
var endPos = elemSelected.getRangeAt(0).endOffset;
this.val(this.val().substring(0, startPos)+myValue+this.val().substring(endPos,this.val().length));
} else {
this.val(this.val()+ myValue) ;
}
}
});
ฉันใช้มันและมันก็ใช้ได้ดี :)
$("#textarea").html("Put here your content");
Remi