【问题标题】:Span tag inside contentEditable div needs keypress eventcontentEditable div 中的 Span 标签需要按键事件
【发布时间】:2011-04-03 13:36:59
【问题描述】:

我的 html 代码中有以下 div:

<div id="expanderInput" tabIndex="1" contentEditable></div>

我使用contentEditable div 作为一种简单的跨浏览器方法来制作自动扩展的文本框。我还在对用户输入此 div 的内容进行输入验证。它应该是用逗号分隔的电子邮件地址列表。当用户尝试提交不正确的信息时,我的 Javascript 将输入分块并以红色突出显示所有不正确的块。

//split the address into the comma-separated chunks
var chunks = splitForward(forwardsTo);

//Grab each bad chunk one at a time and stick it in a span with a red-colored text
for(var i = 0; i < invalids.length; i++)
{
    var current = chunks[invalids[i]];
    current = '<span class="highlighted">' + current + '</span>';
    chunks[invalids[i]] = current;
}
$("#expanderInput").html(chunks.join());
initHighlighted();

数组'invalids'保存所有坏块的索引。到目前为止一切正常。但是一旦用户开始在红色文本中输入,我需要红色消失,但就在那个范围内。例如,如果有两个坏块,每个都以红色突出显示,并且用户开始修复一个,则另一个需要保持红色。

我尝试将事件侦听器附加到跨度:

initHighlighted = function()
{
    $(".highlighted").keypress(function()
    {
        alert("It works!");
    });
};

但该事件永远不会发生,即使用户编辑红色文本也是如此。使用浏览器的开发人员工具,我可以看到事件处理程序就在那里,它只是永远不会被触发。是否是 div 上的 contentEditable 属性导致跨度接收事件?我也尝试过自己制作跨度contentEditable,但行为仍然相同。

【问题讨论】:

    标签: javascript html dom-events keypress contenteditable


    【解决方案1】:

    除非我弄错了,否则这应该可以解决您的问题:

    initHighlighted = function()
    {
        $(".highlighted").live("keypress",function()
        {
            alert("It works!");
        });
    };
    

    因为您的跨度是在初始加载 DOM 之后添加的,所以没有附加按键事件侦听器,因为没有任何东西可以附加它们。 Jquery 的 live 通过将这些侦听器附加到(在这种情况下)任何具有“突出显示”类的东西,无论它们何时被添加到 DOM,来为您解决这个问题。

    阅读 Jquery 网站上的文档以获得比我能给你更好的解释:http://api.jquery.com/live/

    编辑:我很抱歉没有正确阅读您的问题并意识到在添加“突出显示”跨度之后您正在附加按键监听器。

    你有没有读过这篇文章:

    Keyboard events for child elements in a contenteditable div?

    【讨论】:

    • 是的,我有一段时间想知道听众是否被依附,但它绝对是。我发现如果用户总是立即开始输入并且只有一个红色字段,那么使用 .focus() 会起作用。换句话说,这不是任何真正的解决方案。我跟着你的链接,它给了我最终使用的解决方案——只需使用选择 API 来获取我想要的节点。不是我想要的,但它最终完成了工作。我不知道当我搜索时我怎么没有找到那个。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多