我正在使用jQuery编写bookmarklet。它看起来像javascript:document.write('<script src="path/to/loader.js"></script>')
,loader.js
执行初始化工作:
check_the_environment();
document.head.innerHTML='<meta charset=utf-8>';
document.body.innerHTML='(the webpage)';
var jq=document.createElement('script');
jq.src='path/to/jquery.min.js';
document.head.appendChild(jq);
function load_core() {
if(window.$)
eval('(core js code)');
else
setTimeout(load_core,50);
}
load_core();
加载程序在jQuery可用后加载核心javascript代码。
但有时我的核心代码中会出现此错误:
$(...).on is not a function
虽然设置了$
变量,但jQuery似乎仍在初始化。
因此,在加载核心代码之前,我需要等待jQuery 完全初始化。我怎么能这样做?
使用$(document).ready(...)
的传统方式是不可行的,因为在网页准备就绪后,正在加载jQuery。
这是一个最小的Python代码,用于检查解决方案是否正常工作:
import cherrypy
mod='''
var htmlroot=document.getElementsByTagName('html')[0];
function load_core() {
if(window.jQuery)
jQuery(function(){
alert($(document).on);
});
else
setTimeout(load_core,10);
}
if(!document.head)
htmlroot.appendChild(document.createElement('head'));
var jquery=document.createElement('script');
jquery.src='http://libs.useso.com/js/jquery/2.1.1/jquery.min.js';
document.head.appendChild(jquery);
load_core();
'''
class Website:
@cherrypy.expose()
def mod(self,_time):
return mod
@cherrypy.expose()
def index(self):
return '''<a href="javascript:document.write('<script src=/mod/'+(+new Date())+' ></script>')">Mod</a>'''
cherrypy.quickstart(Website(),'/');
答案 0 :(得分:2)
正确而万无一失的方式是:
jQuery(function(){
// code
});
由于jQuery可能以noConflict模式加载,因此$
var可能尚未初始化。
为了提高工作效率,还可以使用以下内容访问$
范围内的jQuery
var。
jQuery(function($){
// you can use $ without worrying about conflicts now
});
答案 1 :(得分:0)
您可以检查$的类型如下
if(typeof $ == "function"){
//Jquery loaded
}