我的客户强迫我使用一些脚本,他用在他以前的网站上,以缓慢和顺利地加载一篇文章的文本。脚本有效,但问题是格式化(<strong>)在某个地方丢失了,而不是三个不同的段落,我把它们放在一起了三次.
<article id="post-5" class="post-5 page type-page status-publish hentry" style="overflow: hidden; width: auto; height: 400px;">
<div class="col-6 column">
<p><strong>Je mi přes 40 a jsem žena.</strong></p>
<p><strong>Snažila jsem se zařadit, zmoudřet a mít klid. Nepodařilo se.</strong></p>
<p style="text-align: justify;">Teď se už předělávat nehodlám. A víte co? Strašně si to užívám. Prozkoumávám svou zběsilost v srdci, ženskou marnivost i potřebu mít věci pod kontrolou. Zjistila jsem, že svět je báječné místo k žití, že život není vždycky fér, ale c´est la vie, že být sexy neznamená být krásná, že být úspěšná, neznamená být chytrá, že když se člověk nebere smrtelně vážně, tak je to vlastně skvělá jízda a že můj “bucketlist” je zatraceně dlouhý. Také, že když se nám “povedou” děti, věříme na geny, ale když jsou děti svérázné a my čelíme neustále zvednutému obočí okolí a máme pocit selhání – je lepší nechat to být a doufat, že se dobré geny nakonec “proberou”, protože to jediné, na čem opravdu záleží, jsou hodnoty a důvěra v sebe i svět okolo nás, neopomíjet tu krásu a čistotu, která dětství provází, tu lásku, kterou jsme schopni získat i dávat a užít si čas, který nám byl dán. Svět je plný silných příběhů a skvělých lidí a já jsem se rozhodla, že v čase, který mi byl vyměřen, je chci potkávat, chci se jimi inspirovat a tuto inspiraci předávat dál.</p>
</div>
</article>Javascript
var header = $('.post-5 div p');
var title = header.text();
header.text('');
var arrayTitle = title.split('');
var i = 0;
var interval = setInterval(function(){
if (i > arrayTitle.length) {
setTimeout(function(title) {
header.text(title);
}, 1000, title);
//header.text(title);
clearInterval(interval);
} else {
$('<span>')
.text(arrayTitle[i])
.appendTo(header)
.hide()
.fadeIn(1000);
i++;
}
}, 30);在这里,您使用科德芬,您可以看到它对文本的作用。我非常感谢你的帮助。
发布于 2015-03-13 20:31:23
(...)问题是格式化(
<strong>)在某处丢失了(.)
.text()方法不带标记返回元素(及其后代)的纯文本。
要获取包含标记的文本,jQuery有一个.html()方法。但是,这也不适用于您的代码(除非使用正则表达式)。这是因为你要把文字炸成单个字符:
var arrayTitle = title.split('');然后所有的字符都被加入到<span>中
$('<span>')
.text(arrayTitle[i])
//...因此,即使在标签未被清除的情况下使用.html(),标记的每个字符也将被包装到<span>元素中,以便其结果如下(<strong>):
<span><</span>
<span>s</span>
<span>t</span>
<span>r</span>
<span>o</span>
<span>n</span>
<span>g</span>
<span>></span>
...(...)我把三个不同的段落连在一起了三次
这是这些线条的结果:
var header = $('.post-5 div p');
var title = header.text();实际发生的事情是,header指向一个包含所有<p>元素的对象。
title是从该对象中的所有元素中提取的文本。
因此,header中的每个项(每个<p>)都会被所有三个<p>元素的文本填充。
解决方案
您需要循环遍历<p>元素来分别处理它们:
$('.post-5 div p').each(function(){
// $(this) points to the current <p> element instead of all:
var header = $(this);
// ...
});如果代码只使用严格指定的标记的,这可能会使您更加接近。
然后可以使用if语句检查一些条件并运行原始代码:
// declare current timeout variable:
var delay = 0;
$('.post-5 div p').each(function(){
// declare <strong> element as current 'header':
var header = $(this).find('strong');
// if it's not found:
if(!header.length){
// declare <p> instead as current 'header':
header = $(this);
}
// ... your code ...
// Then wrap your setInterval with a setTimeout to not fade each <p> at once:
setTimeout(function(){
var interval = setInterval(function(){
// ... your code ...
}, 30);
// set timeout on which the current 'header' should start fading:
},delay);
// update delay for the next <p> element:
delay += 30*arrayTitle.length;
});考虑到使用静态HTML标记,这是对代码的快速修正。
附加方式 (清洁剂)
另一种解决办法
为了使代码与具有多个嵌套标记的内容一起工作,首先您应该分离文本和元素,以使标记保持完整。
它可以使用.contents() (jQuery)和nodeType (javascript)完成。
.contents()返回一个子元素数组,对于该示例:
Hello <b>World</b> <span>Foo Bar</span>其结果将是:
nodeType:3 | nodeType:1 | nodeType:3 | nodeType:1
[Hello ] | [World] | [ ] | [Foo Bar]然后,您可以循环遍历该数组并将字符包装到<span>中,除非nodeType === 3,否则再次运行该节点的函数:
function spanifyText(el){
$(el).contents().each(function(){
// check if the element is not a text node:
if(this.nodeType !== 3){
// not a text node, run method again for that element:
return spanifyText(this);
}
// it's a text node. Process it:
$(this).replaceWith('<span class="fade">'+$(this).text().split('').join('</span><span class="fade">')+'</span>');
});
}
spanifyText('.post-5 div p');
// after processing, hide each character and fade it:
$('.fade').hide().each(function(i){
$(this).delay(i*30).fadeIn(function(){
// unwrap the character after animation, so that it is no longer inside a <span>:
$(this).contents().unwrap();
});
});演示
参考文献
.each().text().html().delay().unwrap().contents().replaceWith()nodeType发布于 2015-03-13 14:30:30
.text()捕获的是文本,而不是html。使用.html()
$('.post-5 div p');给出了三个结果,而不仅仅是一个。
如果要使用相同的效果,则必须完全修改脚本。
https://stackoverflow.com/questions/29034662
复制相似问题