有没有办法将'missing'对象传递给.append()

时间:2017-01-03 14:36:06

标签: javascript jquery

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);

2 个答案:

答案 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 ) );