在文本区域中的光标位置显示 DIV [重复]

2024-03-09

对于我的一个项目,我很乐意为特定文本区域提供自动完成功能。类似于智能感知/全能的工作原理。然而,为此我必须找出绝对光标位置,以便我知道 DIV 应该出现在哪里。

事实证明:(我几乎希望)这是不可能实现的。有人有一些解决这个问题的好主意吗?


我的 Hacky 实验的版本 2

这个新版本适用于任何字体(可以根据需要进行调整)和任何文本区域大小。

在注意到你们中的一些人仍在尝试使其发挥作用后,我决定尝试一种新方法。这次我的结果要好得多 - 至少在 Linux 上的 google chrome 上是这样。我不再有可用的 Windows PC,所以我只能在 Ubuntu 上的 chrome/firefox 上进行测试。我的结果在 Chrome 上 100% 一致,假设在 Firefox 上大约 70 - 80%,但我不认为找到不一致的地方会非常困难。

这个新版本依赖于 Canvas 对象。在我的example http://enobrev.info/cursor2/,我实际上展示了那个画布 - 只是为了让您可以看到它的运行情况,但它可以很容易地使用隐藏的画布对象来完成。

这肯定是一个黑客攻击,我提前为我的代码而道歉。至少,在谷歌浏览器中,无论我将其设置为什么字体或文本区域的大小,它都能一致地工作。我用了萨姆·萨弗伦 https://stackoverflow.com/users/17174/sam-saffron的示例显示光标坐标(灰色背景 div)。我还添加了一个“随机化”链接,这样您就可以看到它在不同的字体/texarea 大小和样式下工作,并实时观看光标位置更新。我建议看看整页演示 http://enobrev.info/cursor2/这样您就可以更好地看到同伴画布一起玩。

我将总结一下它是如何工作的...

基本思想是我们试图尽可能地在画布上重新绘制文本区域。由于浏览器对 texarea 和 texarea 使用相同的字体引擎,因此我们可以使用 canvas 的字体测量功能来找出事物的位置。从那里,我们可以使用可用的画布方法来计算坐标。

首先也是最重要的,我们调整画布以匹配文本区域的尺寸。这完全是为了视觉目的,因为画布大小并不会真正影响我们的结果。由于 Canvas 实际上并不提供自动换行的方法,因此我不得不想出(一起窃取/借用/咀嚼)一种分解行的方法,以尽可能与文本区域匹配。您可能会发现您需要进行最多的跨浏览器调整。

自动换行之后,其他一切都是基础数学。我们将这些行分成一个数组来模拟自动换行,现在我们想要循环这些行并一直向下,直到当前选择结束的点。为了做到这一点,我们只是计算字符,一旦超过selection.end,我们知道我们已经走得够远了。将直到该点的行数乘以行高,就得到了y协调。

The x坐标非常相似,除了我们使用context.measureText。只要我们打印出正确数量的字符,这将为我们提供绘制到 Canvas 的线条的宽度,该线条恰好在写出的最后一个字符(即当前字符之前的字符)之后结束。selection.end位置。

当尝试为其他浏览器调试此内容时,要查找的是行没有正确中断的地方。您会在某些地方看到画布中一行的最后一个单词可能已经覆盖在文本区域上,反之亦然。这与浏览器处理自动换行的方式有关。只要画布中的换行与文本区域相匹配,您的光标就应该是正确的。

我将在下面粘贴源。您应该能够复制并粘贴它,但如果您这样做,我要求您下载自己的 jquery-fieldselection 副本,而不是点击我服务器上的副本。

我也升了一个新的演示 http://enobrev.info/cursor2/a fiddle http://jsfiddle.net/9QAtz/.

祝你好运!

