<input type=text> 的 HTML 替代品,可以分配一个唯一的 ID 并与文本混合

Posted

技术标签:

【中文标题】<input type=text> 的 HTML 替代品,可以分配一个唯一的 ID 并与文本混合【英文标题】:HTML alternative to <input type=text> that can be assigned a unique ID and that blends in with text 【发布时间】:2015-03-04 19:15:15 【问题描述】:

什么 html 元素能够被分配一个 ID 并且也是 &lt;input&gt; 元素的替代品?因为当前正在使用一个元素来根据用户输入更新该文本块;然而,就外观而言,&lt;input&gt; 元素不起作用,因为它周围有一个大矩形块。

<div id="myModal">
...
<input type="text" id="txtUserName" size="150" disabled></input>
...
</div>
<script>
  ...
$('#txtUserName',$('#myModal')).val('Jim Smith');
  ...
</script>

除了文本周围的矩形块外,似乎还限制了框的扩展范围。

关于如何将更新后的文本与其他文本无缝融合的想法或建议?因为最终的目标是让用户能够通过电子邮件将模式中出现的内容(预填充文本和用户输入的组合)发送给另一个人。

【问题讨论】:

【参考方案1】:

您可以使用contentEditable 属性使任何元素可编辑。

Example Here

在这种情况下,只需使用span,指定您的id 并设置contentEditable="true"

这样做,元素将与段落融为一体,并且最终用户仍然可以对其进行编辑。

<span contentEditable="true" id="txtUserName"></span>

由于元素不再是input,因此请使用.text() 方法而不是.val()

$('#txtUserName').text('Jim Smith');

..或使用纯 JS:

document.getElementById('txtUserName').textContent = 'Jim Smith';

关注元素时的结果:

..如果你不想要大纲:(example)

span[contentEditable="true"] 
    outline: none;

使用contentEditable 属性的好处之一是文本将换行并继续作为span 元素运行。这是使用输入无法实现的。

【讨论】:

喜欢这个contentEditable 属性。今天学到了新东西! @JoshCrozier 这非常有效。感谢您的精彩解释和分享此信息。【参考方案2】:

我的建议不如@Josh Crozier 的回答漂亮,但如果您要保留&lt;input&gt; 元素,您可以使用一点jQuery 来计算字符数,然后随着文本的增长更新输入元素的宽度。

HTML

<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
    <input class="user-input" id="text-username" type="text" placeholder="username"> 
    eget pharetra eros. Suspendisse consequat magna id sapien ullamcorper, 
    eu dignissim lacus viverra. Vivamus euismod luctus lorem, et sodales 
    ipsum maximus sit amet. Maecenas nec 
    <input class="user-input" id="text-other" type="text" placeholder="other"> 
    dapibus nisi. Sed condimentum sodales nibh, nec consequat velit.
</p>

CSS

input 
    background-color: #eaeaea;
    border: none;
    text-align: center;
    width: 105px; /* base on 15 characters at 7px each */

jQuery

$('.user-input').each(function( index ) 

    $(this).on('keydown', function(e) 

        var $input = $(this);
        var len = $input.val().length;

        if ( len > 15 )  // 15 * 7px = 105px = width of input
            var width = len * 7; // 7px per character?        
            $input.css('width', width);     
                 

    );

);

jsFiddle:http://jsfiddle.net/369jwLt6/4/

【讨论】:

1+ .. 但我建议使用monospace 等字体,以便所有字符的宽度相同。目前,如果您输入一堆 w,输入将不够大。同样,如果您输入一堆 i,将会有额外的空格。您可能还需要考虑相对单位,例如 ems。 @JoshCrozier 确实如此。根据字体使用情况,此解决方案可能会有点“敏感”。需要 Tweeking。 谢谢@hungerstar——我最初的想法是以某种方式计算字符数,然后更新输入字段的宽度,非常感谢您解释如何完成【参考方案3】:

如果您希望这些值是可编辑的,最简单的方法是继续使用您已经在做的输入。为了使这些输入更好地与其余内容融合,您可以通过 CSS 轻松更改它们的样式。只需为输入分配一个类,然后在样式表中为其添加一些样式。

如果这些元素仅通过脚本进行更改,而不是由用户直接编辑(用户通过其他方式编辑这些值),您可以将它们替换为跨度(例如 &lt;span id="userName"&gt;&lt;/span&gt;)并设置他们的内容与$('#userName').text('Jim Smith');

【讨论】:

感谢@StefanoDalpiaz 的反馈——我仍然需要掌握 CSS 以利用您的建议,但您将输入分配给类的其他建议是有道理的。再次感谢

以上是关于<input type=text> 的 HTML 替代品,可以分配一个唯一的 ID 并与文本混合的主要内容,如果未能解决你的问题,请参考以下文章

<input type="text">文本输人框

如何动态创建 <input type="text"/>

值为 <input type="text"> 的单选按钮

使用 JQuery 检测对 <input type="text"> 的所有更改(立即)

如何给 input 中 type="text" 设置css

<input type=text> 的 HTML 替代品,可以分配一个唯一的 ID 并与文本混合