如何查看是否显示Google Recaptcha V2 Puzzle?

How Can I Check if Google Recaptcha V2 Puzzle is Displayed?

当 Recaptcha 显示拼图而不是复选框时,我正在尝试调整容器的大小 div。这通常在单击复选框后发生。我该怎么做?

我知道在某些情况下会强制 Recaptcha V2 显示拼图而不是复选框。然而,Api 并不是 return 一个 属性 或表明此更改已经发生的事件。 JavaScript 或通过 API 有什么方法可以识别 Recaptcha V2 是否正在显示拼图?

注意:这是在我没有在 API 中指定 fallback=true 的情况下url.

以下是使用 setInterval 执行此操作的方法。如果用户从不选中该框,这可能会终止浏览器。您可能希望延迟 运行 直到他们开始填写表格或等到他们 mouseover/focus 在 reCaptcha 元素上。您可能还需要一个更具体的选择器(通过将您的 recaptcha 包装在 div 中)以防您有其他 iframe 可以在代码中使用相同的标题。如评论中所述,使用 mutationObserver 是一个更好的主意。 希望这能满足您的需求。

function isPuzzleDisplayed (selector) {
  /**
   * @param {string} selector
   * @returns boolean - if the specified element exists
   */
    return document.querySelectorAll(selector).length >= 1;
}

var timer = setInterval(function () {
  /**
   * Check if element exists every 0 seconds.
   * If it does, kill timer, else keep running forever!
   * WARNING! This is not performant.
   */
    if (isPuzzleDisplayed('iframe[title*="recaptcha challenge"]')) {
        console.log('But this is how you do it!');
        /* run your code here */
        clearInterval(timer);
        timer = 0;
    } else {
        console.log('It is true the Api however does not return a property or event that would indicate that this change has happened. >', timer);
    }
}, 0);

不幸的是,Google 没有 API 事件来跟踪这个,但我们可以使用 Mutation Observer 网络 API 来跟踪 DOM我们自己更改 Google API。 浏览器很好地支持它:

首先,我们需要创建一个目标元素,我们将观察该元素的 Google iframe 外观。我们将定位 document.body,因为 iframe 将附加到它:

const targetElement = document.body;

然后我们需要为 MutationObserver 创建一个配置对象。在这里我们可以指定我们将在 DOM 更改中跟踪的确切内容。请注意默认情况下所有值都是 'false' 所以我们只能保留 'childList' - 这意味着我们将只观察目标元素的子节点变化 - document.body 在我们的例子中:

const observerConfig = {
    childList: true,
    attributes: false,
    attributeOldValue: false,
    characterData: false,
    characterDataOldValue: false,
    subtree: false
};

然后我们需要创建一个函数,当观察者检测到我们在配置对象中指定的特定类型的 DOM 更改时将调用该函数。第一个参数表示 Mutation Observer 个对象

的数组
function DOMChangeCallbackFunction(mutationRecords) {
    mutationRecords.forEach((mutationRecord) => {
        if (mutationRecord.addedNodes.length) { //check only when notes were added to DOM
            var reCaptchaParentContainer = mutationRecord.addedNodes[0];
            var reCaptchaIframe = reCaptchaParentContainer.querySelectorAll('iframe[title*="recaptcha"]');

            if (reCaptchaIframe.length) { // Google reCaptcha iframe was loaded
                console.log('Yay!');
                reCaptchaObserver.disconnect(); // We don't want to observe more DOM changes for better performance
                // Challenge was loaded -- DO SOMETHING HERE
            }
        }
    });
}

差不多就这样了。唯一剩下的事情 - 实例化观察者本身并开始观察 DOM 变化:

const reCaptchaObserver = new MutationObserver(DOMChangeCallbackFunction);
reCaptchaObserver.observe(targetElement, observerConfig);

希望对您有所帮助:)