【问题标题】:javascript text appendjavascript文本追加
【发布时间】:2011-12-14 23:42:16
【问题描述】:

我不知道如何描述,但我相信如果您访问此链接,您就会明白。 http://jsfiddle.net/pahnin/yN3xf/

我想用 javascript 将文本附加到 p 元素并且我成功了,但是如果文本包含像 <font> 这样的标签,则标签会按原样显示。

我应该添加代码来检测 html 元素还是可以通过其他方式完成? 如果我确实添加了检测字体标签的代码,如何将标签添加回文本??

【问题讨论】:

  • 不要使用font,使用span
  • 如果你简单地追加它就可以了:jsfiddle.net/yN3xf/2
  • 我的意图是在一段时间后附加每个字母

标签: javascript jquery append


【解决方案1】:

您可以简单地将var textcopied = $('.welcome').html(); 替换为var textcopied = $('.welcome').text(); 以提取不包含任何HTML 标记的文本。但是,当然,你根本不会拿回你的标签。

更新:一种稍微不同的方法是使用 jQuery 动画将整个标题平滑地滑动到视图中:

$(document).ready(function(){
    var $title = $('.welcome');
    var twidth = $title.width();
    var theight = $title.height();
    $title.css({
        overflow: 'hidden',
        width: 0,
        whiteSpace: 'nowrap',
        height: theight
    }).animate({
        width: twidth 
    }, 5000); // milliseconds
});

http://jsfiddle.net/mblase75/yN3xf/16/

【讨论】:

  • 这就是我的基本问题
  • 更大的问题是.append 只允许有效的HTML。就您的代码而言,唯一要做的就是以某种方式提前提取 HTML,并在您再次附加它时将其包裹在 每个字符 周围。基本上,在我看来,你的整个方法都是无效的。
  • @pahnin 尝试改用 jQuery .animate -- 更新了我的答案。
  • 仍然是guanome的方法更好,我认为它是我正在寻找的,我说我需要在一定的时间间隔后追加,动画修复整个文本的时间段,这意味着如果我有更大的文本我有更快的动画。对不起。
  • @pahnin 您还可以计算.text() 的长度并将其乘以某个常数以获得您的时间间隔。 jsfiddle.net/mblase75/yN3xf/18
【解决方案2】:

尝试替换:

$('.welcome').append(textcopied.charAt(i));

与:

textHTML += textcopied.charAt(i);
$('.welcome').html(textHTML);

在代码的开头,写上:

var textHTML  = '';

它有效,但看起来不太好:P

【讨论】:

  • 我的意图是在一段时间后附加每个字母
【解决方案3】:

你可以做这样的事情。写出所有文本后,将welcome 的整个html 替换为原始文本。我承认这不是最好的。

http://jsfiddle.net/yN3xf/13/

$(document).ready(function() {
    var htmlcopied = $('.welcome').html();
    var textcopied = $('.welcome').text();
    $('.welcome').text('');

    function foobar(i) {
        if (i < textcopied.length) {
            $('.welcome').append(textcopied.charAt(i));
            setTimeout(function() {
                foobar(i + 1);
            }, 80);
        }
        else {
            $('.welcome').html(htmlcopied);
        }
    }
    foobar(0);
});



更新

这应该通过不同的方式为您提供所需的效果。它在原始文本之上有一个 div,它缓慢地显示文本,看起来像是在输入。

示例

http://jsfiddle.net/guanome/LrbVy/

html

<div class="welcome">Hi, there <span class="hl">special text</span>, normal text
    <div class="overlay"></div>
</div>

javascript

$(document).ready(function() {
    $('.overlay').css('width', $('div.welcome').css('width'));
    $('.overlay').css('height', $('div.welcome').css('height') + 15);
    var origWidth = $('.overlay').css('width').replace(/px/g,'');
    foobar(origWidth);
});

function foobar(i) {
    if (i > -10) {
        $('.overlay').css('width', i);
        setTimeout(function() {
            foobar(i - 10);
        }, 80);
    }
}

css

.hl{
    color: red;     font-family: helvetica; 
    background: #efefef; 
    color: black; 
    padding: 2px 7px; 
    -moz-box-shadow: 0 1px 1px #CCCCCC; 
    -webkit-box-shadow: 0 1px 1px #CCCCCC; 
    box-shadow: 0 1px 1px #CCCCCC;

}
div.welcome
{
    position: relative;
    width: 500px;
}
.overlay
{
    position: absolute;
    right: 0;
    top: -3px;
    width: 100%;
    height: 25px;
    background-color: #FFF;
    z-index: 10;
}

