dojo is not defined!

dojo js dojo js dojo js dojo js dojo js dojo js dojo js dojo js dojo js 立即下载

使用dojo工具包的步聚很简单,只有三步:

1. 在文档的head节引入dojo.js:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js" type="text/javascript"></script>
这里dojo.xd.js中的xd是cross domain loading的意思。当你使用dojo.xd.js时,dojo对在dojo.js后面加载的那些javascript文件使用cross domain loading技术,以利用browser的多线程下载,最终达到快速加载的目的。

2. 在head节中引用样式表声明:

<link rel="stylesheet" type="text/css" href="http://…/dojolib/dijit/themes/tundra/tundra.css">

3. 在<body>标签上添加样式声明:

<body class="tundra">

tundra是dojo自带的样式属性之一。

然后就可以在页面中使用dojo提供的各种API了。我把上面的方式称作静态链接到dojo工具包。在一些特殊场合,比如user script技术或者bookmarklet中引入dojo工具包,此时可称为动态链接到dojo工具包。

以Greasemonkey的用户脚本为例,新建一个用户脚本,使它对任意网页生效(但注意避开那些已经使用dojo工具包的页面),代码示例如下:

// Create script tag in head
var dojoUrl = "http://example.com/dojolib/dojo/dojo.js";
var dojoStyleUrl = "http://example.com/dojolib/dijit/themes/tundra/tundra.css";

var script = document.createElement("script");
script.src = dojoUrl;
document.getElementsByTagName("head")[0].appendChild(script);        

// Create link style in head
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = dojoStyleUrl;
document.getElementsByTagName("head")[0].appendChild(link);

unsafeWindow.addEventListener("load", function(event) {
    document.body.className += (" tundra");
    var dojo = unsafeWindow["dojo"];
    dojo.fadeOut({node:document.body}).play();  // This line will complain!
});
略微解释一下代码。首先代码在文档的head部分引入dojo.js和相应的样式文件。并通过addEventListener语句,在文档完成加载时,修改body标签,使之具有tundra样式。最后,它调用dojo的功能,试图使整个页面淡出。这里的unsafeWindow是Greasemonkey引入的一个包装对象,提供了大部分的'window'对象的属性和功能,我们只要将其视作'window'对象就可以了。

在你的站点上布署dojo工具包的1.6版的SDK版(注意为重现该错误,一定要布署SDK版)。运行上面的代码,会得到dojo is not defined错误。当然,这里的dojo只是个局部变量,但它的实质是指出了window['dojo'] is no defined。

啊哈!dojo加载不成功,问题出在哪儿?

SDK版的dojo.js只是一个纯粹的加载器。如果要说它还做了点别的事情,就是定义了dojoConfig这个变量。所以在上述有问题的代码执行出错时,仍然可以看到window.dojoConfig对象有定义。而release版的dojo.js则包含了dojo core的全部功能,即它的名字空间和包管理体系,一些语法糖衣,动画效果等。

SDK版的dojo.js负责加载下面4个重要的文件:

dojo/_base/_loader/bootstrap.js,
dojo/_base/_loader/loader.js,
dojo/_base/_loader/hostenv_browser.js,
dojo/_base.js

加载方式就是在文档的head部分创建外部链接的<script>标签。问题就出在这里。如果你使用动态链接的方式,当页面加载完成后,你并不会在<head>标签里看到对这些文件的引用。这个结果是由于dojo的加载方式决定的。

当dojo.js试图加载上述脚本时,在browser环境(dojo支持各种运行时环境,如rihno,Firefox扩展等)下,它使用这样的语句创建标签:

var tmps = [
   http://.../dojolib/dojo/_base/_loader/bootstrap.js,
   http://.../dojolib/dojo/_base/_loader/loader.js,
   http://.../dojolib/dojo/_base/_loader/hostenv_browser.js,
   http://.../dojolib/dojo/_base.js
]