<!DOCTYPE html>
<html lang="en-US">
    <head>
        <meta charset="utf-8" />
        <title>Tooltip 2</title>
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script type="text/javascript" src="http://enobrev.info/cursor/js/jquery-fieldselection.js"></script>
        <style type="text/css">
            form {
                float: left;
                margin: 20px;
            }

            #textariffic {
                height: 400px;
                width: 300px;
                font-size: 12px;
                font-family: 'Arial';
                line-height: 12px;
            }

            #tip {
                width:5px;
                height:30px;
                background-color: #777;
                position: absolute;
                z-index:10000
            }

            #mock-text {
                float: left;
                margin: 20px;
                border: 1px inset #ccc;
            }

            /* way the hell off screen */
            .scrollbar-measure {
                width: 100px;
                height: 100px;
                overflow: scroll;
                position: absolute;
                top: -9999px;
            }

            #randomize {
                float: left;
                display: block;
            }
        </style>
        <script type="text/javascript">
            var oCanvas;
            var oTextArea;
            var $oTextArea;
            var iScrollWidth;

            $(function() {
                iScrollWidth = scrollMeasure();
                oCanvas      = document.getElementById('mock-text');
                oTextArea    = document.getElementById('textariffic');
                $oTextArea   = $(oTextArea);

                $oTextArea
                        .keyup(update)
                        .mouseup(update)
                        .scroll(update);

                $('#randomize').bind('click', randomize);

                update();
            });

            function randomize() {
                var aFonts      = ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Impact', 'Times New Roman', 'Verdana', 'Webdings'];
                var iFont       = Math.floor(Math.random() * aFonts.length);
                var iWidth      = Math.floor(Math.random() * 500) + 300;
                var iHeight     = Math.floor(Math.random() * 500) + 300;
                var iFontSize   = Math.floor(Math.random() * 18)  + 10;
                var iLineHeight = Math.floor(Math.random() * 18)  + 10;

                var oCSS = {
                    'font-family':  aFonts[iFont],
                    width:          iWidth + 'px',
                    height:         iHeight + 'px',
                    'font-size':    iFontSize + 'px',
                    'line-height':  iLineHeight + 'px'
                };

                console.log(oCSS);

                $oTextArea.css(oCSS);

                update();
                return false;
            }

            function showTip(x, y) {
                $('#tip').css({
                      left: x + 'px',
                      top: y + 'px'
                  });
            }

            // https://stackoverflow.com/a/11124580/14651
            // https://stackoverflow.com/a/3960916/14651

            function wordWrap(oContext, text, maxWidth) {
                var aSplit = text.split(' ');
                var aLines = [];
                var sLine  = "";

                // Split words by newlines
                var aWords = [];
                for (var i in aSplit) {
                    var aWord = aSplit[i].split('\n');
                    if (aWord.length > 1) {
                        for (var j in aWord) {
                            aWords.push(aWord[j]);
                            aWords.push("\n");
                        }

                        aWords.pop();
                    } else {
                        aWords.push(aSplit[i]);
                    }
                }

                while (aWords.length > 0) {
                    var sWord = aWords[0];
                    if (sWord == "\n") {
                        aLines.push(sLine);
                        aWords.shift();
                        sLine = "";
                    } else {
                        // Break up work longer than max width
                        var iItemWidth = oContext.measureText(sWord).width;
                        if (iItemWidth > maxWidth) {
                            var sContinuous = '';
                            var iWidth = 0;
                            while (iWidth <= maxWidth) {
                                var sNextLetter = sWord.substring(0, 1);
                                var iNextWidth  = oContext.measureText(sContinuous + sNextLetter).width;
                                if (iNextWidth <= maxWidth) {
                                    sContinuous += sNextLetter;
                                    sWord = sWord.substring(1);
                                }
                                iWidth = iNextWidth;
                            }
                            aWords.unshift(sContinuous);
                        }

                        // Extra space after word for mozilla and ie
                        var sWithSpace = (jQuery.browser.mozilla || jQuery.browser.msie) ? ' ' : '';
                        var iNewLineWidth = oContext.measureText(sLine + sWord + sWithSpace).width;
                        if (iNewLineWidth <= maxWidth) {  // word fits on current line to add it and carry on
                            sLine += aWords.shift() + " ";
                        } else {
                            aLines.push(sLine);
                            sLine = "";
                        }

                        if (aWords.length === 0) {
                            aLines.push(sLine);
                        }
                    }
                }
                return aLines;
            }

            // http://davidwalsh.name/detect-scrollbar-width
            function scrollMeasure() {
                // Create the measurement node
                var scrollDiv = document.createElement("div");
                scrollDiv.className = "scrollbar-measure";
                document.body.appendChild(scrollDiv);

                // Get the scrollbar width
                var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;

                // Delete the DIV
                document.body.removeChild(scrollDiv);

                return scrollbarWidth;
            }

            function update() {
                var oPosition  = $oTextArea.position();
                var sContent   = $oTextArea.val();
                var oSelection = $oTextArea.getSelection();

                oCanvas.width  = $oTextArea.width();
                oCanvas.height = $oTextArea.height();

                var oContext    = oCanvas.getContext("2d");
                var sFontSize   = $oTextArea.css('font-size');
                var sLineHeight = $oTextArea.css('line-height');
                var fontSize    = parseFloat(sFontSize.replace(/[^0-9.]/g, ''));
                var lineHeight  = parseFloat(sLineHeight.replace(/[^0-9.]/g, ''));
                var sFont       = [$oTextArea.css('font-weight'), sFontSize + '/' + sLineHeight, $oTextArea.css('font-family')].join(' ');

                var iSubtractScrollWidth = oTextArea.clientHeight < oTextArea.scrollHeight ? iScrollWidth : 0;

                oContext.save();
                oContext.clearRect(0, 0, oCanvas.width, oCanvas.height);
                oContext.font = sFont;
                var aLines = wordWrap(oContext, sContent, oCanvas.width - iSubtractScrollWidth);

                var x = 0;
                var y = 0;
                var iGoal = oSelection.end;
                aLines.forEach(function(sLine, i) {
                    if (iGoal > 0) {
                        oContext.fillText(sLine.substring(0, iGoal), 0, (i + 1) * lineHeight);

                        x = oContext.measureText(sLine.substring(0, iGoal + 1)).width;
                        y = i * lineHeight - oTextArea.scrollTop;

                        var iLineLength = sLine.length;
                        if (iLineLength == 0) {
                            iLineLength = 1;
                        }

                        iGoal -= iLineLength;
                    } else {
                        // after
                    }
                });
                oContext.restore();

                showTip(oPosition.left + x, oPosition.top + y);
            }

        </script>
    </head>
    <body>

        <a href="#" id="randomize">Randomize</a>

        <form id="tipper">
            <textarea id="textariffic">Aliquam urna. Nullam augue dolor, tincidunt condimentum, malesuada quis, ultrices at, arcu. Aliquam nunc pede, convallis auctor, sodales eget, aliquam eget, ligula. Proin nisi lacus, scelerisque nec, aliquam vel, dictum mattis, eros. Curabitur et neque. Fusce sollicitudin. Quisque at risus. Suspendisse potenti. Mauris nisi. Sed sed enim nec dui viverra congue. Phasellus velit sapien, porttitor vitae, blandit volutpat, interdum vel, enim. Cras sagittis bibendum neque. Proin eu est. Fusce arcu. Aliquam elit nisi, malesuada eget, dignissim sed, ultricies vel, purus. Maecenas accumsan diam id nisi.

