使用Greasemonkey获取具有ajax内容的iframe的内容

时间:2011-08-10 22:13:27

标签: jquery iframe greasemonkey

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

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

感谢ShankarSangoli他或她在iframe加载的时候给了我解决方法。

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

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

});

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

对此的任何帮助将非常感激:)

1 个答案:

答案 0 :(得分:2)

您可以侦听ajax调用,但这会变得过于复杂,具体取决于目标页面。在野性页面上获取ajax-ified内容的最强大的方法是轮询它,如下所示:

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指令涵盖了两个网址(// @include URL_*等)。

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