更新 2

通过此更改,覆盖将动态添加到欢迎消息中,无需设置宽度,并且可以轻松处理多行。

http://jsfiddle.net/guanome/LrbVy/4/

html

<div class="welcome">Hi, there <span class="hl">special text</span>, normal text</div>

javascript

$(document).ready(function() {
    showWelcome();
});

function foobar(i, overlay) {
    if (i > -10) {
        overlay.css('width', i);
        setTimeout(function() {
            foobar(i - 10, overlay);
        }, 80);
    }
    else {
        overlay.remove();
    }
}

function showWelcome() {
    var welcome = $('div.welcome');
    welcome.append('<div class="overlay"></div>');
    welcome.css('position', 'relative');
    var overlay = $('.overlay');

    overlay.css({
        'width': welcome.css('width'),
        'height': (welcome.outerHeight() + 5),
        'position': 'absolute',
        'right': '0',
        'top': '-3px',
        'background-color': '#FFF',
        'z-index': '10'
    });
    var origWidth = overlay.css('width').replace(/px/g, '');
    foobar(origWidth, overlay);
}

【讨论】:

  • 这就是答案,Thnx,好主意!
  • @pahnin 我更新了我的答案,我想这就是你要找的。​​span>
  • +1。这是一个好主意,但只能在一行中使用,并且需要事先知道滑动 div 的长度。请参阅my suggestion 以获得更灵活(并且可以改进,实际上我不知道 JQuery)的方法。
  • @XaviLópez 不必知道宽度,它可以与多行一起使用,只需进行一些更改。 jsfiddle.net/guanome/LrbVy/3
【解决方案4】:

您还可以通过遍历根元素的contents() 并逐个输出每个子节点来实现此目的。

在处理每一个contents元素时,如果是文本节点,输出所有字符超时就足够了。如果它不是文本节点,则克隆该节点并将其附加到目标元素。里面的所有字符都可以以相同的方式附加。

在这里查看它的工作原理:http://jsfiddle.net/yN3xf/36/

$(document).ready(function(){

    var $clonedContent = $('.welcome').clone();
    $('.welcome').textContent = '';
    $('.welcome').text('');

    treatContents(0, $clonedContent, $('.welcome'));

    function treatContents(num, container, target){
        var $originalNode = container.contents()[num];
        var $targetNode;
        if ($originalNode.nodeType == 3){
            $targetNode = target;
        }
        else{
            $targetNode = $(container.contents()[num]).clone(false, false).appendTo(target);
            $targetNode.text('');
        }
        $targetNode.textContent = '';
        writeCharacters($originalNode.textContent , 0, $targetNode, num, container, target);
    }

    function writeCharacters(origText, x, target, contNum, contCont, contTarg) {
        if(x<origText.length){
           target.append(origText.charAt(x));
            setTimeout(function() { writeCharacters(origText, x+1, target, contNum, contCont, contTarg); }, 80);
        }
        else{
            treatContents(contNum+1, contCont, contTarg);
        }
    }
});

此示例可以调整为允许嵌套标签,例如:

<p class="welcome">Hi, there <b>bold text <i>bold italic text</i></b>, normal text</p>

【讨论】:

  • 这也很好,虽然我不想阅读棘手的代码,但我喜欢这个,因为我可以在任何地方使用它,我只需要为我的 p 标签添加一个类,除非 guanome 方法的更新版本
  • $originalNodeI added a check 的最后一次迭代中抛出异常,因为 $originalNode 未定义,已修复。
  • 感谢@guanome 的修复,我知道如果没有更多的孩子,treatContents(contNum+1, ... 会发生不好的事情。
  • +1 以获得更好的多行支持。我的会同时显示所有行,你的会一次显示一行,很好。
  • @guanome 好吧,这可能是一个错误或一个功能,这取决于它的预期用途;-) jsfiddle.net/yN3xf/37
猜你喜欢
  • 2011-09-29
  • 2011-09-20
  • 2018-03-17
  • 1970-01-01
  • 2020-12-05
  • 2020-07-15
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多