jQuery的.append()
函数可以采用多个参数,无论是平面还是数组。我有一些代码,我需要附加3个项目,其中一个可能不存在,如:
whatever.append(always).append(maybe).append(alwaysToo);
/* or */
whatever.append(always, maybe, alwaysToo);
/* or */
var arrayOfThoseThree = [ always, maybe, alwaysToo ];
whatever.append(arrayOfThoseThree);
我无法从jQuery文档中了解到maybe
的价值应该是什么,“只是忽略这个”:
maybe = '';
maybe = null;
maybe = undefined;
maybe = ???
如:
maybe = needMaybe ? $('<blah...>') : ignoreThisValue;
我当然可以这样做:
whatever.append(always);
if (maybe) whatever.append(maybe);
whatever.append(alwaysToo);
但是丑陋(特别是因为这是更大链条的一部分)。
我可以尝试不同的值,直到我找到一个“工作”,但我希望有一个“官方”记录的方式,将来不会失败,因为我正在使用“未记录的功能”。
指出我正确的方向?
[编辑]
我一般都在想,但我面前的具体例子是:
var titl = this.dataset.title; /* optional */
var ifr = $('<iframe>');
var bas = $('<base href="' + document.baseURI + '">');
var ttl = titl ? $('<title>' + titl + '</title>') : null; /* HERE */
var lnk = $('<link rel="stylesheet" href="/css/print.css">');
/* ... */
ifr.contents().find('head').append(bas, ttl, lnk);
答案 0 :(得分:3)
怎么样
{function_name, function_arity}
答案 1 :(得分:1)
这里是jQuery代码中发生的事情(版本I&#39; m无论如何都在使用)。 请注意,这定义了&#34; 的工作原理&#34;今天,没有记录的工作,并继续在未来工作。
.append()
函数与许多其他函数的编写方式类似,domManip()
执行大部分工作:
append: function() {
return this.domManip( arguments, function( elem ) {
if ( this.nodeType === 1 ||
this.nodeType === 11 ||
this.nodeType === 9 ) {
var target = manipulationTarget( this, elem );
target.appendChild( elem );
}
});
},
并且domManip()
做的第一件事是:
domManip: function( args, callback ) {
// Flatten any nested arrays
args = concat.apply( [], args );
然后调用buildFragment()
:
fragment = jQuery.buildFragment( args, ... );
确实:
buildFragment: function( elems, context, scripts, selection ) {
var /* ..., */ i = 0;
for ( ; i < l; i++ ) {
elem = elems[ i ];
if ( elem || elem === 0 ) {
/* ... process this argument ... */
}
}
所以空数组被Array.prototype.concat()
压扁,然后任何未通过测试( elem || elem === 0 )
的数据都会被忽略。
所以,事实上,当ttl
可能是null
时,所有这些( 当前 )都会执行&#34; 正确的事情&#34;:
whatever.append( bas, ttl, lnk);
whatever.append([bas, ttl, lnk]);
whatever.append([bas],[ttl], [lnk]);
whatever.append( bas, [ttl], lnk);
whatever.append(bas).append( ttl ).append(lnk);
whatever.append(bas).append([ttl]).append(lnk);
但是,尽管我可以找到,但文档中没有任何关于您可以使用的值的陈述,这些值将被安全地忽略(现在和将来)。
因此,最安全的行动方案(至少支持=>
)是阿桑的回答:
whatever.append( [bas, ttl, lnk].filter( e => !!e ) );