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

直感的には、すべてを 1 つのセレクターにまとめた方がエレガントに思えますが、実際には、そのようなセレクターがあったとしても、パフォーマンスの観点からは、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 に答える