0

Firefoxの拡張機能に取り組んでいます。単純な1行のテキストボックスがあります。ユーザーがテキストを貼り付けるときに、テキストに新しい行があるかどうかを検出したいのですが、ある場合は、テキストボックスを複数行のテキストボックスに拡張します。

私は持っています

<textbox id="textbox" rows="5" wrap="off" newlines="pasteintact" oninput="adjustTextbox(this)" flex="1"/>

そしてJS側では、私は

adjustTextbox(txtBox) {
  if(!txtBox.getAttribute('multiline') && txtBox.value.match(/[\r\n]/)) {
    txtBox.setAttribute('multiline', true);
  }
}

問題は、テキストボックスが5行の複数行のテキストボックスに変換されても、貼り付けられた値が失われ、テキストボックスが空白になることです。私はここで何か間違ったことをしていますか?

4

1 に答える 1

2

簡単な答え:いいえ、何も悪いことはしていません。単一行から複数​​行に切り替えると、値がクリアされることが期待されます。長い答え:<textbox>要素は実際には値自体を保持していません。むしろ匿名を含んでいます<html:input type="text>。属性を追加するmultilineと、別のXBLバインディングが要素に適用され、その匿名テキストフィールドがに置き換えられ<html:textarea>ます。明らかに、その過程で価値は失われます。

multiline属性を追加した後、値を保存して復元することができます。問題は、バインディングが実際にいつ適用されるかを判断するのが難しいことです。実際には予測できない遅延があります。したがって、より良い解決策は、ドキュメントに1行と複数行の両方のテキストボックスを含め、そのうちの1つが常に折りたたまれていることを確認することです。

<textbox id="textbox" newlines="pasteintact" oninput="adjustTextbox(this)" flex="1"/>
<textbox id="textbox2" collapsed="true" multiline="true" rows="5" wrap="off" flex="1"/>

そしてJavaScript側では:

function adjustTextbox(txtBox) {
  if(!txtBox.getAttribute('multiline') && txtBox.value.match(/[\r\n]/)) {
    var txtBox2 = document.getElementById("textbox2");
    txtBox2.value = txtBox.value;
    txtBox.collapsed = true;
    txtBox2.collapsed = false;
  }
}
于 2012-09-08T08:19:53.797 に答える