如何确定jQuery是否已完全初始化?

时间:2015-12-14 10:20:57

标签: javascript jquery bookmarklet

我正在使用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(),'/');

2 个答案:

答案 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
}