ฉันจะใช้ jQuery ใน Greasemonkey ได้อย่างไร


234

ฉันพยายามวางบรรทัดนี้ แต่มันไม่ทำงาน:

// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js

jQuery ไม่ทำงานใน Greasemonkey เลย มีวิธีอื่นในการใช้ jQuery ใน Greasemonkey หรือไม่

-

สำหรับทุกคนที่มีปัญหาเดียวกันคุณต้องอัปโหลดไฟล์ไปที่ greasespot แล้วติดตั้งจากที่นั่น

ตัวเลือกสร้างสคริปต์ใหม่จะไม่ทำงาน!


14
@ Jorge คุณไม่ทราบหรือไม่ว่าเว็บไซต์นั้นไม่มีเวทย์มนตร์ในนั้นเลย? คุณสามารถเรียกดูทุกอย่างที่มีนามสกุลไฟล์ .user.js และ Greasemonkey จะถามว่าคุณต้องการติดตั้งหรือไม่ ซึ่งรวมถึงไฟล์ในเครื่องคอมพิวเตอร์ของคุณ การติดตั้งสคริปต์ใด ๆ ทำได้ง่ายเพียงแค่ลากสคริปต์ไปที่เบราว์เซอร์ของคุณ
Rob Kennedy

5
ดูเหมือนว่าตอนนี้มันจะทำงานได้ดีแม้ในขณะที่แก้ไขไฟล์หลังจากการติดตั้ง
Josef Sábl

6
Josef ถูกต้อง - ตั้งแต่เวอร์ชัน 0.9.0ตอนนี้ Greasemonkey จะทำการติดตั้งไฟล์ @required ทันทีที่ไฟล์ถูกแก้ไข
Rory O'Kane

1
นอกจากนี้อย่าลืมที่จะยังคงใช้$(document).ready(function() {...});ในรหัสของคุณ
ผู้ใช้

1
วิธีที่ง่ายที่สุดในการรีเฟรชคุณ@requiresคือการเพิ่มแฮชหรือการสืบค้นในตอนท้ายของ@requireคำสั่งและเปลี่ยนแปลงเมื่อใดก็ตามที่ต้องการการอัปเดต คล้ายกับวิธีที่คุณใช้ "cachebust" favicon // @require http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js?v=changeme
Apache

คำตอบ:


189

บางทีคุณอาจมี Greasemonkey เวอร์ชันไม่เพียงพอ มันเป็นรุ่น 0.8 ที่เพิ่มเข้า@requireมา

// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js 

หากคุณไม่มี 0.8 ให้ใช้เทคนิค Joan Piedra อธิบายเพื่อเพิ่มscriptองค์ประกอบให้กับหน้าด้วยตนเอง

ระหว่างเวอร์ชัน 0.8 และ 0.9 @requireจะถูกประมวลผลเฉพาะเมื่อติดตั้งสคริปต์เป็นครั้งแรก หากคุณเปลี่ยนรายการสคริปต์ที่ต้องการคุณต้องถอนการติดตั้งสคริปต์และติดตั้งใหม่ Greasemonkey จะดาวน์โหลดสคริปต์ที่ต้องการหนึ่งครั้งในระหว่างการติดตั้งและใช้สำเนาแคชหลังจากนั้น

ตั้งแต่ 0.9 พฤติกรรม Greasemonkey มีการเปลี่ยนแปลง (เพื่อแก้ไขปัญหาที่เกี่ยวข้องเป็นรูปธรรม ) เพื่อให้สามารถโหลดสคริปต์ที่ต้องการได้หลังจากแก้ไขทุกครั้ง การติดตั้งสคริปต์ใหม่ไม่จำเป็นอีกต่อไป


Rob, ฉันต้องทำยังไงดี? ฉันกำลังสร้างสคริปต์ผู้ใช้ของฉันโดยใช้ลิงก์สคริปต์ผู้ใช้ใหม่ ฉันเพิ่ม @require และไม่ได้ผล ดังนั้นฉันจะทำให้มันทำงานอย่างไร กรุณาอธิบายวิธีการที่ฉันต้องการ @require ในการทำงานทำให้มันมากขึ้นสง่างามกว่าวิธีองค์ประกอบสคริปต์
เคียร่า Nighly

1
ตกลงดังนั้นฉันทำให้มันทำงาน ขอบคุณ !!! ฉันอัพโหลดสคริปต์ใน Greasespot และติดตั้งจากที่นั่น
Keira Nighly

2
ฉันคิดว่าเมื่อคุณสร้างสคริปต์ใหม่จากภายใน Greasemonkey สคริปต์จะถูกติดตั้งทันที สคริปต์นั้นเป็นไฟล์เปล่าเริ่มต้นซึ่งหมายความว่าคุณพลาดโอกาสที่จะต้องใช้สคริปต์ภายนอก
Rob Kennedy

ดังนั้นจึงไม่มีวิธีใช้ @require กับสคริปต์ใหม่ที่คุณทำอยู่ใช่ไหม : /
quano

