JHtml: script () และ $ doc-> addScript ต่างกันอย่างไร


10

ฉันพัฒนาโมดูลเมื่อเร็ว ๆ นี้ที่ต้องการไฟล์ JS และ CSS บางไฟล์เพื่อแทรกเข้าไปใน<head>แต่ละหน้า ตอนแรกฉันใช้:

$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');

อย่างไรก็ตามฉันสังเกตเห็นว่าเมื่อเปิดใช้งานการแคชเว็บไซต์โหลดทั้งรุ่นแคชจาก/cacheและรุ่นที่ไม่ใช่แคช/modules/mod_x/js/ทำให้เกิดข้อผิดพลาด JS

เมื่อฉันเปลี่ยนสิ่งนี้เป็น:

JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');

สคริปต์ถูกโหลดเพียงครั้งเดียวจากแคชเพื่อแก้ไขข้อผิดพลาดเหล่านี้

ฉันอ่านในเอกสารว่าaddScriptวิธีการดังกล่าวเป็น 'ระดับต่ำ' มากกว่าJHtml:scriptวิธีการ แต่นอกเหนือจากที่บอกว่า ...

แน่นอนคุณจะต้องใช้รหัสบางขั้นตอน [ที่ JHtml: สคริปต์ทำเพื่อคุณ] ด้วยตนเองซึ่งจะทำโดยอัตโนมัติโดยใช้ [JHtml: วิธีสคริปต์] ด้านบน [ถ้าคุณใช้ addScript]

... ไม่มีรายละเอียดเพิ่มเติม

ดังนั้นความแตกต่างคืออะไร? JHtml:scriptในที่สุดฉันคิดว่าจะเรียกaddScriptวัตถุเอกสารในบางจุด แต่ขั้นตอนตัวกลางอื่น ๆ ดำเนินการก่อนหรือไม่


4
ฉันได้เขียน joomla docs อีกครั้งเพื่อลองและอัปเดต - ดูว่าตอนนี้เหมาะสมแล้วหรือยัง?
George Wilson

1
@GeorgeWilson เอกสาร Joomla ได้รับการปรับปรุงให้ดีขึ้นเมื่อเร็ว ๆ นี้ ขอบคุณ :)
TryHarder

คำถามที่เกี่ยวข้องเกี่ยวกับ stylesheets: joomla.stackexchange.com/q/10062/5239
Flimm

คำตอบ:


8

JHtml::scriptมีตรรกะเพิ่มเติมรวมอยู่ด้วย ดูhttp://api.joomla.org/cms-3/classes/JHtml.html#method_scriptสำหรับการอ้างอิง API

โดยค่าเริ่มต้นมันจะตรวจจับการตั้งค่าการดีบักและเบราว์เซอร์ที่ใช้และโหลดสคริปต์ที่ตรงกัน ตัวอย่างเช่นเมื่อเปิดใช้งานการดีบักมันจะโหลดไฟล์ที่ไม่มีการบีบอัดหากมีอยู่

มีการตั้งค่าเพิ่มเติมที่อนุญาตให้แทนที่ไฟล์ในระดับเทมเพลตและสิ่งอื่น ๆ

Michael Babker เขียนคำแนะนำที่ดีเกี่ยวกับวิธีใช้JHtml::script()เพื่ออนุญาตการแทนที่: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

ฟังก์ชั่น repo สำหรับการอ้างอิง: https://github.com/joomla-cms/blob/staging/l ไลบรารี/cms/html/html/html.php#L659

หน้าเอกสารอย่างเป็นทางการที่อัพเดทโดยจอร์จ: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page


2
ขอบคุณสำหรับคำตอบ. การอ้างอิง API ค่อนข้างสั้น - มีคำอธิบายที่ครอบคลุมมากขึ้นเกี่ยวกับผลกระทบของ detect_browser และ detect_debug และเมื่อคุณพูดว่า 'การตั้งค่าเพิ่มเติม' และ 'สิ่งอื่น ๆ ' มีการบันทึกไว้ที่ใดบ้าง
เข้ารหัสรหัส

ฉันได้เพิ่มลิงก์ไปยังบทความโดย Michael ที่อธิบายถึงส่วนแทนที่ สำหรับส่วนของการดีบักและเบราว์เซอร์ฉันไม่คิดว่าจะมีเอกสารประกอบ คุณจะต้องอ่านรหัสสำหรับสิ่งนั้น
Bakual

1
ดังนั้นหากมีไฟล์ js ที่ไม่บีบอัดและบีบอัดเช่นและ debug เปิดอยู่ไฟล์นั้นจะโหลดชื่อไฟล์ - uncompressed.js และเพิ่ง filename.js เมื่อดีบักปิดอยู่ สำหรับเบราว์เซอร์เมื่อทำการดีบั๊กมันจะมองหา filename-browser.js จากนั้นให้ filename-browser-browserversion.js เป็นต้น
George Wilson

2
นี่เป็นคำตอบที่ไม่น่าเชื่อ - ขอบคุณ @Bakual และ @GeorgeWilson!
เข้ารหัส

1
อย่าลืมว่า JHtml ยังสามารถเพิ่ม MD5sum ของสคริปต์หรือสไตล์ชีทต่อท้ายแคชได้
Flimm

4

ในสองคำ:

  • JHtml::script() - ช่วยให้คุณสามารถแทนที่สคริปต์เฉพาะ (ยกเว้นที่แนบมากับ JDocument) แล้วขึ้นอยู่กับปัจจัยบางอย่าง (ดูที่ @Bakual answer);
  • $doc->addScript() - แนบสคริปต์โดยตรงกับเอกสารโดยไม่ตรวจสอบการแทนที่

หากคุณเป็นนักพัฒนาส่วนขยายขอแนะนำให้ใช้อย่างยิ่งJHtml::script()เมื่อคุณเพิ่มสคริปต์ สิ่งนี้จะช่วยให้ผู้ใช้ของคุณแทนที่สคริปต์บางอย่างขึ้นอยู่กับสิ่งที่พวกเขาต้องการ
นอกจากนี้ยังมีวิธีการที่คล้ายกันสำหรับ CSS

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