سؤال

أرغب في تنفيذ واجهة برمجة تطبيقات Google Custom Search مع Greasemonkey ، وحتى الآن اجتمعت تجارباتي في معظمها من الإخفاقات. الهدف من الكود هو حقن مربع بحث مخصص في موقع موجود (أحاول القيام بذلك للحصول على صفحات وثائق MATLAB ، ولكن يجب أن يعمل الرمز المحقن مع أي موقع). لقد حاولت العديد من الأساليب التي اقترحتها عمليات البحث على الشبكة (تتعلق معظمها بتنفيذ jQuery أو Google Language API في Greasemonkey) ولم يعمل أي منها على واجهة برمجة تطبيقات البحث المخصص ...

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

// Inject the Google API loader script
var script = document.createElement('script'); 
script.src = 'http://www.google.com/jsapi?callback=gLoaded';  // Call gLoaded() when google api loader is ready.
script.type = "text/javascript"; 
document.getElementsByTagName('head')[0].appendChild(script); 

// Create the <div> tag for the search API to draw the search box
var elmBody = document.getElementsByTagName('Body')[0];
var gSearch = document.createElement('div');
gSearch.id = 'g_search';
elmBody.appendChild(gSearch);

// Let w be the shorthand for unsafeWindow under the Greasemonkey sandbox
var w = unsafeWindow;

// Load the search api using the Google API loader
w.gLoaded= function()
{ w.google.load('search','1', {"callback" : searchLoaded}); } ; // Run searchLoaded() when search API is ready

// Setup the custom search API and draw the search box
searchLoaded = function(){ 
google = w.google; // unsafeWindow
alert(google);                                   // :debug_1
alert(google.search);                            // :debug_2
alert(google.search.CurrentLocale);              // :debug_3
var mySearch= new google.search.CustomSearchControl('012907575288767046387:tuvzi3yqdkq');
alert(mySearch)                                  // :debug_4
mySearch.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
mySearch.draw('g_search');  // Draw the search box to the <div id='g_search'>
} 
  • Debug_1: إرجاع كائن صالح
  • Debug_2: إرجاع كائن صالح
  • Debug_3: إرجاع سلسلة صالحة ('en')
  • Debug_3: عائدات غير محددة
  • وبالمثل ، حاولت ترك SearchLoaded -> W.Searchloaded وأزلت البيان (Google = W.Google) ولكن في هذه الحالة تعود جميع الأخطاء غير المحددة.

ومن المثير للاهتمام ، عندما استخدمت JavaScript Shell Parkmarklet وأعيد تعيين وظائف Gloaded () و SearchLoaded () نظيرات غير Greasemonkey (لا مخاوف غير مؤهلة) من خلال خط الأوامر ، كل شيء يعمل فقط على النحو المقصود. يظهر مربع بحث جميل حيث من المفترض أن يكون.

إلى جانب أي اقتراحات للعمل في العمل ، كنت أتساءل ...

  1. كيف تم إرجاع google.search.currentlocale على سلسلة صالحة ، حيث لا يمكن تحميل مُنشئ google.search.customsearchControl ()؟

  2. عندما قمت بتعيين SearchLoaded as unsafewindow.searchloaded (انظر الملاحظة الأخيرة أعلاه) ، لم تعد كائنات Google مرئية للوظيفة على الرغم من أنها يجب أن تكون تحت نطاق النافذة افتراضيًا. ومع ذلك ، عندما قمت بتعيين الوظيفة تلك القيم نفسها تحت قذيفة JavaScript ، كل شيء نجح! هل Greasemonkey يحمي بطريقة أو بأخرى هذه المتغيرات على الرغم من أنني حددت صراحة الوظيفة لتكون في نطاق النافذة؟

لقد جربت الاختلافات مع مخططات مختلفة (الموقع اختراق ، @required ، google.setonloadCallback ...) ، ولكن لم يعمل أي منها بالنسبة لي.

واسمحوا لي أن أعرف أي ... وأعني أي اقتراحات ، أنا نفاد الأفكار ...

شكرًا!

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

المحلول

في الأساس...

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = (<><![CDATA[

// YOUR CODE GOES HERE

]]></>).toString();
document.getElementsByTagName('head')[0].appendChild(script);

اكتب الرمز كنص عادي ، وليس نصًا لـ GM.
أعني ، أزل كل شيء unsafeWindow المراجع والأشياء ذات الصلة.
هذا سيجعل البرنامج النصي يعمل في النطاق الصحيح.
تحدث المشكلة بسبب google.search.CustomSearchControl يستخدم متغيرات مثل J و K غير محددة في نطاق GM.

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