4
มันค่อนข้างง่าย @Quano สร้างไฟล์. user.js ใหม่เขียนสคริปต์ของคุณแล้วลากไปไว้บนเบราว์เซอร์เพื่อติดตั้ง ข้อ จำกัด ในการกำหนดสคริปต์ภายนอกจะปรากฏเฉพาะเมื่อคุณสร้างสคริปต์จากภายใน UI ของ Greasemonkey แต่ไม่มีข้อกำหนดที่คุณต้องใช้ Greasemonkey เพื่อสร้างไฟล์สคริปต์ คุณสามารถแก้ไขสคริปต์หลังจากติดตั้งแล้ว แต่ถ้าคุณต้องการเพิ่ม@requireคำสั่งใหม่คุณจะต้องถอนการติดตั้งและติดตั้งสคริปต์ใหม่เพื่อให้มีผล
Rob Kennedy

81

หากคุณต้องการใช้ jQuery บนไซต์ที่มีอยู่แล้วนี่เป็นวิธีไป (ได้รับแรงบันดาลใจจาก BrunoLM):

var $ = unsafeWindow.jQuery;

ฉันรู้ว่านี่ไม่ใช่เจตนาดั้งเดิมของคำถาม แต่มันกลายเป็นเรื่องธรรมดามากขึ้นเรื่อย ๆ และคุณไม่ได้แยกกรณีนี้อย่างชัดเจน ;)


4
เห็นได้ชัดว่าไม่รองรับใน Chrome - Chromium.org/developers/design-documents/user-scripts
Ashley

ทำงานใน Scriptish of Firefox!
Gqqnbig

2
จะต้องการทดสอบว่าคุณไม่ได้เป็นอย่างนั้น: if(typeof $ == 'undefined'){ var $ = unsafeWindow.jQuery; } ใน Chrome ไซต์ jquery จะพร้อมใช้งานแล้ว
Jonathon

อืมมม ฉันได้รับข้อผิดพลาดแปลกจริง ๆ เมื่อใช้สิ่งนี้ นี่alert($('.submit_entry').length);คือทั้งข้อผิดพลาดออกและส่งการแจ้งเตือนที่เหมาะสมในเวลาเดียวกัน
Jonathon

21

ไม่มีอะไรผิดปกติที่จะรวม jQuery ทั้งหมดไว้ในสคริปต์ Greasemonkey ของคุณ เพียงนำซอร์สและวางไว้ที่ด้านบนสุดของสคริปต์ผู้ใช้ของคุณ ไม่จำเป็นต้องสร้างแท็กสคริปต์เนื่องจากคุณใช้งาน JavaScript แล้ว!

ผู้ใช้ดาวน์โหลดสคริปต์ครั้งเดียวเท่านั้นดังนั้นขนาดของสคริปต์ไม่ใช่เรื่องใหญ่ นอกจากนี้หากคุณต้องการให้สคริปต์ Greasemonkey ทำงานในสภาพแวดล้อมที่ไม่ใช่ GM (เช่นสคริปต์ผู้ใช้ GM-esque ของ Opera หรือ Greasekit บน Safari) จะช่วยไม่ให้ใช้โครงสร้างที่ไม่ซ้ำกันของ GM เช่น @require


7

วิธีแก้ปัญหาของ Rob นั้นเหมาะสม@requireกับการใช้งานกับไลบรารี jQuery และให้แน่ใจว่าติดตั้งสคริปต์ของคุณใหม่เพื่อให้คำสั่งประมวลผล

สิ่งหนึ่งที่ผมคิดว่าเป็นมูลค่าเพิ่มคือการที่คุณสามารถใช้ jQuery ปกติเมื่อคุณได้รวมไว้ในสคริปต์ของคุณ, ยกเว้นสำหรับวิธีการ AJAX โดยค่าเริ่มต้น jQuery ค้นหา XMLHttpRequest ซึ่งไม่มีอยู่ในบริบท Greasemonkey ฉันเขียนเกี่ยวกับวิธีแก้ปัญหาที่คุณสร้าง wrapper สำหรับ GM_xmlhttpRequest (รุ่น Greasemonkey ของ XHR) และใช้ jQuery's ajaxSetup()เพื่อระบุรุ่นที่คุณใช้เป็นค่าเริ่มต้น เมื่อคุณทำเช่นนี้คุณสามารถใช้$.getและ$.postตามปกติ

คุณอาจมีปัญหากับ jQuery $.getJSONเพราะมันโหลด JSONP โดยใช้<script>แท็ก สิ่งนี้นำไปสู่ข้อผิดพลาดเนื่องจาก jQuery กำหนดฟังก์ชันการโทรกลับในขอบเขตของหน้าต่าง Greasemonkey และสคริปต์ที่โหลดจะค้นหาการโทรกลับในขอบเขตของหน้าต่างหลัก ทางออกที่ดีที่สุดของคุณคือการใช้แทนและแยกผลด้วย$.getJSON.parse()


4

คุณสามารถสร้างสคริปต์ใหม่โดยใช้สคริปต์ผู้ใช้ใหม่ใน Greasemonkey แต่คุณต้องแก้ไขไฟล์ config.xml ภายในโฟลเดอร์ gm_scripts

