使用函数动态更新另一个函数的arguments对象

时间:2016-11-15 16:05:53

标签: javascript jquery

我使用一个简单的插件为我的模板添加一些功能:

$('.foo').ellipsis({
  lines: 3
});

我想用函数而不是数字来表示要显示的行数:

$('.foo').ellipsis({
  lines: function() { return 3 }
});

由于某种原因,这不起作用。我很确定这不是插件故障,而是我对其工作方式的误解。有什么想法吗?

codepen位于:

http://codepen.io/Deka87/pen/qqNzZb

4 个答案:

答案 0 :(得分:2)

要使代码生效,必须构建插件以接受函数作为lines属性的值。从源代码中,我注意到lines的唯一有效值是字符串"auto"或数值。

你需要做这样的事情:

$('.foo').each(function() {
   $(this).ellipsis({ lines: $(this).data('truncate-lines') });
});

如果您想修改插件以支持您的代码,请在init()中添加以下代码作为第一行代码:

if(typeof base.opts.lines === 'function') {
   base.opts.lines = base.opts.lines.call(el);
}

答案 1 :(得分:1)

jquery.elipsis的文档并不表示插件支持传递到lines参数的函数,源代码也没有。

一个选项是执行该函数并传入返回的值。但是,由于该函数立即执行,因此与初始方法相比几乎没有什么好处:

$('.foo').ellipsis({
  lines: (function() { return 3 })()
});

答案 2 :(得分:0)

简单的方法是在页面加载时调用省略号。

// page load
// get data attribute
var ellipsis = $('elem').attr('truncate-lines')
// call the plugin
$('.foo').ellipsis({
    lines: par``seInt(ellipsis, 10)  
});

答案 3 :(得分:0)

您可以尝试制作您传递的对象,以便线条是吸气剂..

此外,如果您想要更精细的控制,您可以查看Object.defineProperty



var obj = {};

obj.__defineGetter__('lines', function () { return 3; });

console.log('obj.lines = ' + obj.lines);

//$('.foo').ellipsis(obj);