Я в основном соглашаюсь с Mitchel, что это может быть очень конкретно в зависимости от того, что является Вами собирающийся делать с XML/sqlite. Для Вашего случая (кэш) мне кажется, что использование sqlite (или другой встроенный dbs) имеет больше смысла.
Первый я действительно не думаю, что sqlite будет нужно больше служебное, чем XML. И я имею в виду и время разработки наверху и время выполнения наверху. Только проблема состоит в том, что у Вас есть зависимость от sqlite библиотеки. Но так как Вам была бы нужна некоторая библиотека для XML так или иначе, это не имеет значения (я предполагаю, что проект находится в C/C++).
Преимущества sqlite по xml:
Недостатки sqlite:
Другие вещи на одном уровне для обоих решений, вероятно.
Для подведения его, отвечает на вопросы соответственно:
Вы не будете знать, если Вы не протестируете свое определенное приложение с обоими бэкендами. Иначе это - всегда просто предположение. Основная поддержка обоих кэшей не должна быть проблемой кодировать. Тогда сравните и сравните.
из-за пути XML-файлы организованы, sqlite поиски должно всегда быть быстрее (запрещающий некоторые угловые случаи, где он не имеет значения так или иначе, потому что это ослепительно быстро). Ускорение поисков в XML потребовало бы индексной базы данных так или иначе в Вашем случае, который будет означать иметь кэш для кэша, не особенно хорошую идею. Но с sqlite у Вас может быть индексация как часть базы данных.
Попробуйте что-то вроде этого:
function initText()
{
var textScroller = document.getElementById('textScroller');
var text = 'Hello how are you?';
var c = 0;
var interval = setInterval(function() {
textScroller.innerHTML += text[c];
c++;
if(c >= text.length) clearInterval(interval);
}, 1000);
}
Обратите внимание, что я добавил clearInterval
, чтобы остановить его, когда это необходимо.
В настоящее время вы определяете 18 тайм-аутов, и все они будут выполнены ~ одновременно. Вторая проблема заключается в том, что вы передаете инструкции для выполнения в виде строки. В этом случае у кода не будет доступа ко всем переменным, определенным в initText, потому что оцененный код будет выполняться в глобальной области.
IMO, это должно выполнить работу
function initText(){
var textScroller = document.getElementById('textScroller');
var text = 'Hello how are you?';
var c = 0;
(function(){
textScroller.innerHTML += text.charAt(c++);
if(text.length > c){
setTimeout(arguments.callee, 1000);
}
})();
}
Попробуйте следующее:
function initText()
{
var textScroller = document.getElementById('textScroller');
var text = 'Hello how are you?';
for(c = 0; c < text.length; c++)
{
setTimeout("textScroller.innerHTML += '" + text[c] + "'", 1000 + c*200);
}
}
window.onload = initText;
Попробуйте использовать закрытие:
function init() {
var textScroller = document.getElementById('textScroller');
var text = 'Hello how are you?';
var c = 0;
function run() {
textScroller.innerHTML += text[c++];
if (c<text.length)
setTimeout(run, 1000);
}
setTimeout(run, 1000);
}
init()
Проблема в вашем коде заключается в том, что код, который вы вставляете в строку, будет работать в глобальном контексте, где textScroller не определен (он определен внутри вашего функция).
Цикл for устанавливает тайм-аут для каждого символа сразу, поэтому они будут отображаться не последовательно, а все сразу. Ваш setTimeout должен включать код для другого setTimeout, который будет включать следующий символ для отображения.
Примерно так (не тестировал)
function initText()
{
var textScroller = document.getElementById('textScroller');
var text = 'Hello how are you?';
setTimeout('nextChar(text)', 1000);
}
function nextChar(text){
if(text.length > 0){
textScroller.innerHTML += text[0];
setTimeout('nextChar(text.substring(1))', 1000);
}
}