المزيد من الأمثلة على معاودة الاتصال بعناصر البحث

تحتوي هذه الصفحة على مجموعة متنوعة من الأمثلة حول استخدام عمليات رد الاتصال الخاصة بـ "عنصر البحث". وهي تكمل الأمثلة الواردة في قسم عمليات الرجوع من مستند واجهة برمجة التطبيقات الخاصة بعنصر "البحث المخصّص".

أمثلة على معاودة الاتصال عند بدء البحث

يمكن أن تعدّل دالة بدء البحث الاستدعائية طلب البحث قبل استخدامه في البحث. يمكن ضبط "محرّك البحث المبرمَج" لتضمين عبارات محدّدة مسبقًا في طلب البحث، ولكن يمكن لهذه الدالة الاحتياطية تعديل طلب البحث استنادًا إلى أي معلومات متاحة لدالة الاستدعاء الاحتياطية.

تزيّن دالة الاستدعاء 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>
عرض روابط "عمليات البحث الأخيرة"

يوضّح هذا المثال كيفية تنفيذ ميزة عمليات البحث الأخيرة باستخدام دالة رد الاتصال بدء البحث.

تسجّل هذه الميزة طلبات البحث التي يرسلها المستخدمون عند إجراء عملية بحث، وتخزّنها محليًا في المتصفّح. بعد ذلك، يتم عرض طلبات البحث هذه كعناصر قابلة للنقر، ما يتيح للمستخدمين تكرار عمليات البحث السابقة بسرعة، ما يؤدي إلى تحسين سهولة الاستخدام وتقليل الكتابة المتكررة.

<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);
          }
        }
      
    

تسجيل وظيفة رد الاتصال لبدء البحث يجب تسجيل عمليات الرجوع في العنصر العام __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) ويتطلّب ذلك موافقة المستخدم.
  • لا تتم مشاركتها بين الأجهزة أو المستخدمين.
  • تتم إزالتها إذا تم محو مساحة التخزين في المتصفّح.
  • لا يتتبّع عمليات البحث التي يتم إجراؤها خارج هذه الصفحة.

أمثلة على ردّ الاتصال عند عرض النتائج

تكون دالة معاودة الاتصال لعرض النتائج مفيدة لتعديل الصفحة بعد ملئها بالنتائج. وهي مصمَّمة لتسهيل تعديل طريقة عرض النتائج بدون الحاجة إلى أن يتحمّل برنامج معالجة النتائج المسؤولية الكاملة عن عرض النتائج.

توضّح الأمثلة التالية استخدامَين لدالة معاودة الاتصال التي يتم عرض النتائج من خلالها، ولا تعمل هذه الدالة على النتائج.

تحديد آخر صفحة نتائج

يُعلمنا هذا الاستدعاء 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>
زيادة حجم خط روابط "المؤشر"

يزيد عرض نموذج نتائج العرض هذا من حجم خط أرقام "المؤشر" التي تحدّد صفحات النتائج.

يبلغ حجم الخط التلقائي 12 بكسل. في هذا المثال، سنزيدها إلى 20 بكسل.

<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 روابط الصفحة في "المؤشر" من أرقام إلى أحرف.

<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 &lt 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>

أمثلة على معاودة الاتصال عند توفّر النتائج

عرض النتائج بخلفيات ذات ألوان متناوبة

تنسّق دالة الاستدعاء هذه النتائج بخلفيات فاتحة وداكنة بالتناوب.

<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 حيث يمكن استخدامها لتزيين عرض النتائج العادية.

تعرض دالة الاستدعاء 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>

مثال على عملية إعادة استدعاء من جزأين

يمكن استخدام وظيفتَي معاودة الاتصال results ready وresults rendered معًا لتمرير المعلومات من الأولى إلى الثانية. على سبيل المثال، تتوفّر المعلومات في مصفوفة عناصر النتائج في دالة الاستدعاء results ready، ولكن ليس في دالة الاستدعاء results rendered. من خلال حفظ هذه المعلومات في مصفوفة كجزء من وظيفة results ready، يمكننا إتاحتها لوظيفة results rendered.

أحد الأمثلة على ذلك هو تجاوز لوحة المعاينة التي تظهر عند النقر على نتيجة صورة. باستخدام دالة معاودة الاتصال من جزأين، يمكننا توجيه الرابط في نتائج الصور مباشرةً إلى المواقع الإلكترونية المعنية بدلاً من عرض معاينة للصورة عند النقر عليها.

تجاوز معاينات الصور
<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>