设置丢失
 上的插入符号位置按 T​​AB 键时的元素

发布于 2024-10-18 17:58:36 字数 524 浏览 4 评论 0原文

我的网页上有 precontentEditable="true",当我按 时,我试图让它附加 "\t" >。我找到了一些其他插件,但它们仅适用于

所以,问题是,当我通过 jQuery 将文本附加到

 时,它会丢失插入符号位置。我确信它正在失去焦点,但事实并非如此。所以 $("pre").focus() 不会执行任何操作。

我首先尝试对其进行模糊处理,但这并不实际,因为插入符号将根据浏览器返回到不同的位置。请提供一些帮助...:P,

我的代码在这里: http://jsfiddle.net/parisk/kPRpj/

I have pre with contentEditable="true" on my webpage and I am trying to make it append "\t" when I press <TAB>. I found some other plugins for that but they were working only on <textarea>.

So, the problem is that when I append text to the <pre> through jQuery, it loses the caret position. I was sure it was losing focus but it's not. So $("pre").focus(), will do nothing.

I tried to blur it first but this is not practical cause the caret will return on different position depending on the browser. some help please... :P,

My code is here: http://jsfiddle.net/parisk/kPRpj/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

暖风昔人 2024-10-25 17:58:36

尝试使用 document.execCommand 代替。 这是一个演示。简而言之:

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        document.execCommand('InsertHTML', false, '\t');
    }
});

Try using document.execCommand instead. Here’s a demo. In short:

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        document.execCommand('InsertHTML', false, '\t');
    }
});
自在安然 2024-10-25 17:58:36

首先尝试

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        $("pre").append("\t");   
    }
});

插入一个选项卡。它会在你的光标后面插入一个制表符

chrome 中

var myselection = document.getSelection();
myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
myselection.collapseToEnd();

,然后在 IE8 的

var myselection = document.selection;
myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
myselection.collapseToEnd();

应该在最后得到插入符。

(一起)

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        $("pre").append("\t"); 

        var myselection = null;
        if(document.getSelection)
        {
            myselection = document.getSelection();
        }
        else if (document.selection)
        {
            myselection = document.selection;
        }

        if(myselection != null)
        {
            myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
            myselection.collapseToEnd();
         }
    }
});

编辑
添加一个测试来查看 lastChild 是否为 null 等也会更安全。另外,在 keydown 函数中,如果您多次使用,则 jQuery("pre") 最好是 jQuery(this) 并放入变量中。 (这个例子就是但我太懒了)

firstly Try

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        $("pre").append("\t");   
    }
});

for inserting a tab. it will insert a tab after your cursor

then in chrome

var myselection = document.getSelection();
myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
myselection.collapseToEnd();

in IE8

var myselection = document.selection;
myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
myselection.collapseToEnd();

should get you caret at the end.

(all together)

$("pre").keydown(function(e){
    if (e.keyCode==9) {
        e.preventDefault();
        $("pre").append("\t"); 

        var myselection = null;
        if(document.getSelection)
        {
            myselection = document.getSelection();
        }
        else if (document.selection)
        {
            myselection = document.selection;
        }

        if(myselection != null)
        {
            myselection.extend(jQuery("pre")[0].lastChild, jQuery("pre")[0].lastChild.length)
            myselection.collapseToEnd();
         }
    }
});

EDIT
it would also be safer to add in a test to see if the lastChild is null and other such. Also in the keydown function jQuery("pre") would be better to be jQuery(this) and put into a variable if you are using more than once. (which the example is but I'm too lazy)

单身狗的梦 2024-10-25 17:58:36

仅针对您的问题,jquery caret 库非常擅长封装不同浏览器(即 IE)的怪癖: http://plugins.jquery.com/plugin-tags/caret

您始终可以使用它来获取所有选项卡位置的索引,然后稍后清理它们...

To only your question, the jquery caret libraries are pretty good at encapsulating the quirks around the different browsers (namely IE): http://plugins.jquery.com/plugin-tags/caret

You could always just use this to get an index of all the tab positions and then clean them later...

红衣飘飘貌似仙 2024-10-25 17:58:36

James Khoury 的答案总是将插入符号放在

 的末尾,当用户点击文本中间的 tab 时,这是不希望的。

这是修复此问题的修改版本:http://jsfiddle.net/kPRpj/12/
tab 缩进该行而不是在插入符位置添加 tab 字符应该是相当简单的。为此,您可以替换

container.textContent = text.substring(0,start)+'\t'+text.substring(end);

var left = text.substring(0,start);
var lastLine = left.lastIndexOf("\n");
if (lastLine == -1) lastLine = 0;
container.textContent = left.substring(0,lastLine)+'\t'+text.substring(lastLine);

I've put a version 在 jsfiddle 上以这种方式运行。但是,您可能需要解决 '\n\r' 管理中的一些不一致问题。例如,我看到 chromium 将每一行视为一个单独的文本节点,这是相当意外的。我没有在其他浏览器中测试过。

James Khoury's answer always puts the caret at the end of the <pre>, which is not desirable when the user hits tab in the middle of the text.

Here is a modified version tha fixes this issue : http://jsfiddle.net/kPRpj/12/.
It should be fairly trivial to make tab indent the line instead of adding a tab character at the caret position. To do that, you would replace

container.textContent = text.substring(0,start)+'\t'+text.substring(end);

with

var left = text.substring(0,start);
var lastLine = left.lastIndexOf("\n");
if (lastLine == -1) lastLine = 0;
container.textContent = left.substring(0,lastLine)+'\t'+text.substring(lastLine);

I've put a version that behaves this way on jsfiddle. However you might need to work around some inconsistencies in their management of '\n\r'. For example, I see that chromium sees each line as a separate text node, which is rather unexpected. I haven't tested it in other browsers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文