JavaScript - DIV的可见文本

时间:2012-05-05 18:33:18

标签: javascript overflow

----------------------------------------------------
| This is my text inside a div and I want the overf|low of the text to be cut
----------------------------------------------------

请注意我希望删除溢出,因此CSS省略号属性对我不起作用。所以基本上,我希望上面的文字看起来像这样:

----------------------------------------------------
| This is my text inside a div and I want the overf|
----------------------------------------------------

纯JavaScript如何实现这一目标?

修改

我需要一个JavaScript函数来裁剪文本,因为我需要计算可见文本的字符。

5 个答案:

答案 0 :(得分:6)

好的,我没有看到问题的附录。虽然我之前曾说过使用JavaScript和不是固定宽度的字体不可能做到这一点......实际上 是可能的!

您可以将每个角色包裹在<span>中,并找到超出父级边界的第一个<span>。类似的东西:

function countVisibleCharacters(element) {
    var text = element.firstChild.nodeValue;
    var r = 0;

    element.removeChild(element.firstChild);

    for(var i = 0; i < text.length; i++) {
        var newNode = document.createElement('span');
        newNode.appendChild(document.createTextNode(text.charAt(i)));
        element.appendChild(newNode);

        if(newNode.offsetLeft < element.offsetWidth) {
            r++;
        }
    }

    return r;
}

Here's a demo.

答案 1 :(得分:3)

您可以使用Javascript执行此操作。这是一个计算元素中可见字符数的函数,无论外部css表和应用于元素的内联样式如何。我只在Chrome中测试过,但我认为它是跨浏览器友好的:

function count_visible(el){
    var padding, em, numc;
    var text = el.firstChild.data;
    var max = el.clientWidth;

    var tmp = document.createElement('span');
    var node = document.createTextNode();
    tmp.appendChild(node);
    document.body.appendChild(tmp);

    if(getComputedStyle)
        tmp.style.cssText = getComputedStyle(el, null).cssText;
    else if(el.currentStyle)
        tmp.style.cssText = el.currentStyle.cssText;

    tmp.style.position = 'absolute';
    tmp.style.overflow = 'visible';
    tmp.style.width = 'auto';

    // Estimate number of characters that can fit.
    padding = tmp.style.padding;
    tmp.style.padding = '0';
    tmp.innerHTML = 'M';
    el.parentNode.appendChild(tmp);
    em = tmp.clientWidth;
    tmp.style.padding = padding;      
    numc = Math.floor(max/em);

    var width = tmp.clientWidth;

    // Only one of the following loops will iterate more than one time
    // Depending on if we overestimated or underestimated.

    // Add characters until we reach overflow width
    while(width < max && numc <= text.length){
        node.nodeValue = text.substring(0, ++numc);
        width = tmp.clientWidth;
    }

    // Remove characters until we no longer have overflow
    while(width > max && numc){
        node.nodeValue = text.substring(0, --numc);
        width = tmp.clientWidth;
    }

    // Remove temporary div
    document.body.removeChild(tmp);

    return numc;
}

JSFiddle Example

答案 2 :(得分:2)

试试这个,如果可以,你需要一个固定的宽度:http://jsfiddle.net/timrpeterson/qvZKw/20/

HTML:

<div class="col">This is my text inside a div and I want the overf|low of the text to be cut</div>

CSS:

.col { 
   width:120px; 
    overflow: hidden;
   white-space:nowrap;

 }​

答案 3 :(得分:2)

您正在尝试将CS​​S问题强制转换为JavaScript。把锤子拿走,拿出一把螺丝刀。 http://en.wiktionary.org/wiki/if_all_you_have_is_a_hammer,_everything_looks_like_a_nail

如果退后一步,解决字符数的答案可能无关紧要。最后一个字符可能只是部分可见,并且字体数量在字体大小变化,W和i之间的宽度差异等方面完全不同。可能div的宽度比真正问题中的字符数更重要。

如果您仍然坚持找出可见的字符,请在文本周围的div内放一个span,使用此问题的其他答案中提供的css,然后在JavaScript中一次修剪一个字符直到跨度的宽度小于div的宽度。然后观察每次你执行大段时你的浏览器会冻结几秒钟。

答案 4 :(得分:0)

.col { width:40px; overflow: hidden; white-space:nowrap; }

白色空间:nowrap;当内容有空格时需要。

无论哪种方式,单行中的长单词都不会出现。 http://jsfiddle.net/h6Bhb/