for (var x = 0; x < tmps.length; x++){
    document.write("<scr"+"ipt type='text/javascript' src='"+tmps[x]+"'></scr"+"ipt>");
}

此时document.write()并不会导致有效地输出。document.write()只能在页面解析时,其输出才会被当作页面内容的一部分。在页面解析完毕后,修改文档内容只能通过DOM API来完成。而Greasemonkey调用user script的时间,应该就是文档解析完毕之后。

要避免/改正这个问题,可以:

1. 使用release版的dojo.js

2. 修改用户脚本,通过DOM API来加载上述4个文件。修改后的用户脚本如下:

// Create script tag in head
var dojoUrl = "http://example.com/dojolib/dojo/dojo.js";
var dojoStyleUrl = "http://example.com/dojolib/dijit/themes/tundra/tundra.css";

var script = document.createElement("script");
script.src = dojoUrl;
document.getElementsByTagName("head")[0].appendChild(script);

var tmps = [
    "http://example.com/dojolib/dojo/_base/_loader/bootstrap.js",
    "http://example.com/dojolib/dojo/_base/_loader/loader.js",
    "http://example.com/dojolib/dojo/_base/_loader/hostenv_browser.js",
    "http://example.com/dojolib/dojo/_base.js"
];

for (var x in tmps){
    var _script = document.createElement('script');
    _script.src = tmps[x];
    document.getElementsByTagName('head')[0].appendChild(_script);
}
            

// Create link style in head
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = dojoStyleUrl;
document.getElementsByTagName("head")[0].appendChild(link);

unsafeWindow.addEventListener("load", function(event) {
    document.body.className += (" tundra");
    console.log(unsafeWindow["dojo"]);     //this line will complains unsafeWindow["dojo"] is not defined
});

结论:SDK版的dojo.js使用了document.write()来创建script标签,从而实现dojo的加载。在某些场合下,document.write()语句并不会像期望的那样工作,应该改用DOM API来操作。上述问题我已当作一个bug提交给dojo开发人员,track ID为13970.
保姆级教程:用OpenCV和MediaPipe在Python里实现实时手势识别(附完整代码) 本文提供了一份详细的Python教程,教你如何使用OpenCV和MediaPipe实现实时手势识别系统。从环境配置、手部关键点检测到手势分类算法,逐步讲解如何构建高精度手势识别应用,适用于智能家居控制、PPT操作等场景。教程包含完整代码示例和性能优化技巧,特别适合计算机视觉初学者和开发者实践。 阅读详情

相关推荐

Wincc7.5SP1 按钮操作记录(二次确认及语音播报)

Wincc 7.5 SP1 按钮操作记录生成(含二次确认及语音播报) 前面一篇文章已经介绍了“语音播报WINCC报警”,本文是之前功能的延伸,记录按钮操作记录并实现播报。 操作记录及语音播报效果 <创建消息文本> 1. 创建消息文本 消息编号100,消息等级“系统无确认”,消息类型“操作员输入消息”,消息文本“循环水泵启动操作”,其他参数默认。 消息编号101,消息等级“系

徐站的春天 1万+

dojo is not defined

关于使用时在Firefox3中出现dojo is not defined的解决方法(试试看) I am not sure what the exact problem is, but it has to do with the way that browser_debug.js gets processed. One would think that this file would onl...

justshare的专栏 756

ndnSIM学习笔记(一)

在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python &gt;= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib...

gaonjzzz的博客 2985

dojo未定义

今天遇到了dojo未定义,按照下面的方法解决了问题,转载备忘:   今天在运行项目时,页面突然报错“dojo未定义”!奇怪了,昨天还好好的,怎么今天就出了这个问题呢,在&lt;SCRIPT type="text/javascript" scr="/dojo.js"&gt;里指明dojo库文件路径后还是也不行,郁闷死了。结果上网找了一下,发现有位仁兄跟我的问题差不多,看了他的解释才恍然大悟。...

记录 573