Phasellus et nunc. Vivamus sem felis, dignissim non, lacinia id, accumsan quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed scelerisque nulla sit amet mi. Nulla consequat, elit vitae tempus vulputate, sem libero rhoncus leo, vulputate viverra nulla purus nec turpis. Nam turpis sem, tincidunt non, congue lobortis, fermentum a, ipsum. Nulla facilisi. Aenean facilisis. Maecenas a quam eu nibh lacinia ultricies. Morbi malesuada orci quis tellus.

Sed eu leo. Donec in turpis. Donec non neque nec ante tincidunt posuere. Pellentesque blandit. Ut vehicula vestibulum risus. Maecenas commodo placerat est. Integer massa nunc, luctus at, accumsan non, pulvinar sed, odio. Pellentesque eget libero iaculis dui iaculis vehicula. Curabitur quis nulla vel felis ullamcorper varius. Sed suscipit pulvinar lectus.</textarea>

        </form>

        <div id="tip"></div>

        <canvas id="mock-text"></canvas>
    </body>
</html>

Bug

我记得有一个错误。如果将光标放在一行的第一个字母之前,则会将“位置”显示为上一行的最后一个字母。这与 Selection.end 的工作方式有关。我认为查找该案例并相应地修复它应该不会太困难。


版本1

