Как узнать, происходит ли событие DOMContentLoaded из iframe или нет? - PullRequest
2 голосов
/ 19 ноября 2010

Я работаю над расширением Firefox, и оно использует что-то вроде этого:

function myExt()
{
    this.handleEvent = function (event)
    {
        switch (event.type)
        {
            case "DOMContentLoaded":
            {
                alert('fired');
            }
        }
    }

    window.addEventListener ("DOMContentLoaded", this, false);
}

Моя проблема заключается в том, что предупреждение запускается несколько раз, если содержимое страницы содержит iframes, поэтому я собираюсь использовать «event» для этого. верхнее окно или окно iframe.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 22 августа 2011

Я использую этот фрагмент для фильтрации iframes:

var browser = gBrowser.getBrowserForDocument(event.target);
var pageIsFrame = (event.target instanceof Ci.nsIDOMHTMLDocument &&
  event.target != browser.contentDocument);
if (pageIsFrame) {
  // Not interested in frames.
  return;
}

Для этого вам нужны привилегии Chrome.

В новых сценариях содержимого SDK для дополнений (где выу меня нет привилегий Chrome), я использую это:

if (window.frameElement) {
  // This is an iframe.
  //...
}

(см. документ MDC здесь или здесь ).

0 голосов
/ 19 ноября 2010

Я все еще делаю некоторые тесты, но похоже, что эта функция выполняет свою работу:

this.isTopLevel = function(event){
    var doc = event.target;
    for(var i = 0; i < gBrowser.browsers.length; i++) {
        if(gBrowser.browsers[i].contentDocument == doc) return true;
    }
    return false;
};
0 голосов
/ 20 ноября 2010

Вы можете попробовать проверить событие.target.frameElement. Если он не определен, то это основной документ, но если он определен, то это фрейм. Я не могу вспомнить, если это только для фреймов, или если это тоже для фреймов.

0 голосов
/ 19 ноября 2010

Да, iframe странно, что выстрелит DOMContentLoaded. Он обрабатывает контент, как если бы он находился в своем собственном «окне». Вы пытались получить родителя event.target или ownerDocument?

Я использовал Firebug в SVG, загруженном в тег <object>, и я считаю, что ownerDocument получает то, что вы ищете.

...