新手避坑指南:用Silvaco Atlas搞定GaN HEMT电热仿真的完整流程(附代码解读)

本文详细介绍了使用Silvaco Atlas进行GaN HEMT电热特性仿真的完整流程,特别针对新手常见问题提供避坑指南。从软件环境配置、结构定义、网格划分到物理模型设置,逐步解析关键步骤,并附有代码解读和调试技巧,帮助读者快速掌握GaN器件仿真的核心技术。

weixin_29215815的博客 597

飞常准小程序接口逆向分析:如何破解航班查询的签名机制

本文深度解析了飞常准小程序航班查询接口的安全机制,重点剖析了其基于MD5和参数排序的签名算法。通过逆向分析核心代码,详细阐述了签名生成流程,并提供了Python实现的签名生成器与调试技巧,为开发者理解与模拟此类接口调用提供了实战指南。

zz67890的博客 531

ArcGIS API for JavaScript 报错Uncaught ReferenceError:define is not defined

前言 &nbsp;&nbsp;&nbsp;&nbsp;使用ArcGIS API for JavaScript时控制台报错如下: 出错原因 &nbsp;&nbsp;&nbsp;&nbsp;我在dojoConfig中配置了本地自定义文件模块路径。但是我同时引入了已定义的模块文件,导致报错。 var dojoConfig = { //用于定义dojo核心示范异步加载,true...

idomyway的博客 1万+

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1235

dojo报错总结

dojo报错总结 1、错误一 neteaseTracker is not defined dojo.js(第15行) 2、错误二 _10 is undefined _SearchMixin.js(第5行) 3、错误三 data.items[i] is...

牛栏山矿泉水 290

Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍

下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua...

腿足机器人领域 1678

【python基础】一文掌握 Jupyter Notebook 的使用(超级详细!)

是一个非营利组织,致力于为多种编程语言的交互式计算开发开源软件、开放标准和服务。Jupyter 于 2014 年由 Fernando Pérez 从IPython衍生出来,支持几十种编程语言的执行环境。Jupyter 项目主要开发并支持(.ipynb 文件格式)、JupyterHub和JupyterLab等交互式计算产品。

数据知道的博客 1万+

Dojo 日期控件的国际化和集成

Dojo 日期控件的国际化和集成 分类: Dojo2010-11-13 14:31 888人阅读 评论(1) 收藏 举报 dojodatetextbox编程functionmanager   Dojo 日期控件类型   Dojo 目前支持两种日期控件: 图 1. dijit.form.TimeTextBox   该类型控件为时间控件 , 图

hsg77的专栏 1317

SCADA|测试KingSCADA4.0信创版采集汇川PLC AC810数据

摘要:雷工分享KingSCADA4.0信创版采集汇川PLC数据的配置过程。由于项目繁忙,笔记更新延迟。信创产业要求采用国产化产品,此次通过ModbusTCP协议连接AC810 PLC。主要步骤包括:新建IOServer应用(需厂家协助从3.8升级至4.0)、安装ModbusTCP驱动、配置设备地址(192.168.1.88:5021)、运行IOServer并通过网页监控变量。尽管信创版操作体验较差,但出于国产化战略需要仍需使用。雷工表示理解产品初期不足,相信未来会逐步优化。2025年4月11日记录于四川绵阳

做有价值的事,积累有价值的笔记! 863

struts2 的ajax校验的问题(dojo is not defined)

完全模仿struts2的例子程序写的ajax校验(后来改得狗基本上一摸一样了)。始终出错:dojo is not defined。 页面已经生成了: &lt;script language="JavaScript" type="text/javascript"&gt; // Dojo configuration djConfig = { baseRelativePa...

gc加油! 210

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

在xpage开发的时候出现xsp is not defined的错误

今天在用xpage开发东西的时候,页面上只放了一个按钮,并为他添加了一个简单的click函数,但是在页面加载的时候报“xsp is not defined”,后来才想到,我把domino自带dojo 换成最新的1.6了,由于domino自带的dojo是经过IBM定制的,所以造成

学习 706

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

dojo 框架实战笔记

parseOnLoad: true 该属性表示在页面加载完成后,启用Dojo的解析模块对Dojo标签进行解析,如果parseOnLoad:false,声明式小部件就不起作用了。 在Dijit里,添加一个组件实际上是为一个HTML标签添加dojotype属性。 async: true,启用异步模式,则不存在全局对象dojo 默认是false dojo/domReady! is an AMD loaded plugin that will wait until the DOM has finished load

bsxylj的专栏 567

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Dojo学习笔记(五)-djConfig详解

 djConfig是dojo内置的一个全局设置对象,其作用是可以通过其控制dojo的行为 首先我们需要在引用dojo.js前声明djConfig对象,以便在加载dojo.js的时候才能够取得所设置的值,虽然在0.3版本以后dojo支持在加载后设置,但是强烈建议你把声明djConfig的代码作为第一段s cript 一个完整的djConfig对象定义如下(值均为dojo的默认值) var djCo

懒散狂徒的专栏 2327

dojo页面调试出错

今天,我在调试dojo页面时,出现一些未定义的错误,这些错误只显示在引入的js的那一行,并没有指出是页面哪儿出问题了。 出现的问题一: neteaseTracker is not defined 出现的问题二: _10 is not defined _SearchMixin.js(第69行)...

牛栏山矿泉水 189

dojo表格分页插件报错

dojo表格分页插件报错 (1)dojo/parser::parse() error ReferenceError {stack:(...),message:"layout is not defined"} (2)Error parsing in _ContentSetter #undefined ReferenceError{stack:(...),message:"layout i...

牛栏山矿泉水 315

解决ArcGISServer JavaScript API dojo未定义

ArcGISServer JavaScript API是才用的utf-8编码,当我们建的网站设置成gb2312编码时,就会报dojo未定义的错误,此时只需在引入JavaScript api时声明utf-8编码即可 http://10.9.34.84/jsapi" charset = "utf-8">

5370

struts2 dojo tree使用问题

1、界面tree树不显示问题 %@taglib prefix="s" uri="/struts-tags"%> String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()

breeze1998的专栏 1543

Dojo中declare和define的区别

Define先看define。作用是定义一个模块(module)。这个模块可以被require引用,引用了之后就可以使用define里面的东西。一个模块想当然,里面干什么事情,不一定全部自己实现。就像人要coding,除了脑子,也不能没有电脑、键盘。因此,define的第一个参数就是将要用到的其他模块引进来。第二个参数描述这个模块具体干什么,并且给第一个参数中的模块分别起一个朗朗上口的名字。就像下面

idomyway的博客 658

No tag "datetimepicker" defined 解决方法

环境:Struts2.1.6+spring+hibernate <br /><br />错误提示:org.apache.jasper.JasperException: /struts2/index.jsp(16,3) No tag "datetimepicker" defined in tag library imported with prefix "s" <br /><br />原因:struts2.1.6 把struts2.0中的和ajax相关的,如datetimepicker,tree,treeno

liangquan的专栏 1308

dojo.byId与registry.byId、dijit.byId

dojo.byId("")获取到的是dom之类的东西, 而registry.byid("")获取到的是dijit(dojo widget),要分清楚. registry在dojo的dijit/registry中。

qq_15167261的博客 1323

Dojo的define接口

http://blog.youkuaiyun.com/lovecarpenter/article/details/53979717 第三种用法用的最多。 此接口用于定义模块: define([],function(){}); 定义模块的形式: 1.如果只有键值对,没有任何的依赖项: define({ color: "black", size: "unisize" ...

weixin_30772261的博客 149
上一篇: Aptana 3 and say bye to others!
下一篇: Nginx日志分析--路径匹配篇
yaaron
博客等级 码龄19年 7粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值