ไฟล์config.xmlของคุณควรมีไวยากรณ์ที่คล้ายกันดังนี้:

<Script filename="jquery_test.user.js" name="jQuery Test" namespace="http://www.example.com/jQueryPlay/" description="Just a test" enabled="true" basedir="jquery_test">
        <Include>http://*</Include>
        <Require filename="jquery.js"/>
</Script>

สังเกตเห็น<Require>แท็ก

ในสคริปต์ของคุณคุณสามารถใช้ไวยากรณ์ jQuery โดยตรง ตรวจสอบให้แน่ใจว่าคุณมีแท็กที่จำเป็นในส่วนหัวของ Greasemonkey นี่คือตัวอย่าง Hello World:

// ==UserScript==
// @name           Test jQuery
// @namespace      http://www.example.com/jQueryPlay/
// @description    Just a test
// @include        http://*
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js
// ==/UserScript==

$(document).ready(function() {  
        alert("Hello world!");
});

จำไว้ว่าหลังจากแก้ไขconfig.xml แล้วคุณต้องรีสตาร์ทเบราว์เซอร์ของคุณเพื่อให้ Greasemonkey ทำการโหลดการตั้งค่าอีกครั้ง

นอกจากนี้โปรดทราบว่าคุณต้องคัดลอกไฟล์ jquery.js ไปยังโฟลเดอร์ไดเรกทอรีสคริปต์ของคุณเพื่อให้สามารถใช้งานได้ ฉันทดสอบและใช้งานได้เฉพาะในกรณีที่คุณคัดลอกไฟล์ด้วยตนเองที่นั่น

มีความสุข jQuerying!


4

ปรับปรุง : ตามความเห็นด้านล่างบอกว่าคำตอบนี้ล้าสมัย

ดังที่คนอื่น ๆ ได้กล่าวไว้ @require จะเรียกใช้เมื่อสคริปต์ติดตั้งแล้วเท่านั้น อย่างไรก็ตามคุณควรทราบเช่นกันว่าปัจจุบัน jQuery 1.4. * ใช้งานไม่ได้กับ greasemonkey คุณสามารถดูรายละเอียดได้ที่นี่: http://forum.jquery.com/topic/importing-jquery-1-4-1-into-greasemonkey-scripts-generates-an-error-

คุณจะต้องใช้ jQuery 1.3.2 จนกว่าสิ่งต่างๆจะเปลี่ยนไป


3
คำตอบนี้ล้าสมัยตั้งแต่ GM เวอร์ชัน 0.9 ขึ้นไป
บร็อคอดัมส์

3
@Brock: ทำไม คุณช่วยอธิบาย noobs ให้เราได้ไหม
Trevor Sullivan

4

@requireหากคุณกำลังใช้โครเมี่ยมที่คุณต้องเลือกสำหรับทางเลือกที่เป็นโครเมี่ยมไม่สนับสนุน

ที่มา: โครงการ Chromium - สคริปต์ผู้ใช้

รายละเอียดและทางเลือกเพิ่มเติมเกี่ยวกับฉันจะใช้ jQuery ในสคริปต์ Greasemonkey ใน Google Chrome ได้อย่างไร


2

@require meta ไม่ทำงานเมื่อคุณต้องการยกเลิกการผูกเหตุการณ์บนเว็บเพจโดยใช้ jQuery คุณต้องใช้ไลบรารี jQuery ที่รวมอยู่ในเว็บเพจและจากนั้นรับใน Greasemonkey ด้วยvar $ = unsafeWindow.jQuery; ฉันจะยกเลิกการจัดการ jquery event ใน greasemonkey ได้อย่างไร?


1

คุณอาจได้รับComponent unavailableถ้าคุณนำเข้าสคริปต์ jQuery โดยตรง

บางทีมันอาจเป็นสิ่งที่ @Conley พูดถึง ...

คุณสามารถใช้ได้

@require        http://userscripts.org/scripts/source/85365.user.js

ซึ่งเป็นรุ่นที่ได้รับการแก้ไขให้ทำงานบน Greasemonkey แล้วรับวัตถุ jQuery

var $ = unsafeWindow.jQuery;
$("div").css("display", "none");

ฉันรู้ว่านี่คือ 5 yo แต่เพียงแค่สงสัยว่า: มันไม่ผิดที่จะได้รับวัตถุ jQuery เหมือนที่มันถูกกำหนดไว้แล้วในหน้าซึ่งอ้างถึงว่าเป็น unsafeWindow.jQuery?
jj_

0

@requireจะไม่ได้ดำเนินการเฉพาะเมื่อสคริปต์มีการติดตั้งครั้งแรก! จากการสังเกตของฉันมันจะถูกทดสอบในครั้งแรก! ดังนั้นคุณสามารถติดตั้งสคริปต์ผ่านคำสั่งของ Greasemonkey เพื่อสร้างสคริปต์ใหม่ สิ่งเดียวที่คุณต้องระวังคือไม่มีการโหลดหน้าขึ้นมาใหม่เพราะคุณเพิ่ม@requireส่วน (และบันทึกสคริปต์ใหม่ ... )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.