Вызов объекта более одного раза

#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() » что вы имеете в виду?