بحث Google المخصص - التحميل/التنفيذ اليدوي من معلمات URL

StackOverflow https://stackoverflow.com//questions/10689070

سؤال

الحصول على بعض السلوكيات الغريبة من بحث Google المخصص الذي يبدو أنني لا أستطيع التخلص منه.ربما شخص ما لديه فكرة.

أقوم بتجميع موقع Magento، الذي يحتوي على محرك بحث داخلي خاص به - ولكنه يقتصر على المنتج فقط.أريد تنفيذ نتائج بحث Google المخصصة على صفحة نتائج البحث أيضًا.أعتقد أنني يجب أن أكون قادرًا على تنفيذ بحث بناءً على الاستعلام vars في عنوان url (لإرجاع كل المحتوى غير المتعلق بالمنتج)، على هذا النحو:

        <section style="min-height:600px">
            <div style="background-color:#DFDFDF; min-height:800px; width:100%;">
                <div id="cse">Loading</div>
            </div>
        <script src="http://www.google.com/jsapi" type="text/javascript"></script>
        <script type="text/javascript"> 
        //<![CDATA[

            $(document).ready( function(){ 
                console.log('search initiated');
                var t = window.setTimeout( function(){ customSearch(); }, 5000 );
            });

            function customSearch(){
                var q = urlParams()['q'];
                if (q != undefined && q != ""){
                    console.log('q : %s', q); //outputs successfully

                    google.load('search', '1');
                    google.setOnLoadCallback(function () {
                        var customSearchControl = new google.search.CustomSearchControl(MY CUSTOM ID KEY);
                        var cseDrawOptions = new google.search.DrawOptions();
                        cseDrawOptions.setAutoComplete(true); //unknown if this is required... 
                        customSearchControl.draw('cse',cseDrawOptions);                    
                        customSearchControl.execute(q);

                    }, true);

                } 
            }

           function urlParams(){
                    var vars = []; 
                    var hash;
                    var index = window.location.href.indexOf('?');
                    if( index != -1 ){
                        var hashes = window.location.href.slice(index + 1).split('&');
                        for(var i = 0; i < hashes.length; i++){
                            hash = hashes[i].split('=');
                            vars.push(hash[0]);
                            vars[hash[0]] = hash[1].replace(/\+/g, " ");
                        }
                    }
                    return vars;
                }

        //]>
        </script>
        </section>

سألاحظ أنني قمت بسحب جميع المحتويات الأخرى من المنطق (لكن تنفيذها في الماجنتو متطابق).

لذلك يذهب السلوك مثل هذا:يتم تحميل الصفحة بشكل جيد (أقوم بتأخير بحث Google بمهلة زمنية لأغراض الاختبار).بافتراض وجود استعلام var في عنوان url الذي تتتبعه وحدة التحكم كما هو متوقع.ثم يتم مسح الصفحة، دون عودة أي محتوى من جوجل.""تم القضاء عليه""...مما يعني اختفاء جميع العناصر الموجودة في الصفحة، أو استبدالها بصفحة جديدة يقوم Google بتحميلها.كما لو أن عنصر التحكم في البحث لا يقوم بإنشاء إطار iframe - فهو مجرد استبدال الصفحة بـ <body>-أقل صفحة HTML.

لقد قمت بإعداد عدد من المقالات حول هذا الموضوع، وراجعت واجهة برمجة التطبيقات - يبدو أن هذا الرمز يجب أن يعمل.ولكن من الواضح أنه ليس كذلك.

ماذا ينقصني؟

هتافات -

تحديث

لقد كشف العبث المستمر بهذا الأمر أنه لأي سبب من الأسباب:

google.load('search', '1');
google.google.setOnLoadCallback( console.log('loaded') )

كان سبب مشكلة الصفحة المستبدلة.ومع ذلك، تحتوي الصفحة التي تم الرد عليها على روابط إلى وحدة البحث التي تستضيفها Google.وإذا قمت بربط هذه الملفات يدويًا (التخلي عن ملف google.load) ثم يمكنني إجراء بحث كما هو متوقع:

<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script src="http://www.google.com/uds/?file=search&v=1" type="text/javascript"></script>
<script type="text/javascript"> 
//<![CDATA[
  ... search logic

ثم وجدت بناء جملة بديل على مطوري جوجل الصفحة التي يبدو أنها تعمل كما هو متوقع:

$(document).ready( function(){ 
        google.load("search", "1", {"callback" : customSearch});
    });

    function customSearch(){
        var q = urlParams()['q'];
        if (q != undefined && q != ""){
            var cseControl = new google.search.CustomSearchControl('MY CUSTOM KEY');

            var cseDrawOptions = new google.search.DrawOptions();
            cseDrawOptions.enableSearchResultsOnly()
            cseControl.draw('cse', cseDrawOptions);
            cseControl.execute(q);
        } 
    }

الذي يعمل كما هو متوقع.المشكلة الحقيقية الوحيدة في هذه المرحلة هي مضيف

Unsafe JavaScript attempt to access frame with URL http://mydomain from frame with URL http://www.google/cse?...

يتم طرح ذلك الآن.

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

الأفكار ستكون رائعة.

هل كانت مفيدة؟

المحلول

لا شيء هاه؟

حسنًا - لقد توصلت إلى حل جيد، باستخدام طريقة بديلة أعتقد أنها ستكون أكثر مرونة على المدى الطويل.باستخدام جوجل واجهة برمجة التطبيقات المريحة ومسج بسيط .ajax اتصل، يمكنني الحصول على نتائج جيدة ويمكن التحكم فيها دون وجود أخطاء عبر النطاقات:

<div id="cse">Loading</div>
<script>
    //https://developers.google.com/custom-search/v1/getting_started
    //https://developers.google.com/custom-search/v1/using_rest#query-params
    //https://developers.google.com/custom-search/v1/cse/list

    var _url    = "https://www.googleapis.com/customsearch/v1";
    var _key    = 'AIzaSy... your api key here'; 
    var _cx     = '001809... your engine id';
    var _q      = urlParams()['q'];                         //query param

    jQuery(document).ready(function() {

        $j.ajax({
            url     : _url,
            type    : 'GET',
            dataType : 'jsonp',
            data :{
                key : _key,
                cx  : _cx,
                q   :_q 
            },
            success     : function(data, textStatus, jqXHR){ responseHandler(data); },
            error       : function(jqXHR, textStatus, errorThrown){ console.log('error: %s'), errorThrown},
            beforeSend  : function(){ console.log('sending request')},
            crossDomain : true
        });

    });

    function responseHandler( response, status) {
        console.log(response);

        var cse = $j('#cse');  // render vars as needed...
        for (var i = 0; i < response.items.length; i++) {
            var item = response.items[i];
            cse.append( "<br>" + item.htmlTitle);
        }
    }

    function urlParams(){
        var vars = []; 
        var hash;
        var index = window.location.href.indexOf('?');
        if( index != -1 ){
            var hashes = window.location.href.slice(index + 1).split('&');
            for(var i = 0; i < hashes.length; i++){
                hash = hashes[i].split('=');
                vars.push(hash[0]);
                vars[hash[0]] = hash[1];
            }
        }
        return vars;
    }

</script>

ويمكنك أيضاً؛ د

هتافات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top