Получить содержимое iframe с помощью селектора jquery - PullRequest
9 голосов
/ 13 мая 2011

Есть ли доступ к содержимому iframe через селектор?Примерно так:

$("iframe::contents .my-foo")

Я постоянно получаю доступ к содержимому iframe для проекта, над которым я сейчас работаю, и $("iframe").contents().find(".my-foo") становится немного утомительно печатать.

Еслиэта функция не существует в jquery "из коробки", есть ли плагин, который обеспечивает эту функцию?Если нет, то как я мог написать такой плагин?

Ответы [ 4 ]

15 голосов
/ 13 мая 2011

Однажды у меня была эта проблема, где я нашел ее утомительной. Я никогда не находил решения, как написать один селектор, подобный этому.

Несмотря на это, селектор все еще довольно длинный. Самое очевидное решение для меня - просто сохранить его в переменной.

var frame = $("iframe").contents();

frame.find(".my-foo")
...

Это лучше?

1 голос
/ 27 августа 2015

Добавлено сюда для потомков.Решение, которое я выбрал, заключалось в том, чтобы переопределить корневой объект jquery с помощью небольшого количества специального кода синтаксического анализа.Примерно так:

(function() {
    var rootjq = window.jQuery;

    var myjq = function(selector, context) {
        if(selector.indexOf("::contents") === -1) {
            return rootjq(selector, context);
        } else {
            var split = selector.split("::contents");

            var ifrm = split[0];
            var subsel = split.splice(1).join("::contents");

            var contents = rootjq(ifrm, context).contents();

            // Recursive call to support multiple ::contents in a query
            return myjq(subsel, contents);
        }
    };
    myjq.prototype = myjq.fn = rootjq.fn;

    window.jQuery = window.$ = myjq;
})();

Обратите внимание, что двойное двоеточие (::) в css означает выбор псевдоэлемента , в то время как одиночное двоеточие означает выбор по псевдоклассу.

1 голос
/ 13 мая 2011

Интуитивно, кажется более элегантным упаковывать все в один селектор, но правда в том, что, даже если бы такой селектор был, лучше с точки зрения производительности переходить с помощью find ().Тогда jQuery не должен анализировать и анализировать строку.

0 голосов
/ 13 мая 2011

Вы можете создать свой собственный выборщик.Как:

$.extend($.expr[':'], {
    contents: function(elem, i, attr){
      return $(elem).contents().find( attr[3] );
    }
});  

Использование должно быть как

$('iframe:contents(.my-foo)').remove(); 
...