דוגמאות לקריאה חוזרת (callback) של התחלת חיפוש
הקריאה החוזרת search starting יכולה לשנות את השאילתה לפני שהיא משמשת לחיפוש. אפשר להגדיר את Programmable Search Engine כך שיכלול מונחים שנקבעו מראש בשאילתה, אבל פונקציית הקריאה החוזרת הזו יכולה לשנות את השאילתה על סמך כל מידע שזמין לפונקציית הקריאה החוזרת.
הקריאה החוזרת (callback) הבאה search starting מוסיפה לכל שאילתה את היום הנוכחי בשבוע.
<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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>בדוגמה הזו מוסבר איך להטמיע את התכונה חיפושים אחרונים באמצעות הקריאה החוזרת search starting.
התכונה מתעדת את שאילתות המשתמשים כשמופעל חיפוש, ושומרת אותן באופן מקומי בדפדפן. השאילתות האלה מוצגות כפריטים שאפשר ללחוץ עליהם, וכך המשתמשים יכולים לחזור במהירות על חיפושים קודמים, לשפר את נוחות השימוש ולצמצם את הצורך בהקלדה חוזרת.
<script async
src="https://cse.google.com/cse.js?cx=000888210889775888983:g9ckaktfipe"></script>
מגדירים את פונקציית העזר לאחסון החיפושים האחרונים ב-localStorage, עם בדיקה של הסכמת המשתמש:
// For this demo, consent is assumed to be granted.
// In production, integrate this with your site's Consent Management Platform (CMP).
window.__hasStorageConsent = true;
function hasStorageConsent() {
return window.__hasStorageConsent === true;
}
function saveRecentSearch(query) {
if (!query || !hasStorageConsent()) return;
let searches = [];
try {
searches = JSON.parse(localStorage.getItem("recentSearches")) || [];
} catch (e) {
console.warn("Invalid localStorage data, resetting:", e);
// searches remains [] to overwrite the corrupted data
}
searches = searches.filter(item => item !== query);
searches.unshift(query);
searches = searches.slice(0, 5);
try {
localStorage.setItem("recentSearches", JSON.stringify(searches));
} catch (e) {
console.warn("Unable to access localStorage:", e);
}
}
רושמים את הקריאה החוזרת search starting. צריך לרשום את פונקציות ה-callback באובייקט הגלובלי __gcse לפני טעינת cse.js:
// Install the callback.
window.__gcse || (window.__gcse = {});
window.__gcse.searchCallbacks = {
web: {
starting: function (gname, query) {
saveRecentSearch(query);
renderRecentSearches();
return query; // continue normal search
},
},
};
מגדירים פונקציה לעיבוד החיפושים האחרונים כפריטים שאפשר ללחוץ עליהם, ומפעילים אותה בטעינת הדף:
function renderRecentSearches() {
const container = document.getElementById("recent-searches");
if (!container) return;
if (!hasStorageConsent()) {
container.innerHTML = "";
try {
localStorage.removeItem("recentSearches");
} catch(e) {}
return;
}
let searches = [];
try {
searches = JSON.parse(localStorage.getItem("recentSearches")) || [];
} catch (e) {
console.warn("Unable to access localStorage:", e);
}
container.innerHTML = "";
searches.forEach(q => {
const item = document.createElement("button");
item.type = "button";
item.textContent = q;
item.onclick = () => {
const input = document.querySelector("input.gsc-input");
const button = document.querySelector("button.gsc-search-button");
if (input) input.value = q;
if (button) button.click();
};
container.appendChild(item);
});
}
window.addEventListener("DOMContentLoaded", function () {
renderRecentSearches();
});
צריך לכלול את הרכיבים האלה ב-HTML:
<style>
#recent-searches button {
display: inline-block;
margin-right: 8px;
margin-top: 4px;
padding: 2px 8px;
background-color: #f1f3f4;
border: 1px solid #dadce0;
border-radius: 4px;
cursor: pointer;
font-size: 13px;
}
</style>
<div class="gcse-search"></div>
<div id="recent-searches"></div>
מגבלות
- הנתונים מאוחסנים רק בדפדפן (
localStorage) ונדרשת הסכמת המשתמשים. - המידע לא משותף בין מכשירים או משתמשים.
- הערך נמחק אם האחסון בדפדפן נמחק.
- לא מתבצע מעקב אחרי חיפושים שבוצעו מחוץ לדף הזה.
דוגמאות לקריאה חוזרת (callback) של תוצאות שמוצגות
הקריאה החוזרת (callback) של תוצאות העיבוד מתאימה לשינוי הדף אחרי שהוא מאוכלס בתוצאות. הוא נועד להקל על שינוי אופן הצגת התוצאות בלי שהפונקציה להחזרת ערך תיקח אחריות מלאה על עיבוד התוצאות.
בדוגמאות הבאות מוצגות שתי אפשרויות לשימוש בקריאה החוזרת (callback) של התוצאות, שלא פועלות על התוצאות.
הקריאה החוזרת (callback) של results rendered שמה לב שאנחנו מציגים את הדף האחרון של התוצאות, ומציגה התראה שמזכירה למשתמש שהוא הגיע לסוף.
<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");
}
};הוספת הקריאה החוזרת
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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>הדגמה של קריאה חוזרת (callback) של תוצאות שעברו עיבוד מגדילה את גודל הגופן של המספרים של ה'סמן' שמשמשים לבחירת דפי תוצאות.
גודל הגופן שמוגדר כברירת מחדל הוא 12px. במקרה הזה, אנחנו מגדילים אותו ל-20px.
<script async
src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>myWebResultsRenderedCallback = function(){
document.getElementsByClassName("gsc-cursor")[0].style.fontSize = '20px';
};הוספת הקריאה החוזרת
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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>הקריאה החוזרת results rendered משנה את הקישורים לדפים בפרמטר cursor ממספרים לאותיות.
<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];
}
};הוספת הקריאה החוזרת
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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>דוגמאות לקריאה חוזרת (callback) של תוצאות מוכנות
הקריאה החוזרת הזו מעצבת את התוצאות עם רקעים בהירים וכהים לסירוגין.
<script async
src="https://cse.google.com/cse.js?cx=000888210889775888983:y9tkcjel090"></script>הערה: הקוד הזה כתוב ב-JavaScript/ES6. הוא יפעל ברוב הדפדפנים, אבל צריך להמיר אותו ל-JavaScript/ES5 עבור Internet Explorer ועוד כמה דפדפנים ישנים יותר.
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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>ענן מילים
השימוש המובן מאליו בפונקציית הקריאה החוזרת results ready הוא להצגת תוצאות החיפוש בפורמט שקשה להגיע אליו באמצעות פונקציית הקריאה החוזרת results rendered כדי לשנות את קוד ה-HTML. הקריאה החוזרת results ready מתחילה עם div ריק.
דוגמה אחת במסמך Search Element API הראתה איך להשתמש בקריאה חוזרת כדי להציג גרסה פשוטה מאוד של תוצאות.
בדוגמה אחרת
הראינו איך להשהות את נתוני התוצאות מהקריאה החוזרת results ready ולהעביר אותם לקריאה החוזרת results rendered, שבה אפשר להשתמש בהם כדי לשפר את התצוגה של התוצאות הרגילות.
הקריאה החוזרת (callback) הבאה results ready מראה שתוצאות החיפוש לא חייבות להיות רשימה של תוצאות. הוא מחליף את התצוגה הרגילה של תוצאות החיפוש בענן מילים של המילים שנמצאו בכותרות ובתוכן של התוצאות. אם רשימת התוצאות היא רק שלב ביניים עבור המשתמש, קריאה חוזרת כזו יכולה לדלג על השלב הזה ולהשתמש בתוצאות כדי להציג את הדוח שהמשתמש רוצה.
<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>הערה: הקוד הזה כתוב ב-JavaScript/ES6. הוא יפעל ברוב הדפדפנים, אבל צריך להמיר אותו ל-JavaScript/ES5 עבור Internet Explorer ועוד כמה דפדפנים ישנים יותר.
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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>דוגמה לקריאה חוזרת (callback) בשני חלקים
אפשר להשתמש בפונקציות הקריאה החוזרת results ready ו-results rendered בשילוב כדי להעביר מידע מהראשונה לשנייה. לדוגמה, המידע במערך של אובייקטים של תוצאות זמין לקריאה חוזרת (callback) של results ready, אבל לא לקריאה חוזרת (callback) של results rendered. אם נשמור את המידע הזה במערך כחלק מהקריאה החוזרת results ready, נוכל לגשת אליו באמצעות הקריאה החוזרת results rendered.
דוגמה אחת לכך היא דילוג על חלונית התצוגה המקדימה שמוצגת כשלוחצים על תוצאת חיפוש של תמונה. באמצעות קריאה חוזרת (callback) בת שני חלקים, אפשר לקשר את תוצאות התמונות ישירות לאתרים המתאימים במקום להציג תצוגה מקדימה של התמונה בלחיצה.
<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,
},
};צריך לכלול את הרכיבים האלה ב-HTML:
<div class="gcse-searchbox"></div>
<div class="gcse-searchresults"></div>