Mais exemplos de callback de elemento de pesquisa

Esta página contém uma variedade de exemplos de como usar callbacks do elemento de pesquisa. Elas complementam os exemplos encontrados na seção "Callbacks" do documento da API Custom Search Element.

Exemplos de chamada de retorno de pesquisa iniciada

O callback que iniciar a pesquisa pode modificar a consulta antes que ela seja usada na pesquisa. O Mecanismo de Pesquisa Programável pode ser configurado para incluir termos predeterminados na consulta, mas esse callback pode modificar a consulta com base em qualquer informação disponível para a função de callback.

O callback de início de pesquisa a seguir decora cada consulta com o dia da semana atual.

Exemplo de pesquisa inicial de callback
<script async
  src="https://cse.google.com/cse.js?cx=000888210889775888983:g9ckaktfipe"></script>
const mySearchStartingCallback = (gname, query) => {
  const dayOfWeek = new Date().getDay();
  console.log(dayOfWeek);
  var days = {
        "0": "Sunday",
        "1": "Monday",
        "2": "Tuesday",
        "3": "Wednesday",
        "4": "Thursday",
        "5": "Friday",
        "6": "Saturday"
    };

    return query + ' ' + days[dayOfWeek];
};
// Install the callback.
window.__gcse || (window.__gcse = {});
  window.__gcse.searchCallbacks = {
    image: {
      starting: mySearchStartingCallback,
    },
    web: {
      starting: mySearchStartingCallback,
    },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>

Exemplos de callback renderizados de resultados

O callback dos resultados renderizados é bom para modificar a página depois que ela é preenchida com os resultados. Ele foi projetado para facilitar a modificação da exibição de resultados sem exigir que o callback assuma total responsabilidade pela renderização dos resultados.

Os exemplos a seguir ilustram duas aplicações do callback dos resultados renderizados que não operam nos resultados.

Identificar os últimos resultados

Esse callback resultados renderizados percebe que estamos exibindo a última página de resultados e exibe um alerta lembrando ao usuário que ele chegou ao fim.

<script async
  src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>
myWebResultsRenderedCallback = function(){
    var searchresults= document.getElementsByClassName("gsc-cursor-page");
    var index= document.getElementsByClassName("gsc-cursor-current-page");
    if(index.item(0).innerHTML == searchresults.length){
       alert("This is the last results page");
    }
};

Instalar o callback

window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
  web: {
      // Since the callback is in the global namespace, we can refer to it by name,
      // 'myWebResultsRenderedCallback', or by reference, myWebResultsRenderedCallback.
      rendered: myWebResultsRenderedCallback,
  },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>
Aumentar o tamanho da fonte dos links "cursores"

Esta demonstração de callback resultados renderizados aumenta o tamanho da fonte dos números de "cursor" que selecionam páginas de resultados.

O tamanho padrão da fonte é 12 px. Aqui, aumentamos para 20px.

<script async
  src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>
myWebResultsRenderedCallback = function(){
   document.getElementsByClassName("gsc-cursor")[0].style.fontSize = '20px';
};

Instalar o callback

window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
  web: {
      // Since the callback is in the global namespace, we can refer to it by name,
      // 'myWebResultsRenderedCallback', or by reference, myWebResultsRenderedCallback.
      rendered: myWebResultsRenderedCallback,
  },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>
Usar letras para marcadores de "Cursor"

Esse callback resultados renderizados muda os links da página no "cursor" de números para letras.

<script async
  src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>
myWebResultsRenderedCallback = function(){
    var arr = document.getElementsByClassName('gsc-cursor-page');
    var alp = ['A','B','C','D','E','F','G','H','I','J','K','L',
      'M','N','O','p','Q','R','S','T','U','V','W','X','Y','Z'];
    for (var i = 0; i < arr.length; i++) {
        arr[i].innerHTML = alp[i];
    }
};

Instalar o callback

window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
  web: {
      // Since the callback is in the global namespace, we can refer to it by name,
      // 'myWebResultsRenderedCallback', or by reference, myWebResultsRenderedCallback.
      rendered: myWebResultsRenderedCallback,
  },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>

Exemplos de callback prontos para resultados

Exibir resultados com planos de fundo de cores alternadas

Esse callback formata os resultados com planos de fundo claros e escuros alternados.

<script async
      src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>

Observação: este código é escrito em JavaScript/ES6. Ele funciona na maioria dos navegadores, mas precisa ser convertido em JavaScript/ES5 para o Internet Explorer e alguns outros navegadores mais antigos.

barredResultsRenderedCallback = function(gname, query, promoElts, resultElts){
  const colors = ['Gainsboro', 'FloralWhite'];
  let colorSelector = 0;
  for (const result of resultElts) {
    result.style.backgroundColor = colors[colorSelector];
    colorSelector = (colorSelector + 1) % colors.length;
  }
};
window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
  web: {
    rendered: barredResultsRenderedCallback,
  },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>

Nuvem de palavras

A aplicação óbvia do retorno de chamada resultados prontos é exibir os resultados da pesquisa em um formato difícil de alcançar usando o retorno de chamada resultados renderizados para ajustar o HTML. O callback results Ready é iniciado com um div vazio. Um exemplo no documento da API Search Element mostrou como usar o callback para renderizar uma versão muito simples dos resultados. Outro exemplo mostrou como armazenar os dados dos resultados do callback results Ready e transmiti-los para o callback results renderizados, em que eles podem ser usados para decorar a exibição de resultados padrão.

O callback results Ready a seguir mostra que os resultados da pesquisa não precisam ser uma lista de resultados. Ela substitui a exibição normal dos resultados da pesquisa por uma nuvem das palavras encontradas nos títulos e no conteúdo dos resultados. Quando a lista de resultados é apenas uma etapa intermediária para o usuário, um callback como esse pode ignorar esse estágio e usar os resultados para apresentar o relatório que o usuário quer.

Criar uma nuvem de palavras com base no conteúdo dos resultados da pesquisa
<script async
      src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>
<style>
  #container {
    width: 100%;
    height: 4.5in;
    margin: 0;
    padding: 0;
  }