将其保留在此处,以便您可以看到进度,而无需深入研究编辑历史记录。

它并不完美,而且绝对是一个 hack,但我让它在 WinXP IE、FF、Safari、Chrome 和 Opera 上运行得很好。

据我所知,没有办法直接找出任何浏览器上光标的 x/y。这IE法 http://weblogs.asp.net/skillet/archive/2005/03/24/395838.aspx, 提及 https://stackoverflow.com/questions/128342/display-div-at-cursor-position-in-textarea#128461 by 亚当·贝莱尔 https://stackoverflow.com/users/21632/adam-bellaire很有趣,但不幸的是不能跨浏览器。我认为下一个最好的办法就是使用字符作为网格。

不幸的是,任何浏览器都没有内置字体度量信息,这意味着等宽字体是唯一具有一致度量的字体类型。此外,没有可靠的方法可以从字体高度计算出字体宽度。起初我尝试使用高度的百分比,效果很好。然后我改变了字体大小,一切都陷入困境。

我尝试了一种方法来计算字符宽度,即创建一个临时文本区域并不断添加字符,直到滚动高度(或滚动宽度)发生变化。这似乎是合理的,但大约在这条路的中间,我意识到我可以在文本区域上使用 cols 属性,并认为在这个考验中有足够的技巧来添加另一个。这意味着您无法通过 css 设置文本区域的宽度。您必须使用 cols 才能实现此目的。

我遇到的下一个问题是,即使您通过 css 设置字体,浏览器也会以不同的方式报告字体。当你没有设置字体时,mozilla 使用monospace默认情况下,IE 使用Courier New, Opera "Courier New"(带引号),Safari,'Lucida Grand'(带单引号)。当您将字体设置为monospace,mozilla 和 ie 接受你给他们的东西,Safari 的结果是-webkit-monospace和歌剧一起"Courier New".

现在我们初始化一些变量。确保在 css 中设置行高。 Firefox 报告了正确的行高,但 IE 报告“正常”,我没有打扰其他浏览器。我只是在 css 中设置了行高,就解决了差异。我还没有测试过使用 em 代替像素。字符高度只是字体大小。也许也应该在你的 CSS 中预先设置它。

另外,在我们开始放置角色之前,还有一项预设 - 这确实让我摸不着头脑。对于 ie 和 mozilla,texarea 字符是

现在我们将为每一行创建一个第一个字符位置的数组。我们循环遍历文本区域中的每个字符。如果它是换行符,我们会向行数组添加一个新位置。如果它是一个空格,我们会尝试弄清楚当前的“单词”是否适合我们所在的行,或者是否会被推到下一行。标点符号算作“单词”的一部分。我还没有测试过制表符,但有一行用于为制表符添加 4 个字符。

一旦我们有了行位置数组,我们就会循环并尝试找到光标所在的行。我们使用选择的“结束”作为光标。

x = (光标位置 - 光标行第一个字符位置) * 字符宽度

y = ((光标行 + 1) * 行高) - 滚动位置

