Saya mengalami masalah saat halaman dimuat dengan sangat cepat, sehingga jquery belum selesai memuat sebelum dipanggil oleh skrip berikutnya. Adakah cara untuk mengecek keberadaan jquery dan jika tidak ada, tunggu sebentar lalu coba lagi?
Menanggapi jawaban / komentar di bawah ini, saya memposting beberapa markup.
Situasi ... asp.net masterpage dan childpage.
Di halaman master, saya memiliki referensi ke jquery. Kemudian di halaman konten, saya memiliki referensi ke skrip khusus halaman. Ketika script khusus halaman sedang dimuat, ia mengeluh bahwa "$ tidak ditentukan".
Saya menempatkan peringatan di beberapa titik di markup untuk melihat urutan pengaktifan, dan mengonfirmasi bahwa pengaktifan dalam urutan ini:
- Header halaman master.
- Blok konten halaman anak 1 (terletak di dalam kepala halaman master, tetapi setelah skrip halaman master dipanggil).
- Blok konten halaman anak 2.
Berikut adalah markup di bagian atas halaman master:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="SiteMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Reporting Portal</title>
<link href="~/Styles/site.css" rel="stylesheet" type="text/css" />
<link href="~/Styles/red/red.css" rel="stylesheet" type="text/css" />
<script type="text/Scripts" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/jquery.dropdownPlain.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/facebox.js"></script>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
Kemudian di badan halaman master, ada ContentPlaceHolder tambahan:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
Di halaman anak, terlihat seperti ini:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Dashboard.aspx.cs" Inherits="Data.Dashboard" %>
<%@ Register src="../userControls/ucDropdownMenu.ascx" tagname="ucDropdownMenu" tagprefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<link rel="stylesheet" type="text/css" href="../Styles/paserMap.css" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
***CONTENT HERE***
<script src="../Scripts/Dashboard.js" type="text/javascript"></script>
</asp:Content>
Berikut adalah konten dari file "../Script/Dashboard.js":
$(document).ready(function () {
$('.tgl:first').show(); // Show the first div
//Description: East panel parent tab navigation
$('.tabNav label').click(function () {
$('.tabNav li').removeClass('active')
$(this).parent().addClass('active');
var index = $(this).parent('li').index();
var divToggle = $('.ui-layout-content').children('div.tgl');
//hide all subToggle divs
divToggle.hide();
divToggle.eq(index).show();
});
});
sumber
$(document).ready(function(){...});
?<script src="...">
tag sederhana , itu tidak dapat terjadi. Apakah Anda menggunakan sesuatu seperti RequireJS atau LABjs?$(document).ready()
atau$(window).load()
? Bisakah kita melihat contohnya?type="text/Scripts"
menjaditype="text/javascript"
, atau singkirkan semuanya bersama-sama yang tidak diperlukan lagi, juga singkirkanlanguage="javascript
. Sebaiknya mulai mencoba sesuatu.Jawaban:
edit
Bisakah Anda mencoba jenis yang benar untuk tag skrip Anda? Saya melihat Anda menggunakan
text/Scripts
, yang bukan mimetype yang tepat untuk javascript.Gunakan ini:
akhir edit
atau Anda bisa melihat require.js yang merupakan loader untuk kode javascript Anda.
tergantung pada proyek Anda, ini bisa jadi sedikit berlebihan
sumber
Terlambat ke pesta, dan mirip dengan pertanyaan Briguy37, tetapi untuk referensi di masa mendatang saya menggunakan metode berikut dan meneruskan fungsi yang ingin saya tunda hingga jQuery dimuat:
Ini akan secara rekursif memanggil metode defer setiap 50ms sampai
window.jQuery
ada saat itu keluar dan memanggilmethod()
Contoh dengan fungsi anonim:
sumber
script
tag yang memuat jQuery memilikidefer
atribut, itu akan menyebabkan masalah dengan tidak memuat sampai nanti, terlepas dari urutan skrip yang ditentukan kode.Anda dapat menggunakan atribut defer untuk memuat skrip di bagian akhir.
tetapi biasanya memuat skrip Anda dalam urutan yang benar harus melakukan trik, jadi pastikan untuk menempatkan penyertaan jquery sebelum skrip Anda sendiri
Jika kode Anda ada di halaman dan tidak dalam file js yang terpisah sehingga Anda harus mengeksekusi skrip Anda hanya setelah dokumen siap dan mengenkapsulasi kode Anda seperti ini seharusnya juga berfungsi:
sumber
Cara lain untuk melakukan ini, meskipun metode penundaan Darbio lebih fleksibel.
sumber
cara termudah dan teraman adalah dengan menggunakan sesuatu seperti ini:
sumber
Anda dapat mencoba acara onload. Itu muncul ketika semua skrip telah dimuat:
Namun perlu diingat, bahwa Anda dapat menimpa skrip lain yang menggunakan window.onload.
sumber
Saya telah menemukan bahwa solusi yang disarankan hanya berfungsi sambil memperhatikan kode asynchronous. Berikut adalah versi yang akan berfungsi dalam kedua kasus tersebut:
sumber
load
fungsinya tetapi juga menggunakannya kembalisetTimeout
.Ini masalah umum, bayangkan Anda menggunakan mesin templating PHP yang keren, jadi Anda memiliki tata letak dasar:
Dan tentu saja, Anda membaca di suatu tempat lebih baik memuat Javascript di bagian bawah halaman, sehingga konten dinamis Anda tidak tahu siapa itu jQuery (atau $).
Juga Anda membaca di suatu tempat itu baik untuk Javascript kecil sebaris, jadi bayangkan Anda membutuhkan jQuery di halaman, baboom, $ belum ditentukan (.. yet ^^).
Saya menyukai solusi yang disediakan Facebook
Jadi, sebagai pemrogram yang malas (menurut saya programmer yang baik ^^), Anda dapat menggunakan padanan (di dalam halaman Anda):
Dan tambahkan di bagian bawah tata letak Anda, setelah jQuery menyertakan
sumber
Daripada "menunggu" (yang biasanya dilakukan dengan menggunakan
setTimeout
), Anda juga dapat menggunakan definisi objek jQuery di jendela itu sendiri sebagai pengait untuk mengeksekusi kode Anda yang bergantung padanya. Ini dapat dicapai melalui definisi properti, yang ditentukan menggunakanObject.defineProperty
.sumber
window.jQuery
ke nilai, dengan mendefinisikanjQuery
variabel dalam lingkup global (yaituwindow
). Ini akan memicu fungsi penyetel properti pada objek jendela yang ditentukan dalam kode.</body>
bukan sebelumnya</head>
Menggunakan:
Lihat ini untuk info lebih lanjut: http://www.learningjquery.com/2006/09/introducing-document-ready
Catatan: Ini seharusnya berfungsi selama impor skrip untuk perpustakaan JQuery Anda di atas panggilan ini.
Memperbarui:
Jika karena alasan tertentu kode Anda tidak memuat secara serempak (yang
belum pernah saya temui, tetapi tampaknya mungkin dari komentar di bawah initidak terjadi), Anda dapat mengkodekannya seperti berikut.sumber
Saya tidak terlalu menyukai hal-hal interval. Ketika saya ingin menunda jquery, atau apapun sebenarnya, biasanya berjalan seperti ini.
Dimulai dari:
Kemudian:
Lalu akhirnya:
Atau versi yang tidak terlalu membingungkan:
Dan dalam kasus asinkron, Anda dapat menjalankan fungsi yang didorong pada jquery onload.
Kalau tidak:
sumber
Saya tidak berpikir itu masalah Anda. Pemuatan skrip sinkron secara default, jadi kecuali Anda menggunakan
defer
atribut atau memuat jQuery itu sendiri melalui permintaan AJAX lain, masalah Anda mungkin lebih seperti 404. Dapatkah Anda menunjukkan markup Anda, dan memberi tahu kami jika Anda melihat sesuatu yang mencurigakan di firebug atau inspektur web?sumber
Mari kembangkan
defer()
dari Dario menjadi lebih dapat digunakan kembali.Yang kemudian dijalankan:
sumber
Periksa ini:
https://jsfiddle.net/neohunter/ey2pqt5z/
Ini akan membuat objek jQuery palsu, yang memungkinkan Anda untuk menggunakan metode onload jquery, dan mereka akan dieksekusi segera setelah jquery dimuat.
Itu tidak sempurna.
sumber
Catatan tangensial tentang pendekatan di sini yang menggunakan beban
setTimeout
atausetInterval
. Dalam kasus tersebut, mungkin saja saat pemeriksaan Anda dijalankan lagi, DOM sudah dimuat, dan peristiwa browserDOMContentLoaded
akan diaktifkan, sehingga Anda tidak dapat mendeteksi peristiwa tersebut dengan andal menggunakan pendekatan ini. Apa yang saya temukan adalah bahwa jQueryready
masih berfungsi, jadi Anda dapat menyematkan seperti biasajQuery(document).ready(function ($) { ... }
di dalam Anda
setTimeout
atausetInterval
dan semuanya harus bekerja seperti biasa.sumber