使用Google CSE v2时,是否有一种方法可以注册搜索结果回调函数?

8
在谷歌自定义搜索引擎代码的第一个版本(v1)中,有一种方法叫做.setSearchCompleteCallback,可以在搜索结果返回时调用一些Javascript。该代码的文档可以在这里找到。
搜索引擎对象已从v1中的google.search.CustomSearchControl移动到v2中的google.search.cse.element当前版本(v2)似乎没有.setSearchCompleteCallback方法,我看不到注册回调函数以便在搜索结果完成时进行操作的方法。我已经尝试使用Jquery的ajaxStart和ajaxEnd方法,但成功程度不同,我想知道是否有内置在Google CSE代码中的“官方”方式来实现这一点。

1
值得一提的是,确实存在一个回调参数,但它附加在 window.__gcse 对象上,似乎只在 CSE 初始化时调用。 - Andy F
你尝试过给元素添加gname属性,然后通过google.search.cse.element.getElement(gname)访问你的特定自定义搜索元素吗?google.search.cse.element对象并不是指向你实际的元素,但它提供了实用函数,包括访问你的元素的那个函数。请参见此处:https://developers.google.com/custom-search/docs/element#cse-element(我自己没有尝试过,所以我不确定返回的元素是否具有原始的v1方法,但我很想知道!) - Nathan Stretch
1
刚刚自己检查了一下,答案是否定的。搜索元素只有四种方法:clearAllResults、execute、getInputQuery和preFillQuery。看起来V2旨在成为一个简化、易于实现的版本,但没有V1大部分的功能。 - Nathan Stretch
2个回答

2

虽然不够优雅,但这是我能找到的唯一方法。

我知道人们会提出使用永不结束的间隔的评论,但在找到更好的解决方案之前,这就是我们所拥有的。

setInterval(function () {
    var resultInfo = $('.gsc-result:first');
    if (resultInfo.length && !resultInfo.data('isOld')) {
        resultInfo.data('isOld', true);

        console.log('new results');
    }
}, 500);

无需使用jQuery的解决方案:setInterval(function () { var resultInfo = document.querySelector('.gsc-result'); if (resultInfo && !resultInfo.isOld) { resultInfo.isOld = true; console.log('new results'); }}, 500); - Finesse

0

你可以通过使用MutationObserver观察结果HTML代码来确定搜索结果是否发生了变化。

// Where to put search results
var resultsElement = document.getElementById('results');

// Creating results box
window.google.search.cse.element.render({
    div: resultsElement,
    tag: 'searchresults-only',
    attributes: {
        overlayResults: false
    }
});

// Watching the "new results" event
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
new MutationObserver(function(mutations) {
    for (var i = 0; i < mutations.length; ++i) {
        if (mutations[i].target.classList.contains('gsc-results')) {
            console.log('Search complete!');
            break;
        }
    }
}).observe(resultsElement, {
    subtree:       true,
    attributes:    false,
    childList:     true,
    characterData: false
});

它的搜索完成回调和V1一样好用。旧浏览器不支持MutationObserver,但您可以使用 polyfill来启用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接