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

我有一个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成功回调,但我不确定如何做到这一点。

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

您可以监听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上有此页面:

    

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

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