【问题标题】:problem with Chrome form handling: input onfocus="this.select()"Chrome 表单处理问题:输入 onfocus="this.select()"
【发布时间】:2011-02-25 17:12:10
【问题描述】:

当用户点击字段时,我使用以下 HTML 代码自动选择表单字段中的某些文本:

<input onfocus="this.select()" type="text" value="Search">

这在 Firefox 和 Internet Explorer 中运行良好(目的是使用默认文本向用户描述该字段,但突出显示它以便在单击时他们可以开始输入),但我无法获取它在 Chrome 中工作。当我单击 Chrome 中的表单字段时,文本会突出显示一秒钟,然后光标跳到默认文本的末尾,突出显示消失。

关于如何让它在 Chrome 中也能正常工作的任何想法?

【问题讨论】:

    标签: html forms google-chrome webkit


    【解决方案1】:

    您必须将此操作绑定到 onclick 事件中,而不是绑定到 onfocus 事件,它会按您的意愿工作。

    <input onclick="this.select()" id="txt1" name="txt1" type="text" value="Search">
    

    【讨论】:

    • 这将处理鼠标,但不能处理键盘。保持专注会好得多。我怀疑问题与调用 .select() 有关,而不是与触发哪个事件有关。
    • @Dan,但是使用键盘在字段中切换会自动选择它们的内容。
    • @Lee,我想不出有什么不这样做的,但这种行为取决于实现它的浏览器。
    • @Tyler,是的,但是如果浏览器的行为不是这样,那么尝试使其行为不同就不是一个好主意。对于熟悉该特定浏览器的用户来说,这将是陌生的。不只是浏览器在切换到字段时选择文本,大多数原生 O/S 表单字段也这样做。
    • 这是一个非常糟糕的解决方案,因为在选择字段后单击任意位置应该移动光标,而不是重新选择所有内容。请不要使用这个解决方案,它非常令人沮丧。
    【解决方案2】:

    如果你真的坚持使用onfocus,那你也需要加onmouseup="return false"

    【讨论】:

    • 好答案。在 Chrome、firefox 和 safari 上完美运行。 onfocus="this.select()" onmouseup="return false"
    • 这是 chrome 移动页面中缺少的部分。
    【解决方案3】:

    这对我来说效果最好......

    <input type="text"  onfocus="this.searchfocus = true;" onmouseup="if(this.searchfocus) {this.select(); this.searchfocus = false;}" />
    

    mouseup 事件在 onfocus 后触发。

    【讨论】:

    • 如果焦点是通过键盘获得的,这会很糟糕。下一次单击选择输入而不是移动插入符号。
    【解决方案4】:

    这是一个适用于 Firefox、Chrome 和 IE 的解决方案,具有键盘焦点和鼠标焦点。它还可以正确处理焦点之后的点击(它会移动插入符号并且不会重新选择文本):

    <input
    onmousedown="this.clicked = 1;"
    onfocus="if (!this.clicked) this.select(); else this.clicked = 2;"
    onclick="if (this.clicked == 2) this.select(); this.clicked = 0;"
    >
    

    使用键盘焦点,只有onfocus 触发选择文本,因为this.clicked 未设置。鼠标聚焦时,onmousedown 触发,然后onfocusonclick 选择onclick 中的文本,而不是onfocus 中的文本(Chrome 需要这样做)。

    当字段已经聚焦时,鼠标点击不会触发onfocus,这会导致不选择任何内容。

    【讨论】:

      【解决方案5】:

      我解决这个问题的方法是创建一个使用setTimeout() 的包装函数来延迟对select() 的实际调用。然后我只是在文本框的焦点事件中调用该函数。使用 setTimeout 会延迟执行,直到调用堆栈再次为空,这将是浏览器完成处理您单击时发生的所有事件(mousedown、mouseup、click、focus 等)。这有点小技巧,但它确实有效。

      function selectTextboxContent(textbox)
      {
          setTimeout(function() { textbox.select(); }, 10);
      }
      

      然后你可以做这样的事情来做焦点选择:

      <input onfocus="selectTextboxContent(this);" type="text" value="Search">
      

      【讨论】:

      • 如果鼠标按下和单击之间的时间超过 10 毫秒(用户按住鼠标按钮超过 10 毫秒),则此解决方案不起作用。
      【解决方案6】:

      基于 Jason 的回答,这里有一个函数,它用内置超时的更新版本替换 DOM 输入节点的“选择”函数:

      if (/chrome/i.test(navigator.userAgent)) {
          HTMLInputElement.prototype.brokenSelectFunction = 
              HTMLInputElement.prototype.select;
      
          HTMLInputElement.prototype.select = function() {
              setTimeout(function(closureThis) { return function() {
                  closureThis.brokenSelectFunction();
              }; }(this), 10);
          };
      }
      

      基本上,(仅在 Chrome 中)我们只是将内置但损坏的 select() 函数重命名为 brokenSelectFunction(),然后向所有输入添加一个名为 select() 的新函数,该函数在延迟后调用 brokenSelectFunction()。现在,只需正常调用 select(),因为内置的 select 函数已被 Jason 延迟建议的固定函数替换。

      这样,您不必担心更改现有调用以使用包装函数(一旦在 Chrome 中解决此问题,您就可以删除上述 shim 并恢复正常)。

      textbox.select(); // now runs select with setTimeout built-in (in Chrome only)
      

      编辑:您可能希望将用户代理匹配从“chrome”更改为“webkit”,因为此问题发生在包括 Safari 在内的所有 webkit 浏览器中,此修复适用于任何其中。

      【讨论】:

      • 这太棒了!完美运行。多年来,我一直对 Webkit 如何打破这一点感到恼火!
      【解决方案7】:

      只需使用&lt;input onmouseup=select()&gt;。这适用于所有浏览器。

      【讨论】:

        【解决方案8】:

        这个问题是五年前发布的,但是使用 HTML5,您可以使用占位符属性来制作此功能。

        <input type="text" name="fname" placeholder="First name">
        

        【讨论】:

          【解决方案9】:
          onfocus="setTimeout(function(){select(this)})" 
          

          onfocus="setTimeout(function(){select(this)},118)" 用于 Firefox。

          【讨论】:

            【解决方案10】:

            谢谢ilawton。这对我有用

                &lt;input type="text"  onfocus="this.searchfocus = true;" onmouseup="if(this.searchfocus) {this.select(); this.searchfocus = false;}" /&gt;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多