使用jquery选择器获取iframe内容

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

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

我经常访问我正在处理的项目的iframe内容和$("iframe").contents().find(".my-foo")变得有点乏味。

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

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

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

 var frame = $("iframe").contents(); frame.find(".my-foo") ... 

那个更好吗?

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

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

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

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

用法应该是这样的

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