#javascript
#javascript
Вопрос:
Здравствуйте, у меня есть код, который заменяет document.write
, создает буфер, а затем помещает буфер в документ:
var lazyLoad = {
url: '',
block: '',
buffer: '',
init: function(url,block){
that = this
that.url = url;
that.block = block;
console.info(this.block)
console.log(this.url)
window.d = document
window.onload = function(){
that.work()
}
},
work: function(){
that = this
d.write = d.writeln = function(s){
that.buffer = s
}
d.open = d.close = function(){}
s = d.createElement('script');
s.setAttribute('type','text/javascript');
s.setAttribute('src',that.url);
d.getElementById(that.block).appendChild(s)
s.onload = function () {
window.setTimeout(function() {
console.warn(that.block ' ' that.buffer)
d.getElementById(that.block).innerHTML = that.buffer;
that.buffer = '';
}, 0);
}
}
}
Если я инициализирую его один раз:
lazyLoad.init(
'http://test.com/test.js',
div1
)
Но если я вызову его снова с другими параметрами:
lazyLoad.init(
'http://test2.com/test.js',
div2
)
Первая инициализация не сработает. window.buffer
будет пустым. В чем моя ошибка?
P.S. еще одна проблема: я попытался заменить window.onload
методом jQuery $(window).load()
, но он срабатывает дважды. Как я могу это исправить?
Ответ №1:
по сути, у вас есть только один буфер: window.buffer, если вы вызовете init() дважды, window.buffer будет обработан вторым вызовом, в то время как первый вызов может не завершиться. Я бы рекомендовал вам использовать отдельный буфер для каждого init(). что может существенно избежать этой проблемы.
Что касается вашего второго вопроса,
window.onload != $(window).load()
window.onload выполнит только тот метод, который вы назначили ему последним, в то время как $ (window).load() поддерживает цепочку, вы можете инициализировать() дважды, тогда в цепочке будет два метода.
Комментарии:
1. хорошо, я изменил свой буфер, обновите сообщение, но все равно это работает только при втором инициализации. сначала — ничего не происходит
2. у вас по-прежнему есть только один буфер, который называется lazyload.buffer теперь вы можете использовать массив для хранения буфера для каждого вызова.
3. или более простое решение: каждый раз, когда вы используете новый объект lazyload для init()
4. «или более простое решение: каждый раз, когда вы используете новый объект lazyload для init() » что вы имеете в виду?