使用Greasemonkey获取具有ajax内容的iframe的内容 [英] Get contents of an iframe which has ajax content, with Greasemonkey

查看:111
本文介绍了使用Greasemonkey获取具有ajax内容的iframe的内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a Greasemonkey script which uses jQuery and detects if a "class" is present in the document.

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

感谢ShankarSangoli他或她给我解决了在iframe加载时找到类的问题。 / p>

Thanks to ShankarSangoli he or she gave me the solution to finding the class when the iframe loads with.

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

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

});

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

The problem I have now is that some of the links in the iframe load content via ajax so the iframe doesn't refresh and I cant get the new value for the class "mw_error". It was suggested that I use a ajax success callback but I'm unsure how to do this.

任何有关这方面的帮助将非常感激:)

Any help on this would be much appreciated :)

推荐答案

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

You can listen for ajax calls, but that gets overly complicated, depending on the target pages. The most robust way to get ajax-ified content on a wild page is to poll for it, like so:

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中,具体取决于脚本的用途。



Beware that Greasemonkey can also run on iFrames, so you may not need to do anything other than know if you're in an iFrame, depending upon the script's purpose.

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

Conversely, you can get unexpected results if the GM script(s) fire on the iFrame URL when you haven't planned on it.

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

For example, suppose you had this page at URL_A:

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

GM脚本的 // @include 指令涵盖了两个网址( // @include URL _ * 等)。

And the GM script's // @include directive(s) covered both urls (// @include URL_*, etc.).

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

Then if the script just had alert ('Script start.');, you would see 2 alerts upon loading the page.

这篇关于使用Greasemonkey获取具有ajax内容的iframe的内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