【问题标题】:Any way to prevent losing focus when clicking an input text out of tinymce container?单击tinymce容器中的输入文本时,有什么方法可以防止失去焦点?
【发布时间】:2015-01-30 19:22:35
【问题描述】:

我制作了这个 tinymce fiddle 来展示我所说的话。

在编辑器中高亮文本,然后点击输入文本,tinyMCE 中的高亮丢失(显然)。

现在,我知道这并不容易,因为内联编辑器和输入文本都在同一个文档中,因此,焦点只有一个。但是,当我单击输入文本时,是否有任何 tinymce 方法可以像“未聚焦”突出显示(灰色)一样?

我这么说是因为我有一个自定义的颜色选择器,这个颜色选择器有一个输入,您可以在其中输入 HEX 值,当单击“确定”时,它会 execCommand 对所选文本进行颜色更改,但它看起来很难看,因为高光消失了。

我不想使用 iframe,我知道使用非内联编辑器 (iframe) 是一种解决方案,但由于某些原因,我不能使用 iframe 文本编辑器。

这里有什么建议吗?谢谢。

P.S:题外话,你们中的任何人都知道为什么我无法访问 tinyMCE Fiddle 中的 tinymce 对象吗?看起来 tinyMCE 全局变量已被页面本身的 tinymce 选择 dom 元素覆盖。我无法执行 tinyMCE 命令,哈哈。

【问题讨论】:

  • 复杂,但考虑捕获选择,然后在执行命令之前重新选择它。

标签: javascript jquery html iframe tinymce


【解决方案1】:

另一种解决方案:

http://fiddle.tinymce.com/sBeaab/5

P.S:题外话,有没有人知道为什么我不能访问 tinyMCE Fiddle 中的 tinymce 对象?看起来像 tinyMCE 全局 var 被页面的 tinymce 选择 dom 元素覆盖 本身。我无法执行 tinyMCE 命令,哈哈。

嗯,你可以访问 tinyMCE 变量,甚至可以执行命令。

【讨论】:

  • 这是一个非常好的解决方案,它使用 tinyMCE.get('textContainer') 而不是 tinyMCE.activeEditor 来使用 tiny 的记忆选择而不是脆弱的 dom 选择。
【解决方案2】:

这一行是错误的

var colorHex = document.getElementById("colorHex")

colorHex 包含输入元素,而不是值。

var colorHex = document.getElementById("colorHex").value

现在它可以工作了(neolist 无法加载,所以我删除了它)

http://fiddle.tinymce.com/DBeaab/1

【讨论】:

  • 谢谢你,但是,主要问题仍然是焦点:(我认为这是不可能的......除非我在输入或文本编辑器上使用 iframe......我搞砸了。跨度>
  • 你想通过焦点实现什么? - 我认为几乎每个 tinymce 问题都有解决方案
【解决方案3】:

我最近不得不做类似的事情。

首先,你不能同时“选择”两个不同的元素。因此,为了实现这一点,您将需要模仿浏览器的内置“选定文本突出显示”。为此,您必须在文本中插入 span 以模拟突出显示,然后捕获 mousedown 和 mouseup 事件。

这是来自 StackOverflow 用户“fullpipe”的小提琴,它说明了我使用的技术。

http://jsfiddle.net/fullpipe/DpP7w/light/

$(document).ready(function() {
        var keylist = "abcdefghijklmnopqrstuvwxyz123456789";

        function randWord(length) {

            var temp = '';

            for (var i=0; i < length; i++)

            temp += keylist.charAt(Math.floor(Math.random()*keylist.length));

        return temp;
    }

    for(var i = 0; i < 500; i++) {
        var len = Math.round(Math.random() * 5 + 3);
        document.body.innerHTML += '<span id="'+ i +'">' + randWord(len) + '</span> ';
    }

    var start = null;
    var end = null;

    $('body').on('mousedown', function(event) {
        start = null;
        end = null;
        $('span.s').removeClass('s');
        start = $(event.target);
        start.addClass('s');
    });

    $('body').on('mouseup', function(event) {
        end = $(event.target);
        end.addClass('s');
        if(start && end) {
            var between = getAllBetween(start,end);

            for(var i=0, len=between.length; i<len;i++)
                between[i].addClass('s');

            alert('You select ' + (len) + ' words');
        }
    });


});

function getAllBetween(firstEl,lastEl) {

    var firstIdx = $('span').index($(firstEl));
    var lastIdx = $('span').index($(lastEl));

    if(lastIdx == firstIdx)
        return [$(firstEl)];

    if(lastIdx > firstIdx) {
        var firstElement = $(firstEl);
        var lastElement = $(lastEl);
    } else {
        var lastElement = $(firstEl);
        var firstElement = $(lastEl);
    }

    var collection = new Array();
    collection.push(firstElement);
    firstElement.nextAll().each(function(){
        var siblingID  = $(this).attr("id");
        if (siblingID != $(lastElement).attr("id")) {
            collection.push($(this));
        } else { 
            return false;
        }
    });

    collection.push(lastElement);
    return collection;
}

正如您在小提琴中看到的那样,无论页面上其他地方的焦点如何,右窗格中的乱码都会保持突出显示。

此时,您将不得不将颜色更改应用于所有匹配的跨度。

【讨论】:

  • 看起来不错,但我需要在这里使用 tinyMCE,我首先认为我可以做类似的事情,但在我选择的文本中添加假高亮可能不是最好的 :( 我会试试看吧。
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多