使用JavaScript将文本换行到更多行
在这里,我试图通过比较字符串的长度来包装下拉列表中选择的值。我在申请第一行时使用的代码。如何通过比较第二行和下一行的字符串长度来应用相同的逻辑。下面是我正在使用的一些示例,如果我的使用JavaScript将文本换行到更多行,javascript,jquery,Javascript,Jquery,在这里,我试图通过比较字符串的长度来包装下拉列表中选择的值。我在申请第一行时使用的代码。如何通过比较第二行和下一行的字符串长度来应用相同的逻辑。下面是我正在使用的一些示例,如果我的Item.value.length=81,该怎么办 var selectedItemLength = Math.round(((Item.bounds.width) / (state.style.fontSize * (0.512 * scale))) * (pfConstants.LINE_HEIGHT))
Item.value.length=81
,该怎么办
var selectedItemLength =
Math.round(((Item.bounds.width) / (state.style.fontSize * (0.512 * scale))) * (pfConstants.LINE_HEIGHT));
//Here selectedItemLength gives 32
if (selectedItemLength < Item.value.length) {
Item.value =
Item.value.substring(0, selectedItemLength)
+ "\n"
+ Item.value.substring(selectedItemLength, Item.value.length);
}
var selectedItemLength=
数学圆(((Item.bounds.width)/(state.style.fontSize*(0.512*刻度))*(pfConstants.LINE_HEIGHT));
//这里selectedItemLength给出32
if(selectedItemLength
注意:一个好的CSS规则可能会解决您的问题,不需要JS。调查财产
继续代码
首先,我建议在单独的函数中隔离您的关注点。在您的代码片段中,您将涉及一些不同的内容,例如Item.bounds.width
和Item.value
。最好将这些函数传递给函数对其进行操作,并将结果返回给对象。我理解你问题的核心,你想要一个函数,比如:
function(str: string,
chunkLength: number,
delimiter: string = "\n",
maxLines: number = 3) { /* code */ }
该功能需要:
- 将str分成给定大小的块
- 只取行大小允许的尽可能多的块
- 用分隔符将它们连接在一起
Item.value = demoFunction(Item.value,selectedItemLength);
请记住,当您询问时(以及在我编写解决方案时),您忽略了空格。这将把单词或标记分开,而不考虑空格。这可能不是所希望的。即
testFunction("teal mittens", 8) == "teal mit\ntens";
强制性解决方案
正如您所提到的,这是一个有状态的for循环
var demoImperative = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
var chunks = [];
for (var index = 0; index < str.length && chunks.length < maxLines; index += chunkLength) {
// NOTE: substr != substring. See https://stackoverflow.com/questions/3745515/what-is-the-difference-between-substr-and-substring
chunks.push(str.substr(index, chunkLength));
}
return chunks.join(delimiter);
}
当然是简明扼要,如果有点不清楚的话。.match()
进行拆分,.slice()
仅获取正确的行数,.join()
将数组恢复为字符串
拉姆达溶液
这一个使用了一个函数库,它使js中的数据转换(您在这里所做的)更加简单。我写这个是为了好玩
var demoRamda = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
return R.pipe(
R.splitEvery(chunkLength),
R.take(maxLines),
R.join(delimiter)
)(str);
}
清晰简单,但这需要ramda.js库。除非您在服务器端执行此操作(不太可能),否则这一操作包含一个巨大的实用程序库是过分的,所以我建议不要执行此操作。重新评估
Item.value.substring(selectedItemLength,Item.value.length)代码>使用相同的逻辑拆分第二行,然后将其余部分添加到第一行(将以blablabalabalabla\nblablablabal\n
结尾,因此只需冲洗和重复)@LordNeo我们可以用于循环吗?因为我的值最多只能显示3行。那么,使用for循环是否是一种好的做法呢?如果是,我如何使用它?可能是
var demoRamda = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
return R.pipe(
R.splitEvery(chunkLength),
R.take(maxLines),
R.join(delimiter)
)(str);
}