我在用着jquery 1.2.6 http://docs.jquery.com/Downloading_jQuery, jquery-fieldselection http://laboratorium.0xab.cd/jquery/fieldselection/0.1.0/test.html, and jquery 维度 http://plugins.jquery.com/project/dimensions

演示:http://enobrev.info/cursor/ http://enobrev.info/cursor/

和代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Tooltip</title>
        <script type="text/javascript" src="js/jquery-1.2.6.js"></script>
        <script type="text/javascript" src="js/jquery-fieldselection.js"></script>
        <script type="text/javascript" src="js/jquery.dimensions.js"></script>
        <style type="text/css">
            form {
                margin: 20px auto;
                width: 500px;
            }

            #textariffic {
                height: 400px;
                font-size: 12px;
                font-family: monospace;
                line-height: 15px;
            }

            #tip {
                position: absolute;
                z-index: 2;
                padding: 20px;
                border: 1px solid #000;
                background-color: #FFF;
            }
        </style>
        <script type="text/javascript">
            $(function() {
                $('textarea')
                    .keyup(update)
                    .mouseup(update)
                    .scroll(update);
            });

            function showTip(x, y) {                
                y = y + $('#tip').height();

                $('#tip').css({
                    left: x + 'px',
                    top: y + 'px'
                });
            }

            function update() {
                var oPosition = $(this).position();
                var sContent = $(this).val();

                var bGTE = jQuery.browser.mozilla || jQuery.browser.msie;

                if ($(this).css('font-family') == 'monospace'           // mozilla
                ||  $(this).css('font-family') == '-webkit-monospace'   // Safari
                ||  $(this).css('font-family') == '"Courier New"') {    // Opera
                    var lineHeight   = $(this).css('line-height').replace(/[^0-9]/g, '');
                        lineHeight   = parseFloat(lineHeight);
                    var charsPerLine = this.cols;
                    var charWidth    = parseFloat($(this).innerWidth() / charsPerLine);


                    var iChar = 0;
                    var iLines = 1;
                    var sWord = '';

                    var oSelection = $(this).getSelection();
                    var aLetters = sContent.split("");
                    var aLines = [];

                    for (var w in aLetters) {
                        if (aLetters[w] == "\n") {
                            iChar = 0;
                            aLines.push(w);
                            sWord = '';
                        } else if (aLetters[w] == " ") {    
                            var wordLength = parseInt(sWord.length);


                            if ((bGTE && iChar + wordLength >= charsPerLine)
                            || (!bGTE && iChar + wordLength > charsPerLine)) {
                                iChar = wordLength + 1;
                                aLines.push(w - wordLength);
                            } else {                
                                iChar += wordLength + 1; // 1 more char for the space
                            }

                            sWord = '';
                        } else if (aLetters[w] == "\t") {
                            iChar += 4;
                        } else {
                            sWord += aLetters[w];     
                        }
                    }

                    var iLine = 1;
                    for(var i in aLines) {
                        if (oSelection.end < aLines[i]) {
                            iLine = parseInt(i) - 1;
                            break;
                        }
                    }

                    if (iLine > -1) {
                        var x = parseInt(oSelection.end - aLines[iLine]) * charWidth;
                    } else {
                        var x = parseInt(oSelection.end) * charWidth;
                    }
                    var y = (iLine + 1) * lineHeight - this.scrollTop; // below line

                    showTip(oPosition.left + x, oPosition.top + y);
                }
            }

        </script>
    </head>
    <body>
        <form id="tipper">
            <textarea id="textariffic" cols="50">
Aliquam urna. Nullam augue dolor, tincidunt condimentum, malesuada quis, ultrices at, arcu. Aliquam nunc pede, convallis auctor, sodales eget, aliquam eget, ligula. Proin nisi lacus, scelerisque nec, aliquam vel, dictum mattis, eros. Curabitur et neque. Fusce sollicitudin. Quisque at risus. Suspendisse potenti. Mauris nisi. Sed sed enim nec dui viverra congue. Phasellus velit sapien, porttitor vitae, blandit volutpat, interdum vel, enim. Cras sagittis bibendum neque. Proin eu est. Fusce arcu. Aliquam elit nisi, malesuada eget, dignissim sed, ultricies vel, purus. Maecenas accumsan diam id nisi.