</style>
<script src="https://cdn.anychart.com/releases/v8/js/anychart-base.min.js"></script>
<script src="https://cdn.anychart.com/releases/v8/js/anychart-tag-cloud.min.js"></script>

Observação: este código é escrito em JavaScript/ES6. Ele funciona na maioria dos navegadores, mas precisa ser convertido em JavaScript/ES5 para o Internet Explorer e alguns outros navegadores mais antigos.

const resultsReadyWordCloudCallback = function(
        name, q, promos, results, resultsDiv) {
    const stopWords = new Set()
      .add('a')
      .add('A')
      .add('an')
      .add('An')
      .add('and')
      .add('And')
      .add('the')
      .add('The');

    const words = {};
    const splitter = /["“”,\?\s\.\[\]\{\};:\-\(\)\/!@#\$%\^&*=\+\*]+/;
    if (results) {
        for (const {contentNoFormatting, titleNoFormatting} of results) {
            const wordArray = (contentNoFormatting + ' ' + titleNoFormatting)
              .split(splitter)
              .map(w => w.toLowerCase());
            for (const w of wordArray) {
                if (w && !stopWords.has(w)) {
                    words[w] = (words[w] + 1) || 1;
                }
            }
        }
    }
    const dataForChart = [];
    for (const key in words) {
        const val = words[key];
        dataForChart.push({
            'x': key,
            'value': val,
        });
    }

    const container = document.createElement('div');
    resultsDiv.appendChild(container);
    container.id = 'container';
    // create a tag (word) cloud chart
    const chart = anychart.tagCloud(dataForChart);
    // set a chart title
    chart.title(`Words for query: "${q}"`)
    // set an array of angles at which the words will be laid out
    chart.angles([0, 45, 90, 135])
    // display the word cloud chart
    chart.container(container);
    chart.draw();
    return true; // Don't display normal search results.
};
window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
    web: {
        ready: resultsReadyWordCloudCallback,
    },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>

Exemplo de callback em duas partes

Os callbacks resultados prontos e resultados renderizados podem ser usados em combinação para transmitir informações do primeiro para o segundo. Por exemplo, as informações na matriz de objetos de resultado estão disponíveis para o callback results Ready, mas não o callback results renderizados. Ao salvar essas informações em uma matriz como parte do callback results Ready, podemos torná-las acessíveis ao callback results renderizados.

Um exemplo disso é ignorar o painel de visualização mostrado quando um resultado de imagem é clicado. Com um callback em duas partes, os resultados de imagem podem ser vinculados diretamente aos sites correspondentes, em vez de mostrar uma visualização de imagem quando clicados.

Ignorar visualizações de imagens
<script async
  src="https://cse.google.com/cse.js?cx=000888210889775888983:g9ckaktfipe"></script>
const makeTwoPartCallback = () => {
  let urls;
  const readyCallback = (name, q, promos, results, resultsDiv) => {
    urls = [];
    for (const result of results) {
      urls.push(result['contextUrl']);
    }
  };
  const renderedCallback = (name, q, promos, results) => {
    const removeEventListeners = element => {
      const clone = element.cloneNode(true);
      element.parentNode.replaceChild(clone, element);
      return clone;
    };
    for (let i = 0; i < results.length; ++i) {
      const element = removeEventListeners(results[i]);
      element.addEventListener('click', () => window.location.href = urls[i]);
    }
  };
  return {readyCallback, renderedCallback};
};
const {
  readyCallback: imageResultsReadyCallback,
  renderedCallback: imageResultsRenderedCallback,
} = makeTwoPartCallback();
window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
  image: {
    ready: imageResultsReadyCallback,
    rendered: imageResultsRenderedCallback,
  },
};

Inclua estes elementos no HTML:

<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>