मैं अपनी तरफ एक सरल HTML textarea है। अभी अगर आप इसमें टैब पर क्लिक करते हैं, तो यह अगले फ़ील्ड पर जाता है। मैं इसके बजाय टैब बटन इंडेंट को कुछ रिक्त स्थान बनाना चाहता हूं। मैं यह कैसे कर सकता हूँ? धन्यवाद।
मैं अपनी तरफ एक सरल HTML textarea है। अभी अगर आप इसमें टैब पर क्लिक करते हैं, तो यह अगले फ़ील्ड पर जाता है। मैं इसके बजाय टैब बटन इंडेंट को कुछ रिक्त स्थान बनाना चाहता हूं। मैं यह कैसे कर सकता हूँ? धन्यवाद।
जवाबों:
इसी तरह के सवालों (नीचे पोस्ट) के लिए अन्य उत्तरों से भारी उधार ...
$(document).delegate('#textbox', 'keydown', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
// set textarea value to: text before caret + tab + text after caret
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
// put caret at right position again
this.selectionStart =
this.selectionEnd = start + 1;
}
});
jQuery: टेक्स्ट बॉक्स के भीतर TAB कुंजी को कैसे कैप्चर करें
var textareas = document.getElementsByTagName('textarea');
var count = textareas.length;
for(var i=0;i<count;i++){
textareas[i].onkeydown = function(e){
if(e.keyCode==9 || e.which==9){
e.preventDefault();
var s = this.selectionStart;
this.value = this.value.substring(0,this.selectionStart) + "\t" + this.value.substring(this.selectionEnd);
this.selectionEnd = s+1;
}
}
}
इस समाधान के लिए jQuery की आवश्यकता नहीं है और यह एक पृष्ठ पर सभी टेक्स्टारैस पर टैब कार्यक्षमता को सक्षम करेगा।
this.selectionEnd = s+1;
को बदलें this.selectionEnd = s + "\t".length;
। यह एक चर या फ़ंक्शन पैरामीटर का उपयोग करने और इंडेंटेशन चार (ओं) को संग्रहीत करने के लिए क्लीनर होगा। लेकिन आप जानते हैं कि अब क्या बदलना है: यह +1
परिभाषित करता है कि कैरेट को कितना आकर्षण है।
जैसा कि अन्य ने लिखा है, आप ईवेंट को कैप्चर करने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं, डिफ़ॉल्ट कार्रवाई को रोक सकते हैं (ताकि कर्सर फोकस को शिफ्ट न करे) और एक टैब कैरेक्टर डालें।
परंतु , डिफ़ॉल्ट व्यवहार को अक्षम करने से माउस का उपयोग किए बिना फ़ोकस को पाठ क्षेत्र से बाहर ले जाना असंभव हो जाता है। ब्लाइंड उपयोगकर्ता कीबोर्ड का उपयोग करके वेब पेजों के साथ बातचीत करते हैं और कुछ नहीं - वे माउस पॉइंटर को इसके साथ उपयोगी कुछ भी करने के लिए नहीं देख सकते हैं, इसलिए यह कीबोर्ड है या कुछ भी नहीं है। टैब कुंजी दस्तावेज़ को नेविगेट करने का प्राथमिक तरीका है, और विशेष रूप से रूपों। टैब कुंजी के डिफ़ॉल्ट व्यवहार को ओवरराइड करने से नेत्रहीन उपयोगकर्ताओं के लिए फ़ोकस को अगले प्रपत्र तत्व पर ले जाना असंभव हो जाएगा।
इसलिए, यदि आप एक व्यापक दर्शकों के लिए एक वेब साइट लिख रहे हैं, तो मैं इसे एक सम्मोहक कारण के बिना करने की सलाह दूंगा, और नेत्रहीन उपयोगकर्ताओं के लिए कुछ प्रकार के विकल्प प्रदान करता हूं जो उन्हें textarea में नहीं फँसाता है।
इस लायक़ के लिए, यहाँ मेरा ऑनलाइनर है, इस धागे में आप सभी के बारे में क्या बात कर रहे हैं:
<textarea onkeydown="if(event.keyCode===9){var v=this.value,s=this.selectionStart,e=this.selectionEnd;this.value=v.substring(0, s)+'\t'+v.substring(e);this.selectionStart=this.selectionEnd=s+1;return false;}">
</textarea>
क्रोम, फ़ायरफ़ॉक्स, इंटरनेट एक्सप्लोरर और एज के नवीनतम संस्करणों में परीक्षण।
if(event.shiftKey){if(v.substring(s-1,s)==='\t'){this.value=v.substring(0,s-1)+v.substring(e);this.selectionStart=this.selectionEnd=s-1;}}
यहाँ इस का मेरा संस्करण है, समर्थन करता है:
$(function() {
var enabled = true;
$("textarea.tabSupport").keydown(function(e) {
// Escape key toggles tab on/off
if (e.keyCode==27)
{
enabled = !enabled;
return false;
}
// Enter Key?
if (e.keyCode === 13 && enabled)
{
// selection?
if (this.selectionStart == this.selectionEnd)
{
// find start of the current line
var sel = this.selectionStart;
var text = $(this).val();
while (sel > 0 && text[sel-1] != '\n')
sel--;
var lineStart = sel;
while (text[sel] == ' ' || text[sel]=='\t')
sel++;
if (sel > lineStart)
{
// Insert carriage return and indented text
document.execCommand('insertText', false, "\n" + text.substr(lineStart, sel-lineStart));
// Scroll caret visible
this.blur();
this.focus();
return false;
}
}
}
// Tab key?
if(e.keyCode === 9 && enabled)
{
// selection?
if (this.selectionStart == this.selectionEnd)
{
// These single character operations are undoable
if (!e.shiftKey)
{
document.execCommand('insertText', false, "\t");
}
else
{
var text = this.value;
if (this.selectionStart > 0 && text[this.selectionStart-1]=='\t')
{
document.execCommand('delete');
}
}
}
else
{
// Block indent/unindent trashes undo stack.
// Select whole lines
var selStart = this.selectionStart;
var selEnd = this.selectionEnd;
var text = $(this).val();
while (selStart > 0 && text[selStart-1] != '\n')
selStart--;
while (selEnd > 0 && text[selEnd-1]!='\n' && selEnd < text.length)
selEnd++;
// Get selected text
var lines = text.substr(selStart, selEnd - selStart).split('\n');
// Insert tabs
for (var i=0; i<lines.length; i++)
{
// Don't indent last line if cursor at start of line
if (i==lines.length-1 && lines[i].length==0)
continue;
// Tab or Shift+Tab?
if (e.shiftKey)
{
if (lines[i].startsWith('\t'))
lines[i] = lines[i].substr(1);
else if (lines[i].startsWith(" "))
lines[i] = lines[i].substr(4);
}
else
lines[i] = "\t" + lines[i];
}
lines = lines.join('\n');
// Update the text area
this.value = text.substr(0, selStart) + lines + text.substr(selEnd);
this.selectionStart = selStart;
this.selectionEnd = selStart + lines.length;
}
return false;
}
enabled = true;
return true;
});
});
textarea
{
width: 100%;
height: 100px;
tab-size: 4;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea class="tabSupport">if (something)
{
// This textarea has "tabSupport" CSS style
// Try using tab key
// Try selecting multiple lines and using tab and shift+tab
// Try pressing enter at end of this line for auto indent
// Use Escape key to toggle tab support on/off
// eg: press Escape then Tab to go to next field
}
</textarea>
<textarea>This text area doesn't have tabSupport class so disabled here</textarea>
आधुनिक तरीका है कि दोनों सीधे-आगे हैं और अंतिम परिवर्तनों को पूर्ववत (Ctrl + Z) करने की क्षमता नहीं खोते हैं।
$('#your-textarea').keydown(function (e) {
var keyCode = e.keyCode || e.which;
if (keyCode === $.ui.keyCode.TAB) {
e.preventDefault();
const TAB_SIZE = 4;
// The one-liner that does the magic
document.execCommand('insertText', false, ' '.repeat(TAB_SIZE));
}
});
के बारे में अधिक execCommand
:
जैसा कि टिप्पणी में बताया गया है (और जब यह "आधुनिक" समाधान था ), तो यह सुविधा पुरानी हो गई है। डॉक्स का हवाला देते हुए:
यह सुविधा अप्रचलित है। हालाँकि यह अभी भी कुछ ब्राउज़रों में काम कर सकता है, इसका उपयोग हतोत्साहित किया जाता है क्योंकि इसे किसी भी समय हटाया जा सकता है। इसके इस्तेमाल से बचने की कोशिश करें।
indent-textarea
क्रॉस-ब्राउज़र समाधान के लिए प्रयास करें जो फ़ायरफ़ॉक्स में इस पद्धति + का उपयोग करता है।
document.execCommand
केवल सेटिंग के बाद सक्षम हो जाता है document.designMode = "on";
। मैं उन तत्वों में लिखने के लिए पाठ प्राप्त करने में सक्षम हूं जिनके पास है .contentEditable = 'true'
। हालाँकि, जब मैं इसे एक textarea पर पूरा करने की कोशिश करता हूं, तो डाला गया textNode दस्तावेज़ के भीतर textarea के ठीक पहले रखा जाता है (बजाय textarea में)। कृपया मोज़िला को यहां से निकालने में मदद करें ।
execCommand
): 'यह सुविधा अप्रचलित है। हालाँकि यह अभी भी कुछ ब्राउज़रों में काम कर सकता है, लेकिन इसके उपयोग को हतोत्साहित किया जाता है क्योंकि इसे किसी भी समय हटाया जा सकता है। इसके इस्तेमाल से बचने की कोशिश करें। '
मैं कहीं भी तेजी से एंगुलरजेएस के माहौल में @ कास्देगा के उत्तर का उपयोग करने की कोशिश कर रहा था, कुछ भी नहीं मैंने कोशिश की कि परिवर्तन पर कोणीय अधिनियम बनाने में सक्षम हो। इसलिए अगर यह राहगीरों के लिए किसी काम का नहीं है, तो यहाँ @ kasdega के कोड, AngularJS शैली का पुनर्लेखन होगा, जिसने मेरे लिए काम किया:
app.directive('ngAllowTab', function () {
return function (scope, element, attrs) {
element.bind('keydown', function (event) {
if (event.which == 9) {
event.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
element.val(element.val().substring(0, start)
+ '\t' + element.val().substring(end));
this.selectionStart = this.selectionEnd = start + 1;
element.triggerHandler('change');
}
});
};
});
तथा:
<textarea ng-model="mytext" ng-allow-tab></textarea>
element.triggerHandler('change');
, अन्यथा मॉडल अपडेट नहीं किया जाएगा (वजह से element.triggerHandler('change');
मुझे लगता है।
TAB कुंजी प्रेस को पकड़ने और रिक्त स्थान का एक गुच्छा सम्मिलित करने के लिए आपको JS कोड लिखना होगा। कुछ ऐसा ही जेएसफल्ड करता है।
जक्वरी फिडेल की जाँच करें :
HTML :
<textarea id="mybox">this is a test</textarea>
जावास्क्रिप्ट :
$('#mybox').live('keydown', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
alert('tab pressed');
}
});
event.preventDefault();
e.keyCode || e.which
।
@Kasdega समाधान के आधार पर एकाधिक-पंक्ति सूचक स्क्रिप्ट।
$('textarea').on('keydown', function (e) {
var keyCode = e.keyCode || e.which;
if (keyCode === 9) {
e.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
var val = this.value;
var selected = val.substring(start, end);
var re = /^/gm;
var count = selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '\t') + val.substring(end);
this.selectionStart = start;
this.selectionEnd = end + count;
}
});
start === end
।
यह समाधान आपके विशिष्ट कोड संपादक की तरह पूरे चयन में टैबिंग की अनुमति देता है, और उस चयन को भी अनटैब करना है। हालाँकि, मुझे पता नहीं चला है कि जब चयन नहीं होता है तो शिफ्ट-टैब को कैसे लागू किया जाता है।
$('#txtInput').on('keydown', function(ev) {
var keyCode = ev.keyCode || ev.which;
if (keyCode == 9) {
ev.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
var val = this.value;
var selected = val.substring(start, end);
var re, count;
if(ev.shiftKey) {
re = /^\t/gm;
count = -selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '') + val.substring(end);
// todo: add support for shift-tabbing without a selection
} else {
re = /^/gm;
count = selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '\t') + val.substring(end);
}
if(start === end) {
this.selectionStart = end + count;
} else {
this.selectionStart = start;
}
this.selectionEnd = end + count;
}
});
#txtInput {
font-family: monospace;
width: 100%;
box-sizing: border-box;
height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="txtInput">
$(document).ready(function(){
$("#msgid").html("This is Hello World by JQuery");
});
</textarea>
उन सभी के आधार पर, जो लोगों के जवाबों पर कहने के लिए किए गए थे, इसका सिर्फ कीडाउन का संयोजन है (कीप नहीं) + preventDefault () + कैरेट में एक टैब कैरेक्टर डालें। कुछ इस तरह:
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
insertAtCaret('txt', '\t')
}
पहले के उत्तर में एक काम करने वाला jsfiddle था लेकिन इसमें कीडाउन पर एक चेतावनी () का उपयोग किया गया था। यदि आप इस चेतावनी को हटाते हैं, तो यह काम नहीं करता है। मैं सिर्फ textarea में वर्तमान कर्सर स्थिति पर एक टैब डालने के लिए एक समारोह जोड़ा है।
यहाँ एक ही के लिए काम कर रहे jsfiddle: http://jsfiddle.net/nsHGZ/
मैं देख रहा हूं कि यह विषय हल नहीं हुआ है। मैंने इसे कोड किया और यह बहुत अच्छा काम कर रहा है। यह कर्सर इंडेक्स में सारणीकरण सम्मिलित करता है। Jquery का उपयोग किए बिना
<textarea id="myArea"></textarea>
<script>
document.getElementById("myArea").addEventListener("keydown",function(event){
if(event.code==="Tab"){
var cIndex=this.selectionStart;
this.value=[this.value.slice(0,cIndex),//Slice at cursor index
"\t", //Add Tab
this.value.slice(cIndex)].join('');//Join with the end
event.stopPropagation();
event.preventDefault(); //Don't quit the area
this.selectionStart=cIndex+1;
this.selectionEnd=cIndex+1; //Keep the cursor in the right index
}
});
</script>
मैंने एक ऐसा बनाया जिसे आप अपनी पसंद के किसी भी तत्व के साथ एक्सेस कर सकते हैं:
function textControl (element, event)
{
if(event.keyCode==9 || event.which==9)
{
event.preventDefault();
var s = element.selectionStart;
element.value = element.value.substring(0,element.selectionStart) + "\t" + element.value.substring(element.selectionEnd);
element.selectionEnd = s+1;
}
}
और तत्व इस तरह दिखेगा:
<textarea onkeydown="textControl(this,event)"></textarea>
मुझे लगता है कि वेनिला जावास्क्रिप्ट के साथ आधुनिक ब्राउज़रों में ऐसा करने का सबसे सरल तरीका है:
<textarea name="codebox"></textarea>
<script>
const codebox = document.querySelector("[name=codebox]")
codebox.addEventListener("keydown", (e) => {
let { keyCode } = e;
let { value, selectionStart, selectionEnd } = codebox;
if (keyCode === 9) { // TAB = 9
e.preventDefault();
codebox.value = value.slice(0, selectionStart) + "\t" + value.slice(selectionEnd);
codebox.setSelectionRange(selectionStart+2, selectionStart+2)
}
});
</script>
ध्यान दें कि मैंने सादगी के लिए इस स्निपेट में कई ईएस 6 सुविधाओं का उपयोग किया था, आप इसे तैनात करने से पहले संभवतः इसे (बैबल या टाइपस्क्रिप्ट के साथ) ट्रांसपाइल करना चाहेंगे।
उपरोक्त उत्तर सभी इतिहास को मिटा देते हैं। किसी के लिए एक समाधान की तलाश में जो ऐसा नहीं करता है, मैंने आखिरी घंटे क्रोम के लिए निम्नलिखित कोडिंग में बिताया:
jQuery.fn.enableTabs = function(TAB_TEXT){
// options
if(!TAB_TEXT)TAB_TEXT = '\t';
// text input event for character insertion
function insertText(el, text){
var te = document.createEvent('TextEvent');
te.initTextEvent('textInput', true, true, null, text, 9, "en-US");
el.dispatchEvent(te);
}
// catch tab and filter selection
jQuery(this).keydown(function(e){
if((e.which || e.keyCode)!=9)return true;
e.preventDefault();
var contents = this.value,
sel_start = this.selectionStart,
sel_end = this.selectionEnd,
sel_contents_before = contents.substring(0, sel_start),
first_line_start_search = sel_contents_before.lastIndexOf('\n'),
first_line_start = first_line_start_search==-1 ? 0 : first_line_start_search+1,
tab_sel_contents = contents.substring(first_line_start, sel_end),
tab_sel_contents_find = (e.shiftKey?new RegExp('\n'+TAB_TEXT, 'g'):new RegExp('\n', 'g')),
tab_sel_contents_replace = (e.shiftKey?'\n':'\n'+TAB_TEXT);
tab_sel_contents_replaced = (('\n'+tab_sel_contents)
.replace(tab_sel_contents_find, tab_sel_contents_replace))
.substring(1),
sel_end_new = first_line_start+tab_sel_contents_replaced.length;
this.setSelectionRange(first_line_start, sel_end);
insertText(this, tab_sel_contents_replaced);
this.setSelectionRange(first_line_start, sel_end_new);
});
};
संक्षेप में, चयनित लाइनों की शुरुआत में टैब डाले जाते हैं।
JSFiddle: http://jsfiddle.net/iausallc/5Lnabspr/11/
Gist: https://gist.github.com/iautomation/e53647be326cb7d7112d
उदाहरण उपयोग: $('textarea').enableTabs('\t')
विपक्ष: केवल क्रोम पर ही काम करता है।
Wjbryant द्वारा टैब समर्थन के लिए Github पर एक पुस्तकालय है: wjbryant द्वारा टैब : ओवरराइड
यह इस तरह काम करता है:
// get all the textarea elements on the page
var textareas = document.getElementsByTagName('textarea');
// enable Tab Override for all textareas
tabOverride.set(textareas);
ऊपर के कोडस्गा के कोड के विकल्प के रूप में, वर्तमान मूल्य पर टैब को जोड़ने के बजाय, आप इसके बजाय वर्तमान कर्सर बिंदु पर वर्ण सम्मिलित कर सकते हैं। इसका लाभ है:
इसलिए प्रतिस्थापित करें
// set textarea value to: text before caret + tab + text after caret
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
साथ में
// set textarea value to: text before caret + tab + text after caret
document.execCommand("insertText", false, ' ');
if (e.which == 9) {
e.preventDefault();
var start = $(this).get(0).selectionStart;
var end = $(this).get(0).selectionEnd;
if (start === end) {
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
$(this).get(0).selectionStart =
$(this).get(0).selectionEnd = start + 1;
} else {
var sel = $(this).val().substring(start, end),
find = /\n/g,
count = sel.match(find) ? sel.match(find).length : 0;
$(this).val($(this).val().substring(0, start)
+ "\t"
+ sel.replace(find, "\n\t")
+ $(this).val().substring(end, $(this).val().length));
$(this).get(0).selectionStart =
$(this).get(0).selectionEnd = end+count+1;
}
}
इस सरल jQuery फ़ंक्शन का प्रयास करें:
$.fn.getTab = function () {
this.keydown(function (e) {
if (e.keyCode === 9) {
var val = this.value,
start = this.selectionStart,
end = this.selectionEnd;
this.value = val.substring(0, start) + '\t' + val.substring(end);
this.selectionStart = this.selectionEnd = start + 1;
return false;
}
return true;
});
return this;
};
$("textarea").getTab();
// You can also use $("input").getTab();
मुझे इसे करने के लिए एक फ़ंक्शन बनाना था, इसका उपयोग करना सरल है, बस इस कोड को अपनी स्क्रिप्ट में कॉपी करें और उपयोग करें: enableTab( HTMLElement )
HTMLele कुछ इस तरह से किया जा रहा हैdocument.getElementById( id )
function enableTab(t){t.onkeydown=function(t){if(9===t.keyCode){var e=this.value,n=this.selectionStart,i=this.selectionEnd;return this.value=e.substring(0,n)+" "+e.substring(i),this.selectionStart=this.selectionEnd=n+1,!1}}}
प्रत्येक इनपुट में एक textarea तत्व एक onkeydown घटना है। ईवेंट हैंडलर में आप जब भी event.keyventDefault () का उपयोग करके टैब कुंजी की डिफ़ॉल्ट प्रतिक्रिया को रोक सकते हैं ।
फिर सही स्थिति में एक टैब साइन इन करें:
function allowTab(input)
{
input.addEventListener("keydown", function(event)
{
if(event.keyCode == 9)
{
event.preventDefault();
var input = event.target;
var str = input.value;
var _selectionStart = input.selectionStart;
var _selectionEnd = input.selectionEnd;
str = str.substring(0, _selectionStart) + "\t" + str.substring(_selectionEnd, str.length);
_selectionStart++;
input.value = str;
input.selectionStart = _selectionStart;
input.selectionEnd = _selectionStart;
}
});
}
window.addEventListener("load", function(event)
{
allowTab(document.querySelector("textarea"));
});
एचटीएमएल
<textarea></textarea>
$("textarea").keydown(function(event) {
if(event.which===9){
var cIndex=this.selectionStart;
this.value=[this.value.slice(0,cIndex),//Slice at cursor index
"\t", //Add Tab
this.value.slice(cIndex)].join('');//Join with the end
event.stopPropagation();
event.preventDefault(); //Don't quit the area
this.selectionStart=cIndex+1;
this.selectionEnd=cIndex+1; //Keep the cursor in the right index
}
});
सरल स्टैंडअलोन स्क्रिप्ट:
textarea_enable_tab_indent = function(textarea) {
textarea.onkeydown = function(e) {
if (e.keyCode == 9 || e.which == 9){
e.preventDefault();
var oldStart = this.selectionStart;
var before = this.value.substring(0, this.selectionStart);
var selected = this.value.substring(this.selectionStart, this.selectionEnd);
var after = this.value.substring(this.selectionEnd);
this.value = before + " " + selected + after;
this.selectionEnd = oldStart + 4;
}
}
}
यदि आपको वास्तव में टैब की आवश्यकता है तो शब्द या नोटपैड से एक टैब कॉपी करें और जहां आप चाहते हैं, उसे टेक्स्ट बॉक्स में पेस्ट करें
१ २ ३
१२ २२ ३३
दुर्भाग्य से मुझे लगता है कि वे इन टिप्पणियों से टैब हटा देते हैं, :) यह आपके POST या GET में% 09 के रूप में दिखाई देगा