11

无论如何可以通过选择器访问 iframe 的内容吗?像这样的东西:

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

我一直在访问我目前正在从事的项目的 iframe 内容,并且$("iframe").contents().find(".my-foo")打字变得有点乏味。

如果开箱即用的 jquery 中不存在此功能,是否有提供此功能的插件?如果不是我怎么写这样的插件?

4

4 回答 4

17

我曾经遇到过这个问题,我觉得它很乏味。我从来没有找到如何编写这样的单个选择器的解决方案。

即便如此,选择器仍然相当长。对我来说最明显的解决方案就是将它保存到一个变量中。

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

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

那个更好吗?

于 2011-05-13T13:49:36.373 回答
2

直觉上,将所有内容打包到一个选择器中似乎更优雅,但事实是,即使有这样的选择器,从性能角度来看,用 find() 遍历更好。这样jQuery就不必解析和分析字符串了。

于 2011-05-13T13:52:45.390 回答
1

在这里添加以供后代使用。我最终采用的解决方案是用一些自定义解析代码覆盖根 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中的双冒号()表示选择伪元素,而单冒号表示按伪类选择。

于 2015-08-27T15:18:43.373 回答
0

您可以创建自己的自定义选择器。像:

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

用法应该像

$('iframe:contents(.my-foo)').remove(); 
于 2011-05-13T13:52:47.037 回答