2017-01-03 2 views
0

Функция jQuery's .append() может принимать несколько аргументов, как плоских, так и массивных. У меня есть некоторый код, где нужно добавить 3 пунктов, один из которых не может существовать, как:Есть ли способ передать «отсутствующий» объект в .append()

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

но это некрасиво (особенно, как это является частью более крупной цепи).

И я мог экспериментировать с разными значениями, пока не найду тот, который «работает», но я надеялся, что существует «официальный» документированный способ, который не будет работать в будущем, потому что я использовал " недокументированная функция ".

Направьте меня в правильном направлении?

[EDIT]

мне было интересно, в общем, но конкретный пример передо мной:

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

Что произойдет, если вы это проверить? – Mouser

+0

Не могли бы мы увидеть больше вашей логики. Почему переменные имеют значение null/empty? –

+1

тестирование может найти способ, который «работает», но он не скажет мне, есть ли поддерживаемый способ, который не нарушит таинственности в будущем. –

ответ

3

Как насчет

whatever.append([always, maybe, alwaysToo].filter(item => !!item)); 
+0

Это выглядит многообещающе. –

1

Вот что происходит в Код jQuery (версия, которую я использую в любом случае). Обратите внимание, что это определяет, что «работает» сегодня, а не то, что документировано для работы и продолжит работу в будущем.

.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, все из них (в настоящее время) делать "правильно":

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

Но, насколько я могу найти, в документации нет утверждений о значении или значениях, которые вы можете использовать, которые будут безопасно игнорироваться (сейчас и навсегда).

Таким образом, самый безопасный курс действий (по крайней мере там, где => поддерживается) это ответ от Assan:

whatever.append([bas, ttl, lnk].filter(e => !!e)); 
Смежные вопросы