首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击时移动文本插入点(插入符号)

问单击时移动文本插入点(插入符号)
EN

Stack Overflow用户
提问于 2020-01-23 06:25:48
回答 2查看 76关注 0票数 1

为了通过捕捉表单中的未点击来增强UX,我在每个文本字段周围的边界框上使用了以下代码:

代码语言:javascript
复制
focusMethod = function getFocus() {           
  document.getElementById("myTextField").focus();
}

这可以很好地将焦点设置在离用户单击位置最近的文本字段上,即使不是直接在文本字段本身上。但是,文本插入点(插入符号)始终自动放置在输入的左侧,而不是最近的输入x点。

使用vanilla JS,我如何进一步找到文本插入点(插入符号)并将其移动到与用户单击的位置最接近的位置(假设字段中包含文本)?

图片来源:what I have now | what I want to happen

EN

回答 2

Stack Overflow用户

发布于 2020-01-23 07:18:27

您可以覆盖一种较大的粗糙文本输入,然后使用它的文本定位来实现真正的输入。

否则,很难弄清楚字符的位置……字体很奇怪,我不知道js中的字体到底在哪里。

​

代码语言:javascript
复制
const byId = (id) => document.getElementById(id);
const on = (el, event, cb) => el.addEventListener(event, cb);

const textEl = byId("Text");
const hackEl = byId("Hack");

on(textEl, "input", () => hackEl.value = textEl.value);

on(hackEl, "click", () => {
  const charFocusPos = hackEl.selectionStart;
  textEl.focus();
  textEl.selectionStart = textEl.selectionEnd = charFocusPos;
});
代码语言:javascript
复制
#Container {
  position: relative;
  display: inline-block;
}

#Hack {
  transform: translate(-50%, -50%) scaleY(5);
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  opacity: 0;
  padding-top: 0px;
  padding-bottom: 0px;
  height: 16px;
  border: none;
  outline: none;
}


#Hack.showOnHover:hover {
  opacity: 0.1;
}

#Hack, #Text {
  font-size: 16px;
  font-family: arial;
}
代码语言:javascript
复制
<div id="Container">
  <input type="textbox" id="Text">
  <input type="textbox" id="Hack"></div>
</div>

<button onClick="byId('Hack').classList.toggle('showOnHover')">Toggle Hack Layer</div>

​

票数 0
EN

Stack Overflow用户

发布于 2020-01-23 08:48:00

你可以做到这一点。我做了一些可以作为起点的东西:

代码语言:javascript
复制
<div id="container">
    <input type="text" id="input">
    <br>
    <br>
</div>
<script type="text/javascript">
var testInput = document.getElementById("input");
var testContainer = document.getElementById("container");
document.getElementById("container").addEventListener("click", function(event) {
    testInput.focus();
  var padding = 0;
  console.log(event.clientX);
  console.log(testInput.getBoundingClientRect().left);
  console.log(testInput.getBoundingClientRect().right);
  if (event.clientX > testInput.getBoundingClientRect().right) padding = (testInput.getBoundingClientRect().right * 0.8);
  else if (event.clientX > testInput.getBoundingClientRect().left) padding = (event.clientX - testInput.getBoundingClientRect().left);
  testInput.style["padding-left"] = padding + "px";
});
</script>

和

代码语言:javascript
复制
#container {
  width: 90%;
  margin: auto;
  background-color: gray;
}

#input {
  width: 80%;
  margin-top: 100px;
  margin-left: 10%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
}

请参阅:https://jsfiddle.net/mLqj17xe/1/

这个想法是找出光标应该在哪里,并使用它作为padding。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59869131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档