【问题标题】:Get contents of an iframe which has ajax content, with Greasemonkey使用 Greasemonkey 获取具有 ajax 内容的 iframe 的内容
【发布时间】:2011-08-11 11:03:54
【问题描述】:

我有一个使用 jQuery 并检测文档中是否存在“类”的 Greasemonkey 脚本。

var damageMessage = $(".mw_error").text();

感谢 ShankarSangoli,他或她为我提供了在 iframe 加载时找到类的解决方案。

$("iframe").load(function(){

   var damageMessage = $(this).contents().find(".mw_error").text();

});

我现在遇到的问题是 iframe 中的某些链接通过 ajax 加载内容,因此 iframe 不会刷新,并且我无法获取“mw_error”类的新值。有人建议我使用 ajax 成功回调,但我不确定如何执行此操作。

对此的任何帮助将不胜感激:)

【问题讨论】:

    标签: jquery iframe greasemonkey


    【解决方案1】:

    您可以监听 ajax 调用,但这会变得过于复杂,具体取决于目标页面。在狂野页面上获取 ajax 化内容的最可靠方法是对其进行轮询,如下所示:

    function myCode (jNode) {
        //YOUR CODE HERE
        var damageMessage   = jNode.text();
        //...
    }
    
    waitForKeyElements (".mw_error", myCode, false, "iframe");
    
    function waitForKeyElements (
        selectorTxt,    /* Required: The jQuery selector string that
                            specifies the desired element(s).
                        */
        actionFunction, /* Required: The code to run when elements are
                            found. It is passed a jNode to the matched
                            element.
                        */
        bWaitOnce,      /* Optional: If false, will continue to scan for
                            new elements even after the first match is
                            found.
                        */
        iframeSelector  /* Optional: If set, identifies the iframe to
                            search.
                        */
    )
    {
        var targetNodes, btargetsFound;
    
        if (typeof iframeSelector == "undefined")
            targetNodes     = $(selectorTxt);
        else
            targetNodes     = $(iframeSelector).contents ()
                                               .find (selectorTxt);
    
        if (targetNodes  &&  targetNodes.length > 0) {
            /*--- Found target node(s).  Go through each and act if they
                are new.
            */
            targetNodes.each ( function () {
                var jThis        = $(this);
                var alreadyFound = jThis.data ('alreadyFound')  ||  false;
    
                if (!alreadyFound) {
                    //--- Call the payload function.
                    actionFunction (jThis);
                    jThis.data ('alreadyFound', true);
                }
            } );
            btargetsFound   = true;
        }
        else {
            btargetsFound   = false;
        }
    
        //--- Get the timer-control variable for this selector.
        var controlObj      = waitForKeyElements.controlObj  ||  {};
        var controlKey      = selectorTxt.replace (/[^\w]/g, "_");
        var timeControl     = controlObj [controlKey];
    
        //--- Now set or clear the timer as appropriate.
        if (btargetsFound  &&  bWaitOnce  &&  timeControl) {
            //--- The only condition where we need to clear the timer.
            clearInterval (timeControl);
            delete controlObj [controlKey]
        }
        else {
            //--- Set a timer, if needed.
            if ( ! timeControl) {
                timeControl = setInterval ( function () {
                        waitForKeyElements (    selectorTxt,
                                                actionFunction,
                                                bWaitOnce,
                                                iframeSelector
                                            );
                    },
                    500
                );
                controlObj [controlKey] = timeControl;
            }
        }
        waitForKeyElements.controlObj   = controlObj;
    }
    


    请注意,Greasemonkey 也可以在 iFrame 上运行,因此您可能无需执行任何操作,只需知道您是否在 iFrame 中,具体取决于脚本的用途。

    相反,如果 GM 脚本在您没有计划的情况下触发 iFrame URL,您可能会得到意想不到的结果。

    例如,假设您在 URL_A 有此页面:

    <body>
        <iframe src="URL_B"></iframe>
    </body>
    

    GM 脚本的 // @include 指令涵盖了两个 url(// @include URL_* 等)。

    如果脚本只有alert ('Script start.');,您会在加载页面时看到 2 个警报。

    【讨论】:

    • 我使用 GM 脚本的指令仅在加载 iframe 时运行。我编辑了脚本并取出了 iframe 参数,现在可以享用了。 :)
    • 优秀。很高兴它被理顺了。
    猜你喜欢
    • 2017-03-02
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2015-10-28
    相关资源
    最近更新 更多