Jhtml :: skrip pesanan - cara menunda hingga jQuery dimuat?

11

Saya menggunakan JHtml::scriptuntuk menambahkan skrip ke halaman saya dalam modul yang dikembangkan khusus. Namun, skrip ini disuntikkan ke kepala sebelum J3 menambahkan di jQuery - misalnya:

<!-- my module js -->
<script src="/modules/mod_tiles/js/jquery.isotope.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/jquery.hoverintent.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/mod_tiles.js" type="text/javascript"></script>
<!-- then joomla loads jQuery --->
<script src="/media/jui/js/jquery-noconflict.js" type="text/javascript"></script>
<script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>

Bagaimana saya bisa memaksa Joomla untuk memuat jQuery sebelum skrip lain?

tangan coding
sumber

Jawaban:

15

Anda harus menelepon

JHtml::_('jquery.framework');

sebelum JHtml :: script Anda yang lain. AFAIK ini memastikan bahwa jQuery dimuat terlebih dahulu.

fruppel
sumber
Ini adalah satu-satunya solusi yang bekerja untuk saya - ditempatkan di mod_tiles.phpjQuery paksa ini untuk memuat pertama. Terima kasih!
codinghands
1
@codinghands docs.joomla.org/...
Ville Niemi
2

jika saya membaca pertanyaan Anda dengan benar, Anda sedang mengembangkan modul Anda sendiri.

Coba ini, di default.php - tampilan modul (dalam "tmpl"):

JHtml::stylesheet('modules/'.$module->module.'/assets/css/yourfile.css');

JHtml::script('modules/'.$module->module.'/assets/js/yourscript.js');

Atau ini :

JHtml::_('stylesheet', 'modules/'.$module->module.'/assets/css/anotherfile.css');

JHtml::_('script', 'modules/'.$module->module.'/assets/js/othercript.js');

Dalam kedua kasus, file JS Anda harus disuntikkan setelah jQuery, asalkan Anda membuat folder "aset", dan folder "css" dan "js" di dalamnya.

Solusi kedua lebih sesuai dengan joomla 3.XX API.

Semoga ini bisa membantu.

ghazal
sumber
Satu-satunya perubahan yang saya buat di sini adalah menambahkan assetsfolder - ini tidak membuat perbedaan, dan skrip masih memuat sebelum jQuery melakukannya. Saya juga bertanya-tanya tentang kebijaksanaan dalam menempatkan kode semacam ini dalam file templat (terutama jika ada beberapa templat menggunakan skrip yang sama, KERING dll.)
codinghands
Hem, komentar Anda aneh -> "menempatkan kode semacam ini dalam file templat". Saya, dan mungkin itu tidak cukup jelas, berbicara tentang modul yang dikembangkan oleh Anda dan berdasarkan isotop.js dan skrip JS lainnya. Saya sangat menyesal jika saya salah dan Anda benar-benar menggunakan modul pihak ketiga yang disebut mod_tiles. BTW, ada cara lain untuk menyisipkan skrip JS dalam templat.
ghazal
Maaf, saya tidak bermaksud terdengar sangat keras haha! Pasti terlalu awal ... Anda benar, itulah yang saya lakukan - ini modul saya. Apa yang saya maksud dengan file templat ada default.phpdi tmplfolder (templat) modul. Saya akan berpikir skrip harus dimuat dalam mod_tiles.php('controller') daripada default.php(tampilan).
coding tangan
Menempatkannya di tmpl / default.php memungkinkan penggantian. Di mod_tiles.php tidak bisa diganti.
sovainfo
2

Saya mengalami masalah ini minggu lalu dan itu terkait dengan tempat saya memanggil JHtml :: script. Apakah Anda melakukan ini dalam tampilan Anda atau template tampilan? Jika Anda mencoba untuk menambahkan skrip dalam tampilan itu sendiri (views / yourview / view.html.php) mereka akan dimasukkan sebelum skrip Joomla sendiri, tetapi jika Anda menambahkan skrip dalam template (views / yourview / tmpl / default.php) mereka akan dimasukkan setelah skrip Joomla!

