Elementor 表单的单词计数器
Word Counter for Elementor form
我正在尝试使字符计数器适应已计数的字数,但使用 space 拆分退出允许输入的限制。我将它与 Elementor 表单文本区域一起使用。它一直有效,直到你达到 50 个单词,然后除了 50 个字符之外的所有内容都消失了。不确定我做错了什么,而且对 javascript 来说太新了,我自己看不到这个问题。任何帮助表示赞赏。
// #form-field-custom_essay
// #word_counter
var textInput = document.querySelector("#form-field-custom_essay");
var wordCounter = document.querySelector("#word_counter p");
var wordLimit = 50;
wordCounter.innerText = wordLimit + " Words Remaining";
textInput.addEventListener("keyup", function(){
var words = textInput.value.split(" ");
wordCounter.innerText = (wordLimit - words.length) + " Words Remaining";
if(words.length >= wordLimit) {
words = words.substring(0, wordLimit);
wordCounter.innerText = "0 Words Remaining";
wordCounter.style.color = "red";
} else {
wordCounter.style.color = null;
}
});
你可以做到...
PS wordLimit = 4
快速测试
const wordCounter = document.querySelector('p#word-counter span')
, textInput = document.forms['my-form'].theTextArea
, wordLimit = 4 // or 50
;
textInput.value = ''
wordCounter.textContent = wordLimit
textInput.oninput =_=> // use input event, not keyup event
{
let wordsArray = textInput.value.trim().split(/\s+/) // array containing all textInput [real] words
while (wordsArray.length > wordLimit )
{
let wrd = wordsArray.pop() // get last word
, pos = textInput.value.lastIndexOf(wrd) // find it in textarea
;
textInput.value = textInput.value.substring(0, pos) // trunc it in textarea
}
wordCounter.style.color = (wordsArray.length < wordLimit) ? null : 'red'
wordCounter.textContent = wordLimit - wordsArray.length
}
<form name="my-form">
<textarea name="theTextArea" cols="30" rows="10" placeholder="type your text"></textarea>
<!-- /.../ -->
</form>
<p id="word-counter"><span>0</span> Words Remaining</p>
substring 函数提取字符,而不是单词。如果达到限制,您可以尝试禁用文本区域的输入。
textInput.addEventListener("keypress", function(e){
var words = textInput.value.split(" ");
wordCounter.innerText = (wordLimit - words.length) + " Words Remaining";
if(words.length > wordLimit) {
e.preventDefault()
wordCounter.innerText = "0 Words Remaining";
wordCounter.style.color = "red";
} else {
wordCounter.style.color = null;
}
});
我正在尝试使字符计数器适应已计数的字数,但使用 space 拆分退出允许输入的限制。我将它与 Elementor 表单文本区域一起使用。它一直有效,直到你达到 50 个单词,然后除了 50 个字符之外的所有内容都消失了。不确定我做错了什么,而且对 javascript 来说太新了,我自己看不到这个问题。任何帮助表示赞赏。
// #form-field-custom_essay
// #word_counter
var textInput = document.querySelector("#form-field-custom_essay");
var wordCounter = document.querySelector("#word_counter p");
var wordLimit = 50;
wordCounter.innerText = wordLimit + " Words Remaining";
textInput.addEventListener("keyup", function(){
var words = textInput.value.split(" ");
wordCounter.innerText = (wordLimit - words.length) + " Words Remaining";
if(words.length >= wordLimit) {
words = words.substring(0, wordLimit);
wordCounter.innerText = "0 Words Remaining";
wordCounter.style.color = "red";
} else {
wordCounter.style.color = null;
}
});
你可以做到...
PS wordLimit = 4
快速测试
const wordCounter = document.querySelector('p#word-counter span')
, textInput = document.forms['my-form'].theTextArea
, wordLimit = 4 // or 50
;
textInput.value = ''
wordCounter.textContent = wordLimit
textInput.oninput =_=> // use input event, not keyup event
{
let wordsArray = textInput.value.trim().split(/\s+/) // array containing all textInput [real] words
while (wordsArray.length > wordLimit )
{
let wrd = wordsArray.pop() // get last word
, pos = textInput.value.lastIndexOf(wrd) // find it in textarea
;
textInput.value = textInput.value.substring(0, pos) // trunc it in textarea
}
wordCounter.style.color = (wordsArray.length < wordLimit) ? null : 'red'
wordCounter.textContent = wordLimit - wordsArray.length
}
<form name="my-form">
<textarea name="theTextArea" cols="30" rows="10" placeholder="type your text"></textarea>
<!-- /.../ -->
</form>
<p id="word-counter"><span>0</span> Words Remaining</p>
substring 函数提取字符,而不是单词。如果达到限制,您可以尝试禁用文本区域的输入。
textInput.addEventListener("keypress", function(e){
var words = textInput.value.split(" ");
wordCounter.innerText = (wordLimit - words.length) + " Words Remaining";
if(words.length > wordLimit) {
e.preventDefault()
wordCounter.innerText = "0 Words Remaining";
wordCounter.style.color = "red";
} else {
wordCounter.style.color = null;
}
});