Да, через DOM Manipulation:
function add() {
var tag = document.createElement('input'); // Create a `input` element,
tag.setAttribute('type', 'text'); // Set it's `type` attribute,
tag.setAttribute('name', i); // Set it's `name` attribute,
var br = document.createElement('br'); // Create a `br` element,
var y = document.getElementById("y"); // "Get" the `y` element,
y.appendChild(tag); // Append the input to `y`,
y.appendChild(br); // Append the br to `y`.
i++;
}
Это не вызывает парсер DOM браузера, как это делает innerHTML
, оставив все неповрежденным.
(innerHTML
заставляет браузер повторно анализировать всю DOM, потому что все может быть добавлено с помощью innerHTML
, поэтому браузер ничего не может предсказать, в отличие от добавления узла к элементу.)
Теперь, чтобы добавить это:
<li class="ie7fix" style="width:620px;">
<div class="m_elementwrapper" style="float:left;">
<label class="fieldlabel" style="width:106px;float:left;padding-top:3px;" for="p1f4">
<span>
<span class="pspan arial" style="text-align:right;font-size:14px;">
<span class="ispan" xml:space="preserve">
</span>
</span>
</span>
</label>
<div style="float:left;width:475px;" class="m_elementwrapper">
<input type="text" style="font-family:Arial, Helvetica, sans-serif;font-size:14px;width:244px;max-width:244px;" name="' + i + '" class="fieldcontent">
<div class="fielderror">
</div>
</div>
</div>
<div style="clear:both;font-size:0;">
</div>
</li>
Вам понадобится:
function add() {
// Create elements
var d1 = c('div'), s1 = c('span'), ip = c('input'),
d2 = c('div'), s2 = c('span'), li = c('li'),
d3 = c('div'), s3 = c('span'), la = c('label'),
d4 = c('div');
// You can "chain" `appendChild`.
// `li.appendChild(d1).appendChild(la);` is the same as `li.appendChild(d1); d1.appendChild(la);`
li.appendChild(d1).appendChild(la).appendChild(s1).appendChild(s2).appendChild(s3);
d1.appendChild(d2).appendChild(ip);
d2.appendChild(d3);
li.appendChild(d4);
setAttributes(
[li, d1, la, s2, s3, d2, ip, d3, d4],
[
{'class':"ie7fix", 'style':"width:620px;" },
{'class':"m_elementwrapper", 'style':"float:left;" },
{'class':"fieldlabel", 'style':"width:106px;float:left;padding-top:3px;", 'for':"p1f4" },
{'class':"pspan arial", 'style':"text-align:right;font-size:14px;" },
{'class':"ispan", 'xml:space':"preserve" },
{'class':"m_elementwrapper", 'style':"float:left;width:475px;" },
{'class':"fieldcontent", 'type':"text", 'style':"font-family:Arial, Helvetica, sans-serif;font-size:14px;width:244px;max-width:244px;", 'name':''+i},
{'class':"fielderror" },
{'style':"clear:both;font-size:0;" }
]
);
var br = document.createElement('br'); // Create a `br` element,
var y = document.getElementById("y"); // "Get" the `y` element,
y.appendChild(li); // Append the input to `y`,
y.appendChild(br); // Append the br to `y`.
i++;
}
// Apply a array of attributes objects {key:value,key:value} to a array of DOM elements.
function setAttributes(elements, attributes){
var el = elements.length,
al = attributes.length;
if(el === al){
for(var n = 0; n < el; n++){
var e = elements[n],
a = attributes[n];
for(var key in a){
e.setAttribute(key, a[key]);
}
}
}else{
console.error("Elements length " + el + " does not match Attributes length " + al);
}
}
// Alias for shorter code.
function c(type){
return document.createElement(type);
};
Есть ли способ сделать это?
blockquote>Да, конечно. API позволяет запрашивать информацию для любого набора сообщений, который вы хотите, независимо от того, хотите ли вы ссылаться на них по индексу или по UID.
Настоящий вопрос - как? и все это зависит от двух вещей:
- Расширения IMAP, поддерживаемые вашим сервером IMAP
- Дизайн вашего почтового клиента и то, как вы решили заполнить кэш сводки сообщений. информация (необходима для заполнения вашего ListView или TreeView сообщений в вашем пользовательском интерфейсе).
Если ваш IMAP-сервер поддерживает расширение QRESYNC , вам нужно прочитать эту спецификацию, чтобы понять, как лучше ее использовать, а также взглянуть на ImapFolder. .Open (доступ к FolderAccess, uid vidValidity, ulong highModSeq, IList uids, CancellationToken cancellationToken) метод.
Если сервер IMAP не поддерживает QRESYNC, возможно, вы захотите воспользоваться преимуществом расширения CONDSTORE . Вы можете воспользоваться этим расширением, используя любой из методов Fetch () или FetchAsync (), которые принимают значение
modseq
.В конце ваш код будет выглядеть примерно так (непроверено):
var uidValidity = cache.GetUidValidity (); var known = cache.GetKnownUids (); UniqueIdSet missing; folder.MessageFlagsChanged += OnMessageFlagsChanged; if (client.Capabilities.HasFlag (ImapCapabilities.QuickResync)) { var highestModSeq = cache.GetHighestKnownModSeq (); folder.MessagesVanished += OnMessagesVanished; // This version of the Open() method will emit MessagesVanished and MessageFlagsChanged // for all messages that have been expunged or have changed since the last session. folder.Open (FolderAccess.ReadWrite, uidValidity, highestModSeq, known); if (folder.UidValidity != uidValidity) { // our cache is no longer valid, we'll need to start over from scratch cache.Clear (); cache.SetUidValidity (folder.UidValidity); missing = folder.Search (SearchQuery.All); } else { // figure out which messages we are missing in our cache missing = new UniqueIdSet (SortOrder.Ascending); var all = folder.Search (SearchQuery.All); foreach (var uid in all) { if (!known.Contains (uid)) missing.Add (uid); } } } else { folder.MessageExpunged += OnMessageExpunged; folder.Open (ImapFolder.ReadWrite); if (folder.UidValidity != uidValidity) { // our cache is no longer valid, we'll need to start over from scratch cache.Clear (); cache.SetUidValidity (folder.UidValidity); missing = folder.Search (SearchQuery.All); } else { var all = folder.Search (SearchQuery.All); // purge messages from our cache that have been purged on the remote IMAP server foreach (var uid in known) { if (!all.Contains (uid)) cache.Remove (uid); } // sync flag changes since our last session known = cache.GetKnownUids (); if (known.Count > 0) { IList<IMessageSummary> changed; if (client.Capabilities.HasFlag (ImapCapabilities.CondStore)) { var highestModSeq = cache.GetHighestKnownModSeq (); changed = folder.Fetch (known, highestModSeq, MessageSummaryItems.Flags | MessageSummaryItems.ModSeq | MessageSummaryItems.UniqueId); } else { changed = folder.Fetch (known, MessageSummaryItems.Flags | MessageSummaryItems.UniqueId); } foreach (var item in changed) { // update the cache for this message cache.Update (item); } } // figure out which messages we are missing in our cache missing = new UniqueIdSet (SortOrder.Ascending); foreach (var uid in all) { if (!known.Contains (uid)) missing.Add (uid); } } } // fetch the summary information for the messages we are missing var fields = MessageSummaryItems.Full | MessageSummaryItems.UniqueId; if (client.Capabilities.HasFlag (ImapCapabilities.CondStore)) fields |= MessageSummaryItems.ModSeq; var newMessages = folder.Fetch (missing, fields); foreach (var message in newMessages) cache.Add (message); cache.SetHighestModSeq (folder.HighestModSeq);
И тогда вам понадобятся как минимум следующие обработчики событий:
void OnMessageFlagsChanged (object sender, MessageFlagsChangedEventArgs e) { cache.Update (e.Index, e.Flags, e.ModSeq); } void OnMessageExpunged (object sender, MessageExpungedEventArgs e) { cache.Remove (e.Index); } void OnMessagesVanished (object sender, MessagesVanishedEventArgs e) { cache.RemoveRange (e.UniqueIds); }