Semoga berhasil!

Draper Zachary
sumber
Ini modul dengan hanya mod_tiles.php, file helper.php dan satu templat (default.php) di tmpl. Saya mencoba menambahkan skrip di mod_tiles.php dan default.php - keduanya dimuat sebelum jQuery.
codinghands
0

Ini mungkin karena metode yang digunakan pengembang mod_tilesuntuk mengimpor skrip. Saya berasumsi mereka tidak terjebak dengan standar pengkodean Joomla dalam situasi ini.

Anda memiliki 2 opsi (yang dapat saya pikirkan) hwre:

  1. Jika skrip diimpor dari file di dalam folder tmpl di dalam modul, Anda dapat melakukan Template Override dan mengubah cara skrip diimpor, menggunakan JHtml.
  2. Anda dapat mengunduh dan menginstal jQuery Easy yang merupakan plugin yang mengimpor jQuery dan menempatkannya di atas semua skrip lainnya.

Semoga ini membantu

Lodder
sumber
Saya mengembangkan modul - metode apa yang harus saya gunakan? Saya menanyakan hal ini dalam sebuah pertanyaan ( joomla.stackexchange.com/questions/325/… ) dan diberi tahu JHtml :: script adalah jalan ke depan.
codinghands
0

Saya ingin menambahkan dua-bit saya setelah fakta. Saya punya beberapa skrip dan style sheet yang perlu dimuat untuk setiap tampilan yang kita miliki dalam komponen, dan ingin satu titik agar itu terjadi memastikan juga bahwa mereka dimuat dalam urutan yang benar.

Dalam file components\myComponent\mycomponent.php:

defined('_JEXEC') or die;

// Include dependancies
jimport('joomla.application.component.controller');

JHtml::stylesheet('http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css', array(), true);
JHtml::stylesheet('components/com_mycomponent/assets/css/mycomponent.css');

JHtml::_('jquery.framework');   // Make sure jQuery is loaded before component JS
JHtml::script( 'components/mycomponent/assets/js/jquery.cookie.js');

// Execute the task.
$controller = JControllerLegacy::getInstance('Mycomponent');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
PDB
sumber
-1

Saya tahu ini adalah topik lama tetapi apakah Anda pernah sampai di bagian bawah ini? Saya baru saja mengalami masalah yang sama. Saya telah mengidentifikasi PENYEBAB tetapi bukan masalah / solusi; Saya memiliki dugaan licik bahwa itu adalah BUG tetapi bisa dilakukan dengan orang lain yang mencobanya.

Skenario: Anda telah membuat modul yang menyertakan skrip dependen jQuery sehingga Anda menggunakan yang berikut ini dalam tampilan default.php Anda:

$doc = JFactory::getDocument();
$doc->addScript("media/mod_accordion/js/accordion.js");

Anda kemudian menginstal modul dan memberikannya posisi modul, katakanlah 'kiri'. Ketika Anda melihat kode sumber ujung depan semuanya terlihat baik, semua skrip memuat setelah skrip yang termasuk dalam

JHtml::_('bootstrap.framework');

NAMUN jika Anda memberi modul posisi 'akordeon' dan gunakan fitur joomla loadposition untuk menambahkan modul ke artikel

{loadposition accordion}

kemudian accordion.js ditambahkan SEBELUM file bootstrap.framework.

Satu-satunya cara saya dapat membuatnya bekerja adalah dengan menambahkan skrip sebagai skrip inline daripada dimasukkan dalam kepala.

EDIT: yang sama berlaku untuk termasuk css; sedang ditambahkan ke bagian atas daftar deklarasi css (sebelum templat dan bootstrap file css). Tubuh untuk ini adalah untuk menambahkan! Penting untuk deklarasi css.

philip
sumber