#javascript #html #jquery
Вопрос:
Я хочу создать функцию типа ключевых слов с помощью java-скрипта. Возможно ли это? Я хочу, чтобы, когда я нажимаю на любую букву или цифру, она появляется в текстовой области, а при нажатии на кнопку изменить регистр переключается регистр букв. Вот мои html-коды.
<html><head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
.btn{border:1px solid black;padding:5px;display: inline-block;}
textarea{width:100%;height:80px}
.slr{display:none;}
.clicked{ border : 3px solid #000;}
<style> </style> </head>
<body>
<textarea id="text1"></textarea>
<br>
<span class="btn" id="btn-1" data-showbutton="1"> Letter</span>| <span class="btn" id="btn-2" data-showbutton="2">Number</span>
<div class="slr" data-button="1">
<center><span id="switch_case" class="btn">Change case</span></center>
<span class="btn">A</span>
<span class="btn">B</span>
<span class="btn">C</span>
<span class="btn">D</span>
<span class="btn">E</span>
<span class="btn">F</span>
<span class="btn">G</span>
<span class="btn">H</span>
<span class="btn">I</span>
<span class="btn">J</span>
<span class="btn">K</span>
<span class="btn">L</span>
<span class="btn">M</span>
<span class="btn">N</span>
<span class="btn">O</span>
<span class="btn">P</span>
<span class="btn">Q</span>
<span class="btn">R</span>
<span class="btn">S</span>
<span class="btn">T</span>
<span class="btn">U</span>
<span class="btn">V</span>
<span class="btn">W</span>
<span class="btn">X</span>
<span class="btn">Y</span>
<span class="btn">Z</span>
</div>
<div data-button="2" class="slr">
<span class="btn">0</span>
<span class="btn">1</span>
<span class="btn">2</span>
<span class="btn">3</span>
<span class="btn">4</span>
<span class="btn">5</span>
<span class="btn">6</span>
<span class="btn">7</span>
<span class="btn">8</span>
<span class="btn">9</span>
</div>
<script type="text/javascript">
$('#btn-1,#btn-2').click(function(){
var btn = $(this).data("showbutton");
showButtonText(btn);
});
function showButtonText(btn) {
// reset
$('.text').hide();
$('[data-button]').hide();
$('[data-showbutton]').removeClass('clicked');
// only show the selected
$('[data-showbutton=' btn ']').addClass('clicked');
$('[data-button=' btn ']').show();
}
</script> </body></html>
Если это возможно, пожалуйста, добавьте эти две функции и объясните это. Я хочу использовать в Google blogger и его поддержке только языки интерфейса.
Комментарии:
1. Почему бы не принять любой из приведенных ниже ответов? Или, по крайней мере, прокомментируйте их…
Ответ №1:
Используйте делегирование событий и добавьте прослушиватель щелчка в slr
элемент. Затем добавьте текст, на который вы нажали textarea
.
Обратите внимание, что также вы можете создать цикл for и добавить прослушиватель ко всему span, но при делегировании событий вы добавляете только одного слушателя, и цикл не требуется.
И для случая переключения используйте этот код:
$("#switch_case").click((e) => {
$("div[data-button='1'] > span.btn").each((t, elm) => {
if (elm.innerText == elm.innerText.toLowerCase())
elm.innerText = elm.innerText.toUpperCase();
else
elm.innerText = elm.innerText.toLowerCase();
})
})
Вот рабочий образец:
$('#btn-1,#btn-2').click(function () {
var btn = $(this).data("showbutton");
showButtonText(btn);
});
$(".slr> span.btn").click((e) => {
$("#text1").val($("#text1").val() e.target.innerText);
})
$("#switch_case").click((e) => {
$("div[data-button='1'] > span.btn").each((t, elm) => {
if (elm.innerText == elm.innerText.toLowerCase())
elm.innerText = elm.innerText.toUpperCase();
else
elm.innerText = elm.innerText.toLowerCase();
})
})
function showButtonText(btn) {
// reset
$('.text').hide();
$('[data-button]').hide();
$('[data-showbutton]').removeClass('clicked');
// only show the selected
$('[data-showbutton=' btn ']').addClass('clicked');
$('[data-button=' btn ']').show();
}
.btn {
border: 1px solid black;
padding: 5px;
display: inline-block;
}
textarea {
width: 100%;
height: 200px
}
.slr {
display: none;
}
.clicked {
border: 3px solid #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<textarea id="text1"></textarea>
<br>
<span class="btn" id="btn-1" data-showbutton="1"> Letter</span>| <span class="btn" id="btn-2" data-showbutton="2">Number</span>
<div class="slr" data-button="1">
<center><span id="switch_case" class="btn">Change case</span></center>
<span class="btn">A</span><span class="btn">B</span><span class="btn">C</span><span class="btn">D</span><span class="btn">E</span><span class="btn">F</span><span class="btn">G</span><span class="btn">H</span><span class="btn">I</span><span class="btn">J</span><span class="btn">K</span><span class="btn">L</span><span class="btn">M</span><span class="btn">N</span><span class="btn">O</span><span class="btn">P</span><span class="btn">Q</span><span class="btn">R</span><span class="btn">S</span><span class="btn">T</span><span class="btn">U</span><span class="btn">V</span><span class="btn">W</span><span class="btn">X</span><span class="btn">Y</span><span class="btn">Z</span>
</div>
<div data-button="2" class="slr">
<span class="btn">0</span><span class="btn">1</span><span class="btn">2</span><span class="btn">3</span><span class="btn">4</span><span class="btn">5</span><span class="btn">6</span><span class="btn">7</span><span class="btn">8</span><span class="btn">9</span>
</div>
Комментарии:
1. Да, @alireza-ахмади при нажатии на изменение регистра — от нижнего к верхнему и от верхнего к нижнему регистру
2. @mayonkbora Хорошо, проверьте мой обновленный ответ. Все в порядке? Ваша проблема решена?
Ответ №2:
Назначьте an event listener
ВСЕМ элементам диапазона, которые действуют как кнопки для ввода. Используйте обработчик события, чтобы найти текст в пределах промежутка и добавить в текстовую область следующим образом:
$('#btn-1,#btn-2').click(function(){
var btn = $(this).data("showbutton");
showButtonText(btn);
});
function showButtonText(btn) {
// reset
$('.text').hide();
$('[data-button]').hide();
$('[data-showbutton]').removeClass('clicked');
// only show the selected
$('[data-showbutton=' btn ']').addClass('clicked');
$('[data-button=' btn ']').show();
}
const casechanger=document.querySelector('div.slr > center > span.btn');
/*
obtain a nodelist of all `span` elements that act as buttons for input.
Assign a simple event handler to each span that adds the textContent from
the span to the output textarea.
*/
document.querySelectorAll('div.slr > span.btn').forEach( span=>{
span.addEventListener('click',function(e){
let text=document.querySelector('textarea#text1')
text.value =casechanger.dataset.case==1 ? this.textContent.toLowerCase() : this.textContent.toUpperCase();
});
});
/*
Using the same dataset attribute to modify the content displayed within the
span elements that act as input.
*/
casechanger.addEventListener('click',function(e){
//toggle the dataset attribute between 1 and 0
this.dataset.case=1-this.dataset.case;
// find all span elements and change case of contents based upon value of dataset attribute
this.parentNode.parentNode.querySelectorAll('span.btn:not([id="switch_case"])').forEach(span=>{
span.textContent=casechanger.dataset.case==1 ? span.textContent.toLowerCase() : span.textContent.toUpperCase();
})
});
.btn{border:1px solid black;padding:5px;display: inline-block;}
textarea{width:100%;height:200px}
.slr{display:none;}
.clicked{ border : 3px solid #000;}
.btn{cursor:pointer}
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="text1"></textarea>
<br>
<span class="btn" id="btn-1" data-showbutton="1"> Letter</span> | <span class="btn" id="btn-2" data-showbutton="2">Number</span>
<div class="slr" data-button="1">
<center><span id="switch_case" class="btn" data-case=0>Change case</span></center>
<span class="btn">A</span>
<span class="btn">B</span>
<span class="btn">C</span>
<span class="btn">D</span>
<span class="btn">E</span>
<span class="btn">F</span>
<span class="btn">G</span>
<span class="btn">H</span>
<span class="btn">I</span>
<span class="btn">J</span>
<span class="btn">K</span>
<span class="btn">L</span>
<span class="btn">M</span>
<span class="btn">N</span>
<span class="btn">O</span>
<span class="btn">P</span>
<span class="btn">Q</span>
<span class="btn">R</span>
<span class="btn">S</span>
<span class="btn">T</span>
<span class="btn">U</span>
<span class="btn">V</span>
<span class="btn">W</span>
<span class="btn">X</span>
<span class="btn">Y</span>
<span class="btn">Z</span>
</div>
<div data-button="2" class="slr">
<span class="btn">0</span>
<span class="btn">1</span>
<span class="btn">2</span>
<span class="btn">3</span>
<span class="btn">4</span>
<span class="btn">5</span>
<span class="btn">6</span>
<span class="btn">7</span>
<span class="btn">8</span>
<span class="btn">9</span>
</div>
Ответ №3:
$('#btn-1,#btn-2').click(function(){
var btn = $(this).data("showbutton");
showButtonText(btn);
});
$("#switch_case").click(()=>{
document.querySelectorAll('div.slr > span.btn').forEach( span=>{
if(/d/.test(span.textContent) == false){
var result = span.textContent == span.textContent.toUpperCase();
if(result == true){
span.textContent = span.textContent.toLowerCase();
}else{
span.textContent = span.textContent.toUpperCase();
}
}
})
})
function showButtonText(btn) {
// reset
$('.text').hide();
$('[data-button]').hide();
$('[data-showbutton]').removeClass('clicked');
// only show the selected
$('[data-showbutton=' btn ']').addClass('clicked');
$('[data-button=' btn ']').show();
}
/*
obtain a nodelist of all `span` elements that act as buttons for input.
Assign a simple event handler to each span that adds the textContent from
the span to the output textarea.
*/
document.querySelectorAll('div.slr > span.btn').forEach( span=>{
span.addEventListener('click',function(e){
document.querySelector('textarea#text1').value =this.textContent
});
})
.btn{border:1px solid black;padding:5px;display: inline-block;}
textarea{width:100%;height:200px}
.slr{display:none;}
.clicked{ border : 3px solid #000;}
.btn{cursor:pointer}
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="text1"></textarea>
<br>
<span class="btn" id="btn-1" data-showbutton="1"> Letter</span> | <span class="btn" id="btn-2" data-showbutton="2">Number</span>
<div class="slr" data-button="1">
<center><span id="switch_case" class="btn" data-case=0>Change case</span></center>
<span class="btn">A</span>
<span class="btn">B</span>
<span class="btn">C</span>
<span class="btn">D</span>
<span class="btn">E</span>
<span class="btn">F</span>
<span class="btn">G</span>
<span class="btn">H</span>
<span class="btn">I</span>
<span class="btn">J</span>
<span class="btn">K</span>
<span class="btn">L</span>
<span class="btn">M</span>
<span class="btn">N</span>
<span class="btn">O</span>
<span class="btn">P</span>
<span class="btn">Q</span>
<span class="btn">R</span>
<span class="btn">S</span>
<span class="btn">T</span>
<span class="btn">U</span>
<span class="btn">V</span>
<span class="btn">W</span>
<span class="btn">X</span>
<span class="btn">Y</span>
<span class="btn">Z</span>
</div>
<div data-button="2" class="slr">
<span class="btn">0</span>
<span class="btn">1</span>
<span class="btn">2</span>
<span class="btn">3</span>
<span class="btn">4</span>
<span class="btn">5</span>
<span class="btn">6</span>
<span class="btn">7</span>
<span class="btn">8</span>
<span class="btn">9</span>
</div>
Я сделал регистр изменения кликабельным, а при нажатии меняю регистр клавиатуры и т.д.
Ответ №4:
Взгляните на следующий прокомментированный код и дайте мне знать, если у вас есть какие-либо сомнения. Пожалуйста, обратите внимание, что это базовая, но рабочая реализация.
// GET ELEMENTS
const lettersButton = document.getElementById('lettersButton');
const numbersButton = document.getElementById('numbersButton');
const textArea = document.getElementById('textArea');
const caseButton = document.getElementById('caseButton');
const lettersDiv = document.getElementById('lettersDiv');
const numbersDiv = document.getElementById('numbersDiv');
// DEFINE LETTERS AND NUMBERS
const letters = 'abcdefghijklmnopqrstuvwxyz';
const numbers = '0123456789';
// CREATE AUXILIARY VARIABLES
let isUpperCase = false;
// CREATE HANDLER FOR CLICK EVENTS
const onClickHandler = (e) => {
textArea.value = e.target.innerText;
};
// CREATE TOGGLE CASE FUNCTION
const toggleCase = () => {
isUpperCase = !isUpperCase;
createKeys(isUpperCase ? letters.toUpperCase() : letters, lettersDiv);
};
// CREATE SWITCH KEYBOARD FUNCTION
const switchKeyboard = (letters) => {
if (letters) {
lettersDiv.style.display = null;
numbersDiv.style.display = 'none';
} else {
lettersDiv.style.display = 'none';
numbersDiv.style.display = null;
}
};
// CREATE KEYS FUNCTION
const createKeys = (source, target) => {
target.querySelectorAll(':scope > span').forEach((element) => {
element.remove();
});
source.split('').forEach((char) => {
const key = document.createElement('SPAN');
key.classList.add('key');
key.innerText = char;
key.addEventListener('click', onClickHandler);
target.appendChild(key);
});
};
// ADD EVENT LISTENERS
lettersButton.addEventListener('click', () => switchKeyboard(true));
numbersButton.addEventListener('click', () => switchKeyboard(false));
caseButton.addEventListener('click', () => toggleCase());
// CREATE AND ADD LETTER KEYS
createKeys(letters, lettersDiv);
// CREATE AND ADD NUMBER KEYS
createKeys(numbers, numbersDiv);
// SWITCH KEYBOARD
switchKeyboard(true);
.key {
border: 1px solid black;
padding: 5px;
display: inline-block;
}
.text {
width:100%;
height:200px
}
<html>
<body>
<textarea id='textArea' class="text"></textarea>
<br>
<span id="lettersButton" class="key">Letters</span>
<span>amp;nbsp|amp;nbsp</span>
<span id="numbersButton" class="key">Numbers</span>
<div id="lettersDiv">
<center>
<span id="caseButton" class="key">Toggle Case</span>
</center>
</div>
<div id="numbersDiv"></div>
</body>
</html>