DOMContentLoaded только один раз - PullRequest
7 голосов
/ 07 июня 2011

Я использую этот код для расширения Firefox

1: var Test {
2:  f: function() {
3:    alert("DOM content loaded");
4:    window.removeEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);
5:  }
6: }
7: window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);

Он должен выполнять код в функции f () при загрузке содержимого DOM (страницы weg), это означает, что он должен дать мне одно предупреждение, если я открою новую страницу или новую вкладку или перезагрузлю страницу. Проблема в том, что он дает мне около 20 предупреждений вместо одного.
Проблема еще хуже, если я хочу, чтобы в функции f () к каждому якорю добавлялся какой-либо текст (например, если я хочу добавить текст "(com)", он будет добавляться "(com) (com) (com) (com) (com) ( ком) "

Ты знаешь, как добиться желаемого поведения? removeEventListener не помогло.

Виновником, похоже, являются другие расширения Firefox и о: blank. Возможно ли, что мой прослушиватель событий в DOMContentLoaded игнорирует причины загрузки страниц другими расширениями?

спасибо

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Вам нужно проверить, запускается ли DOMContentLoaded при загрузке кадра или при загрузке основного документа, и выполнять вашу функцию только в последнем случае:

    var Test {
        f: function() {
            if (!event.originalTarget.defaultView.frameElement) {
                alert("DOM content loaded");
            }
        }
    }

    window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);
1 голос
/ 07 июня 2011

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

Однако я могу сказать, почему вы не можете удалить слушателя.function(e) { Test.f(); } является закрытием, каждый раз, когда этот код запускается, создается новая функция.Таким образом, функция, которую вы добавляете как слушатель, отличается от функции, которую вы удаляете.Например, попробуйте следующее:

alert(function(e) { Test.f(); } == function(e) { Test.f(); });

Чтобы избежать этой проблемы, вам необходимо запомнить свое закрытие, например:

var listener = function(e)
{
    window.removeEventListener("DOMContentLoaded", listener, false);
    Test.f();
}
window.addEventListener("DOMContentLoaded", listener, false);
...