簡體   English   中英

通過api調用在值更改時自動調整文本區域的大小(純JavaScript)

[英]Auto resize text area on value change via api call ( pure javascript )

我正在嘗試在textarea上添加自動調整大小功能。 僅當我鍵入某些內容時,下面的代碼才能很好地工作。 但是,如果我只是更新api中的值,則不會觸發任何事件。 因此,無法調整大小。 無論如何,我可以觸發鍵盤輸入或其他事件來觸發函數以編程方式獲取scrollHeight嗎?

autoResizeTextArea = (e) => {
  const element = e.target
  element.style.height = 'auto'
  element.style.overflowY = 'hidden'
  element.style.height = element.scrollHeight + 'px'
}

如果您控制更改代碼的JavaScript庫,則只需調用element.onchange()即可手動觸發事件element.onchange()

UPDATE

並且不要忘記將事件偵聽器onchange附加到您的元素

請注意,應通過html指令通過js element.onchange進行設置。

這是一個工作示例jsfiddle

HTML:

<textarea id="mytext"></textarea>
<button id="mybtn">change input</button>

JS:

var onChange = function(){
    alert('input changed');
}

var changeInput = function(){
  text.value = 'Hello World';
    text.onchange();
}

button = document.getElementById('mybtn');
button.onclick = changeInput;

text = document.getElementById('mytext');
text.onchange = onChange; 

https://jsfiddle.net/ab9hkbL7/1/

let textarea = document.querySelector("#myTextArea");
let tael = textarea.addEventListener.bind(textarea);

let autoResizeTextArea = (e) => {
  const element = e.target
  element.style.height = 'auto'
  element.style.overflowY = 'hidden'
  element.style.height = element.scrollHeight + 'px'
}

tael('update', autoResizeTextArea);
tael('keyup', autoResizeTextArea);
//add event listeners for update and keyup

//for demonstration set value big enough that it will resize box:
textarea.value = `lorem Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.`;

//setup promise to resolve after 2 seconds. 
//This will simulate fetching external data.

let newPromise = new Promise((res, rej) => {
  setTimeout(() => {
    res('resolved');
  }, 2000)
}).then((success) => {

//create the update event and dispatch it
  let myEvent = new CustomEvent("update");
  textarea.dispatchEvent(myEvent);
});

有關更多信息,請查看MDN: dispatchEvent CustomEvent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM