1

我正在使用一项名为“嵌入”的服务来显示我的提要。我正在尝试缩短此提要的文本,所以我尝试了:

$('.description').html(
     function(){
         return $.trim($(this).html())
                .substring(0, 100)
                .split(" ").slice(0, -1)
                .join(" ") + "...";}
);

我把它放在准备好的文档中,也放在“window.load”中,但似乎没有任何效果。这是一个例子:http: //jsfiddle.net

4

3 回答 3

2

Jquery 的 HTML 不接受函数作为参数,而只接受纯 HTML(字符串)。做你想做的事,使用.each():)

更正:正如下面的评论者所指出的,我的代码是正确的,但 .html()确实接受了一个函数作为参数,形式为$(...).html(function(index, oldhtml));,从而可以直接访问 html 部分。(感谢@Raminson 指出)

在@Raminson 观察之前,我的代码是:

$('.description').each(
     function(i,e){
         $(e).html(reduce($(e).html()));}
);

function reduce(s)
{
         return s.substring(0, 100)
                .split(" ").slice(0, -1)
                .join(" ") + "...";
}

修正后,第一部分变为(仍在使用reduce()函数):

$(".description").html(function(i,s) { return reduce(s); });
于 2012-08-06T10:33:28.057 回答
2

这个花了我很长时间才弄清楚,但我认为你能做的最好的事情就是让元素一秒钟加载到 DOM 中,然后运行你的函数:http: //jsfiddle.net/2VBSX/5/

$('div.newscontainer').embedly({
    key:':e0a98aba95ef11e09dcd4040d3dc5c07'
}).hide();

setTimeout(function() {
    $('div.newscontainer').show().find('.description').html(
        function(){
            return $.trim($(this).html())
            .substring(0, 100)
            .split(" ").slice(0, -1)
            .join(" ") + "...";
        }
    );
}, 1000);
于 2012-08-06T11:54:30.050 回答
0

所以,我的另一个答案是无效的,因为 OP 没有提到所有元素都是动态创建的,所以它们不能以经典方式匹配。

如果修改附加到一个合适的事件(例如单击),那么使用代理将很容易.on(),因为它们对于插入 DOM 中的新元素也有效。但可惜情况并非如此,我们必须对元素的创建进行操作。

一种解决方案是@ChrisClower 的解决方案(一个定期轮询页面以获取新元素的计时器)。

另一种解决方案是使用 LiveQuery 插件:http ://docs.jquery.com/Plugins/livequery

那么一切都会很简单:

$(".description").livequery(function() {  $(e).html(reduce($(e).html())); });

 function reduce(s)
{
     return s.substring(0, 100)
            .split(" ").slice(0, -1)
            .join(" ") + "..."; 
}
于 2012-08-06T15:27:48.540 回答