【问题标题】:Javascript: how do I insert the domain at the current position of the cursor?Javascript:如何在光标的当前位置插入域?
【发布时间】:2019-12-01 17:43:24
【问题描述】:

Javascript 能否以书签或类似的形式,在光标位置插入当前页面的域?怎么样?

有兴趣插入 stackoverflow.comwww.stackoverflow.com 以及 www

(用例:我在SO这里写一个问题,光标在标题文本字段或问题正文文本区域,我想在光标当前位置插入域名)。

【问题讨论】:

  • 有点混乱。所以假设你在https://stackoverflow.com/questions/59065000/javascript-how-do-i-insert-the-domain-at-the-current-position-of-the-cursor,当点击小书签时,文本stackoverflow.com应该插入到光标所在的位置?
  • 您需要它来处理contentEditable 元素,还是只需要文本区域/文本输入?如果有一个非空的选择,它应该发生什么?
  • @Ry- 嗯,'contentEditable` 元素的用例是什么?
  • 所见即所得的编辑器。除非 SO 是您的实际用例。
  • @Ry- 我的用例主要是输入电子邮件地址,每次我注册新帐户或类似帐户时,我都会在其中创建一个包含域的新地址。所以我输入d-b+ 之类的内容,单击书签并插入stackoverflow.com,然后我输入@gmail.com。最终结果是d-b+stackoverflow.com@gmail.com

标签: javascript bookmarklet


【解决方案1】:

聚焦textarea时,点击小书签,使用document.activeElement标识textarea,.slice其值,与window.location.origin连接:

javascript: (() => {
  const textarea = document.activeElement;
  const { selectionStart } = textarea;
  textarea.value = textarea.value.slice(0, selectionStart) + window.location.origin + textarea.value.slice(selectionStart);
})();

如果您希望书签适用于 https://robot-parts.confetti.events/ 内的 iframe,请访问 contentWindow.document 以访问 activeElement

javascript: (() => {
  const textarea = document.querySelector('.signup-iframe').contentWindow.document.activeElement;
  const { selectionStart } = textarea;
  textarea.value = textarea.value.slice(0, selectionStart) + window.location.origin + textarea.value.slice(selectionStart);
})();

【讨论】:

  • 嗯,我没有让你的脚本完全工作。如果我加载 robot-parts.confetti.events 并单击 RSVP 按钮(机器人部件),则会出现一个框,您可以在其中输入您的姓名等。另请注意,URL 发生了变化,最后添加了“/signup”。运行此小书签以在此处插入域名不会产生任何结果。但是,如果我改为加载 robot-parts.confetti.events/signup(即与您在第一个场景中单击按钮后看到的地址相同),然后运行小书签,则插入了一些东西。任何想法为什么?
  • 这是因为,当导航到 https://robot-parts.confetti.events/ 时,DOM 的那个区域实际上是一个 iframe<iframe class="signup-iframe" src="/signup?preload=true"></iframe>。当焦点在 iframe 内时,不会有 document.activeElement,因为 iframe 是完全不同的执行上下文。相反,当您直接导航到 /signup` 时,您不再处于 iframe 中,因此 document.activeElement 有效。和往常一样,在调试的时候,经常可以通过打开浏览器控制台,查找错误信息来找到错误的来源
  • 取决于站点的设置。如果它在同一个域上,您可能可以访问内部 iframe 并访问活动元素,但如果它在不同的域上,跨站点限制可能会阻止它工作。对于跨域工作的综合解决方案,您可能需要在两个页面上运行的用户脚本,以便父页面可以向子页面发送消息,并且子页面可以侦听跨域@987654335 @。有点复杂。
  • 在同一个域中。
  • 使用答案中的代码。当您有对 iframe 的引用时,如果 iframe 在同一个域中,请引用其contentWindow 以获取对 iframe 窗口的引用,您可以从中获取 iframe 的文档。
【解决方案2】:

此函数为键盘快捷键ctrl+g添加一个事件列表器,并在光标位置插入当前url用于输入和textarea标签

const fields = ['INPUT','TEXTAREA'];
function doc_keyUp(e) {
   if (e.ctrlKey && e.keyCode == 71) {
    // call your function to do the thing
    console.log(document.activeElement)
    if(fields.includes(document.activeElement.tagName)){
      let myField = document.activeElement;
      let startPos = myField.selectionStart;
      let endPos = myField.selectionEnd;
      myField.value = myField.value.substring(0, startPos)
            + window.location.href
            + myField.value.substring(endPos, myField.value.length);
      }
   }
}
// register the handler
document.addEventListener('keyup', doc_keyUp, false);

演示https://js.do/6by3/insert-link-at-cursor

【讨论】:

  • 我不明白as a bookmarklet 的意思。你是说浏览器插件吗?
  • en.wikipedia.org/wiki/Bookmarklet 。或者,如何加载此脚本,以便在 Firefox 和 Chrome 中始终可以通过 ctrl+g 访问它?
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2011-05-26
  • 2011-09-19
相关资源
最近更新 更多