كيف يمكنني استخدام JQuery في البرامج النصية Greasemonkey في Google Chrome؟
-
20-09-2019 - |
سؤال
كما قد يعرف بعضكم، وضعت Google Chrome بعض القيود الشديدة على البرامج النصية Greasemonkey.
الكروم لا يدعم
@require
,@resource
,unsafeWindow
,GM_registerMenuCommand
,GM_setValue
, ، أوGM_getValue
.
بدون طلب، لا يمكنني العثور على طريقة لتضمين مكتبة مسج في البرنامج النصي Greasemonkey تحت Google Chrome.
هل لدى أي شخص بعض النصائح في هذا الشأن؟
المحلول
من عند "نصيحة البرنامج النصي للمستخدم: باستخدام مدونة JQuery - Erik Vold's بلوق"
// ==UserScript==
// @name jQuery For Chrome (A Cross Browser Example)
// @namespace jQueryForChromeExample
// @include *
// @author Erik Vergobbi Vold & Tyler G. Hicks-Wright
// @description This userscript is meant to be an example on how to use jQuery in a userscript on Google Chrome.
// ==/UserScript==
// a function that loads jQuery and calls a callback function when jQuery has finished loading
function addJQuery(callback) {
var script = document.createElement("script");
script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js");
script.addEventListener('load', function() {
var script = document.createElement("script");
script.textContent = "window.jQ=jQuery.noConflict(true);(" + callback.toString() + ")();";
document.body.appendChild(script);
}, false);
document.body.appendChild(script);
}
// the guts of this userscript
function main() {
// Note, jQ replaces $ to avoid conflicts.
alert("There are " + jQ('a').length + " links on this page.");
}
// load jQuery and execute the main function
addJQuery(main);
نصائح أخرى
لقد كتبت بعض الوظائف بناء على إريك فولد سيناريو للمساعدة في تشغيل وظائف تشغيل ورمز وغيرها من البرامج النصية الأخرى في مستند. يمكنك استخدامها لتحميل jQuery في الصفحة ثم قم بتشغيل التعليمات البرمجية تحت Global window
الكائن.
مثال على الاستخدام
// ==UserScript==
// @name Example from http://stackoverflow.com/q/6834930
// @version 1.3
// @namespace http://stackoverflow.com/q/6834930
// @description An example, adding a border to a post on Stack Overflow.
// @include http://stackoverflow.com/questions/2246901/*
// ==/UserScript==
var load,execute,loadAndExecute;load=function(a,b,c){var d;d=document.createElement("script"),d.setAttribute("src",a),b!=null&&d.addEventListener("load",b),c!=null&&d.addEventListener("error",c),document.body.appendChild(d);return d},execute=function(a){var b,c;typeof a=="function"?b="("+a+")();":b=a,c=document.createElement("script"),c.textContent=b,document.body.appendChild(c);return c},loadAndExecute=function(a,b){return load(a,function(){return execute(b)})};
loadAndExecute("//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js", function() {
$("#answer-6834930").css("border", ".5em solid black");
});
تستطيع انقر هنا لتثبيته، إذا كنت تثق في أنني لا أحاول خداعك في تثبيت شيء ضار وأن لا أحد قام بتحرير مشاركتي للإشارة إلى شيء آخر. إعادة تحميل الصفحة ويجب أن ترى حدود حول مشاركتي.
المهام
load(url, onLoad, onError)
تحميل البرنامج النصي في url
في المستند. اختياريا، قد يتم توفير عمليات الاسترجاعات ل onLoad
و onError
.
execute(functionOrCode)
إدراج وظيفة أو سلسلة من التعليمات البرمجية في المستند وتنفذها. يتم تحويل الوظائف إلى التعليمات البرمجية المصدر قبل إدراجها، لذلك يفقدون نطاق / إغلاقها الحاليين ويتم تشغيلها تحت العالميين window
الكائن.
loadAndExecute(url, functionOrCode)
اختصار؛ هذا يغطي النص url
, ، ثم إدراج وينفذ functionOrCode
إذا نجحت.
شفرة
function load(url, onLoad, onError) {
e = document.createElement("script");
e.setAttribute("src", url);
if (onLoad != null) { e.addEventListener("load", onLoad); }
if (onError != null) { e.addEventListener("error", onError); }
document.body.appendChild(e);
return e;
}
function execute(functionOrCode) {
if (typeof functionOrCode === "function") {
code = "(" + functionOrCode + ")();";
} else {
code = functionOrCode;
}
e = document.createElement("script");
e.textContent = code;
document.body.appendChild(e);
return e;
}
function loadAndExecute(url, functionOrCode) {
load(url, function() { execute(functionOrCode); });
}
استخدام jQuery. دون خوف من النزاعات, ، بالاتصال jQuery.noConflict(true)
. وبعد مثل ذلك:
function GM_main ($) {
alert ('jQuery is installed with no conflicts! The version is: ' + $.fn.jquery);
}
add_jQuery (GM_main, "1.7.2");
function add_jQuery (callbackFn, jqVersion) {
jqVersion = jqVersion || "1.7.2";
var D = document;
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
var scriptNode = D.createElement ('script');
scriptNode.src = 'http://ajax.googleapis.com/ajax/libs/jquery/'
+ jqVersion
+ '/jquery.min.js'
;
scriptNode.addEventListener ("load", function () {
var scriptNode = D.createElement ("script");
scriptNode.textContent =
'var gm_jQuery = jQuery.noConflict (true);\n'
+ '(' + callbackFn.toString () + ')(gm_jQuery);'
;
targ.appendChild (scriptNode);
}, false);
targ.appendChild (scriptNode);
}
لكن، بالنسبة إلى البرامج النصية عبر المتصفح، لماذا لا تستفيد من نسخة لطيفة وسريعة أو محلية من المسق، عندما تستطيع؟
ما يلي يعمل كمسؤولين كروم وبرنامج نصي Greasemonkey، ويستخدم المحلي اللطيف @require
نسخة من jQuery، إذا كانت النظام الأساسي تدعمه.
// ==UserScript==
// @name _Smart, cross-browser jquery-using script
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant GM_info
// ==/UserScript==
function GM_main ($) {
alert ('jQuery is installed with no conflicts! The version is: ' + $.fn.jquery);
}
if (typeof jQuery === "function") {
console.log ("Running with local copy of jQuery!");
GM_main (jQuery);
}
else {
console.log ("fetching jQuery from some 3rd-party server.");
add_jQuery (GM_main, "1.7.2");
}
function add_jQuery (callbackFn, jqVersion) {
var jqVersion = jqVersion || "1.7.2";
var D = document;
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
var scriptNode = D.createElement ('script');
scriptNode.src = 'http://ajax.googleapis.com/ajax/libs/jquery/'
+ jqVersion
+ '/jquery.min.js'
;
scriptNode.addEventListener ("load", function () {
var scriptNode = D.createElement ("script");
scriptNode.textContent =
'var gm_jQuery = jQuery.noConflict (true);\n'
+ '(' + callbackFn.toString () + ')(gm_jQuery);'
;
targ.appendChild (scriptNode);
}, false);
targ.appendChild (scriptNode);
}
إذا كانت الصفحة لديها بالفعل jQuery، فما عليك سوى اتبع هذا القالب:
// ==UserScript==
// @name My Script
// @namespace my-script
// @description Blah
// @version 1.0
// @include http://site.com/*
// @author Me
// ==/UserScript==
var main = function () {
// use $ or jQuery here, however the page is using it
};
// Inject our main script
var script = document.createElement('script');
script.type = "text/javascript";
script.textContent = '(' + main.toString() + ')();';
document.body.appendChild(script);
الطريقة البسيطة تستخدم required
الكلمة الرئيسية:
// @require http://code.jquery.com/jquery-latest.js
هناك طريقة سهلة حقا للتجول في إدراج نسخة كاملة من مسج لبرامج نصوص Chrome عندما لا تستخدم هذه البرامج النصية في الواقع أي ميزات مميزة (GM_ * وظائف، إلخ) ...
ما عليك سوى إدراج البرنامج النصي نفسه في صفحة Dom وتنفيذ! أفضل جزء هو أن هذه التقنية تعمل أيضا أيضا على Firefox + Greasemonkey، حتى تتمكن من استخدام نفس البرنامج النصي لكليهما:
var script = document.createElement("script");
script.type = "text/javascript";
script.textContent = "(" + threadComments.toString() + ")(jQuery)";
document.body.appendChild(script);
function threadComments($) {
// taken from kip's http://userscripts-mirror.org/scripts/review/62163
var goodletters = Array('\u00c0','\u00c1','\u00c2','\u00c3','\u00c4','\u00c5','\u00c6','\u00c7'
,'\u00c8','\u00c9','\u00ca','\u00cb','\u00cc','\u00cd','\u00ce','\u00cf'
,'\u00d1','\u00d2','\u00d3','\u00d4','\u00d5','\u00d6'
,'\u00d8','\u00d9','\u00da','\u00db','\u00dc','\u00dd'
,'\u00e0','\u00e1','\u00e2','\u00e3','\u00e4','\u00e5','\u00e6','\u00e7'
,'\u00e8','\u00e9','\u00ea','\u00eb','\u00ec','\u00ed','\u00ee','\u00ef'
,'\u00f1','\u00f2','\u00f3','\u00f4','\u00f5','\u00f6'
,'\u00f8','\u00f9','\u00fa','\u00fb','\u00fc','\u00fd' ,'\u00ff').join('');
// from Benjamin Dumke's http://userscripts-mirror.org/scripts/review/68252
function goodify(s)
{
good = new RegExp("^[" + goodletters + "\\w]{3}");
bad = new RegExp("[^" + goodletters + "\\w]");
original = s;
while (s.length >3 && !s.match(good)) {
s = s.replace(bad, "");
}
if (!s.match(good))
{
// failed, so we might as well use the original
s = original;
}
return s;
}
in_reply_to = {};
function who(c, other_way) {
if (other_way)
{
// this is closer to the real @-reply heuristics
m = /@(\S+)/.exec(c);
}
else
{
m = /@([^ .:!?,()[\]{}]+)/.exec(c);
}
if (!m) {return}
if (other_way) {return goodify(m[1]).toLowerCase().slice(0,3);}
else {return m[1].toLowerCase().slice(0,3);}
}
function matcher(user, other_way) {
if (other_way)
{
return function () {
return goodify($(this).find(".comment-user").text()).toLowerCase().slice(0,3) == user
}
}
else
{
return function () {
return $(this).find(".comment-user").text().toLowerCase().slice(0,3) == user
}
}
}
function replyfilter(id) {
return function() {
return in_reply_to[$(this).attr("id")] == id;
}
}
function find_reference() {
comment_text = $(this).find(".comment-text").text();
if (who(comment_text))
{
fil = matcher(who(comment_text));
all = $(this).prevAll("tr.comment").filter(fil);
if (all.length == 0)
{
// no name matched, let's try harder
fil = matcher(who(comment_text, true), true);
all = $(this).prevAll("tr.comment").filter(fil);
if (all.length == 0) {return}
}
reference_id = all.eq(0).attr("id");
in_reply_to[$(this).attr("id")] = reference_id;
}
}
// How far may comments be indented?
// Note that MAX_NESTING = 3 means there are
// up to *four* levels (including top-level)
MAX_NESTING = 3
// How many pixels of indentation per level?
INDENT = 30
function indenter(parent) {
for (var i = MAX_NESTING; i > 0; i--)
{
if (parent.hasClass("threading-" + (i-1)) || (i == MAX_NESTING && parent.hasClass("threading-" + i)))
{
return function() {
$(this).addClass("threading-" + i).find(".comment-text").css({"padding-left": INDENT*i});
}
}
}
return function() {
$(this).addClass("threading-1").find(".comment-text").css({"padding-left": INDENT});
}
}
function do_threading(){
id = $(this).attr("id");
replies = $(this).nextAll("tr.comment").filter(replyfilter(id));
ind = indenter($(this));
replies.each(ind);
replies.insertAfter(this);
}
function go() {
$("tr.comment").each(find_reference);
$("tr.comment").each(do_threading);
}
$.ajaxSetup({complete: go});
go();
}
(سرقت غير منظم من Shog9 على meta.stackoverflow لأنه لم ينقله هنا، وعلي حذف منشور التعريف ..)
أيضا، يمكنك حزم البرنامج النصي الخاص بك مع مسج إلى ملحق Chrome. يرى البرامج النصية محتوى جوجل كروم.
ملحقات الكروم، على عكس البرامج النصية Greasemonkey، يمكن التحديث التلقائي نفسه.
حل أسهل: قص + لصق محتويات JQuery.min.js في الجزء العلوي من البرنامج النصي للمستخدم. منتهي.
لقد وجدت مشاكل مختلفة مع الإجابات الموصى بها. يعمل الحل adjquery () على معظم الصفحات ولكن لديه أخطاء على الكثيرين. إذا واجهت مشكلات فقط نسخ + لصق محتويات المسج في البرنامج النصي الخاص بك.
أتساءل عما إذا كنت لا تستطيع الاعتماد على document.defaultView.jQuery
في برنامج جي ام جي
if (document.defaultView.jQuery) {
jQueryLoaded(document.defaultView.jQuery);
} else {
var jq = document.createElement('script');
jq.src = 'http://jquery.com/src/jquery-latest.js';
jq.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(jq);
(function() {
if (document.defaultView.jQuery) jQueryLoaded(document.defaultView.jQuery);
else setTimeout(arguments.callee, 100);
})();
}
function jQueryLoaded($) {
console.dir($);
}
سيكون نهج آخر تعديل البرنامج النصي لتحميل jQuery يدويا. مثال من http://joanpiedra.com/jquery/greasemonkey/:
// Add jQuery
var GM_JQ = document.createElement('script');
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(GM_JQ);
// Check if jQuery's loaded
function GM_wait() {
if(typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(GM_wait,100); }
else { $ = unsafeWindow.jQuery; letsJQuery(); }
}
GM_wait();
// All your GM code must be inside this function
function letsJQuery() {
alert($); // check if the dollar (jquery) function works
}
تحرير: الرقائق! بعد الاختبار، يبدو هذا الرمز لا يعمل نظرا لأن Google Chrome يدير مساليك / امتدادات في نطاق / عملية منفصلة من صفحة الويب الفعلية. يمكنك تنزيل رمز JQUERY باستخدام XMLHTTPRECEST ثم تقييمه، ولكن عليك استضافة التعليمات البرمجية على خادم يسمح تقاسم الموارد عبر الأصل باستخدام Access-Control-Allow-Origin: *
رأس. للأسف لا شيء من CDNS الحالي مع jQuery دعم هذا.
امتداد مثالي لتضمين جيسول في وحدة التحكم بالكروم بسيطة كما يمكنك أن تتخيل. يتحرج هذا التمديد أيضا إذا تم دمج JQuery بالفعل في الصفحة.
يستخدم هذا التمديد لتضمين JQuery في أي صفحة تريدها. يسمح باستخدام JQuery في شل وحدة التحكم (يمكنك استدعاء وحدة التحكم Chrome بواسطة "CTRL + SHIFT + J").
لتضمين JQuery في علامة تبويب محددة، انقر فوق الزر Extention.
رابط إلى التمديد: https://chrome.google.com/extensions/detail/gbmifchmngifmadobkcpijhldeelkc.