Phasellus et nunc. Vivamus sem felis, dignissim non, lacinia id, accumsan quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed scelerisque nulla sit amet mi. Nulla consequat, elit vitae tempus vulputate, sem libero rhoncus leo, vulputate viverra nulla purus nec turpis. Nam turpis sem, tincidunt non, congue lobortis, fermentum a, ipsum. Nulla facilisi. Aenean facilisis. Maecenas a quam eu nibh lacinia ultricies. Morbi malesuada orci quis tellus.

Sed eu leo. Donec in turpis. Donec non neque nec ante tincidunt posuere. Pellentesque blandit. Ut vehicula vestibulum risus. Maecenas commodo placerat est. Integer massa nunc, luctus at, accumsan non, pulvinar sed, odio. Pellentesque eget libero iaculis dui iaculis vehicula. Curabitur quis nulla vel felis ullamcorper varius. Sed suscipit pulvinar lectus. 
            </textarea>

        </form>

        <p id="tip">Here I Am!!</p>
    </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在文本区域中的光标位置显示 DIV [重复] 的相关文章

  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 如果对象包含在另一个数组中,则从数组中删除该对象

    我试图从数组中删除一个对象 如果该对象的属性 唯一 包含在另一个数组中 我知道我可以像这样执行嵌套 for 循环 for i 0 i lt array length i for j 0 j lt array2 length j if arr
  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 淡出和循环一组 div 的最佳方式

    假设我有以下 div div class a You are funny div div class b You are smart div div class c You are cool div 最好的展示方式是什么div a持续 5
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐

  • 使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位

    我昨天了解到在 DelphiXE 中使用编译器指令 SetPEFlags IMAGE FILE LARGE ADDRESS AWARE 即使 DelphiXE 编译器生成 32 位代码 您也可以在 64 位计算机上访问 使用 4GB 地址空
  • 在 netbeans 7.0.1 中找不到 web.xml

    我想将文件上传到服务器 为此我正在编写一个 servlet 程序 上传文档的目录位置应从 web xml 中的参数获取 我以前没有使用过 web xml 只知道它为每个 servlet 生成条目 我无法在我在 netbeans 中制作的 W
  • SQLite 插入或替换位置

    我有一个包含 3 列的表 ID 描述和键 其中 ID 不是主键 我想要的是插入或更新 替换当前记录 例子 解密密钥 ID 描述 密钥 999 生日 1988 年 12 月 24 日 我尝试了这个 但它不起作用 INSERT OR REPLA
  • 如何从 JavaPairRDD 中选择前 N 个元素? -阿帕奇火花

    我已经获得了一个键 值对 并将其排序到一个新的JavaPairRDD中 现在 我需要从中选择前 5 个元素 即获取一个新的 JavaPairRDD 其中包含前 5 个元素 我该怎么做呢 有没有比使用 flatMap 更简单的方法 因为它似乎
  • 一起识别长按和平移手势识别器

    我有一个视图 其中添加了平移和长按 UIGestureRecognizer 平移用于移动视图 我想做的是还要注意触摸已停止移动 同时保持活动状态 并触发长按 我发现平底锅开始后长按永远不会被触发 我尝试设置委托并实施 BOOL gestur
  • 回显到标准输出并附加到文件

    我有这个 echo all done creating tables gt gt SUMAN DEBUG LOG PATH 但这应该只附加到文件 而不是写入标准输出 如何写入 stdout 并附加到同一 bash 行中的文件 像这样的东西吗
  • 在R中打印小数逗号而不是小数点

    我正在用 R 进行统计分析 我需要将结果粘贴到用法语编写的报告中 在法语中 浮点数是使用小数逗号而不是小数点来书写的 手动用逗号替换点有点乏味 1 我如何让 R 打印所有浮点数并用逗号分隔整数和小数部分 非常感谢 rmuc8 非常快速有效地
  • 在 Lucene 中正确索引纬度和经度值

    我正在使用 Lucene API 开发 给定半径内基于 美国的最近城市搜索 功能 我在 Lucene 中索引城市的纬度和经度值 如下所示 doc Add new Field latitude paddedLatitude Field Sto
  • Leveled Compaction 策略如何确保 90% 的读取来自一个 sstable

    我试图理解如何分级压实策略在 Cassandra 中 保证 90 的读取都可以通过单个 sstable 得到满足 来自 DataStax 文档 新的 sstables 添加到第一级 L0 并立即与 L1 中的 sstables 进行压缩 当
  • 为什么编译器选择 bool 而不是 string 来进行 L"" 的隐式类型转换?

    最近引入了方法的重载 应用程序开始失败 最终追踪到它 新方法正在我意想不到的地方被调用 We had setValue const std wstring name const std wstring value std wstring a
  • 以编程方式在 R 中查找股票代码

    我有一个包含公司名称的数据字段 例如 company lt c Microsoft Apple Cloudera Ford gt company Company 1 Microsoft 2 Apple 3 Cloudera 4 Ford 等
  • java.io.FileNotFoundException: com/google/inject/internal/util/$Finalizer.class 在 android 应用程序的开头

    我正在开发 Android 倒计时应用程序 在应用程序中 您可以根据需要添加或删除任意数量的倒计时 所有倒计时都保存在 ArrayList 中 我不能将它们保存在数据库或共享首选项中 因为即使您离开应用程序 倒计时也必须继续运行 我使用 r
  • 什么是密码哈希? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 哈希密码是什么意思 定义 Hashing http en wikipedia org wiki Hash function是函数的应用f
  • 如何在c#中的gecko webbrowser控件中隐藏滚动条

    我正在尝试隐藏 GeckoFx WebBrowser 控件的滚动条 在 Windows 窗体中有隐藏滚动条的方法 webBrowser1 ScrollBarsEnabled false 但在 GeckoFx Webbrowser 中没有这样
  • 在 C# 中使用目标配置时不允许 SAP 硬编码登录参数

    当我尝试动态连接到 SAP 服务器时 我收到如下错误 使用目标配置时不允许使用硬编码登录参数 任何人请帮助我 我需要从代码隐藏动态发送所有参数 而不是从 Web config 从 web config 工作正常 但不在这里 我的代码是这样的
  • 可以阻止 Uncrustify 修改代码的某些部分吗?

    Uncrustify 很棒 并且在整理代码方面做得非常出色 但是 我不想让 Uncrustify 更改文件中的一些 C 代码 有什么方法可以阻止 Uncrustify 触及这个问题 也许可以通过在代码周围的注释中添加特定标签或其他方式 IN
  • Postgres 中未终止的 CSV 引用字段

    我正在尝试使用复制命令将一些数据插入到我的表中 copy otype cstore from tmp otype fdw csv delimiter quote csv 我有这个答案 ERROR unterminated CSV quote
  • 如何从框架中获取页面实例?

    我有一个在 xaml 中初始化的框架 如下所示
  • Foundation Objective-c:带数组的字典;字典与字典

    假设我有一个 NSDictionary 其中包含 NSArray 和 NSDictionary 的两个子集合 NSMutableDictionary mkDict void NSMutableDictionary dict NSMutabl
  • 在文本区域中的光标位置显示 DIV [重复]

    这个问题在这里已经有答案了 对于我的一个项目 我很乐意为特定文本区域提供自动完成功能 类似于智能感知 全能的工作原理 然而 为此我必须找出绝对光标位置 以便我知道 DIV 应该出现在哪里 事实证明 我几乎希望 这是不可能实现的 有人有一些解