我在项目中使用dojo toolkit,它使用require.js来加载脚本。 在on.js中,它会加载以下脚本:
define(["./has!dom-addeventlistener?:./aspect", "./_base/kernel", "./sniff"], function(aspect, dojo, has){
使用on.js时,我找不到错误:
Uncaught Error:
Missing: http://localhost:8585/dom-addeventlistener?:./aspect.js
我想知道./has!dom-addeventlistener?:./aspect
符号的作用是什么,如果我删除它可能带来的影响。当我只做./aspect
时,它似乎有效。
谢谢!
答案 0 :(得分:2)
当使用dojo/has
模块作为插件时,它的行为类似于三元运算符:
条件(三元)运算符是唯一需要三个操作数的JavaScript运算符。此运算符经常用作if语句的快捷方式。
condition ? expr1 : expr2
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
最佳解释来自参考文献中的以下示例:
require(["dojo/has", "dojo/has!touch?dojo/touch:dojo/mouse", "dojo/dom", "dojo/domReady!"],
function(has, hid, dom){
if(has("touch")){
dom.byId("output").innerHTML =
"You have a touch capable device and so I loaded <code>dojo/touch</code>.";
} else {
dom.byId("output").innerHTML =
"You do not have a touch capable device and so I loaded <code>dojo/mouse</code>.";
}
}
);
https://dojotoolkit.org/reference-guide/1.10/dojo/has.html
重要的一点:dojo/has!touch?dojo/touch:dojo/mouse
这里发生的是,加载dojo/has
模块并检查touch
(如果你有一个支持触摸的设备),如果测试没问题,那么&{ #39; s发现,它加载dojo/touch
。如果没有,则加载dojo/mouse
。
在您的情况下:./has!dom-addeventlistener?:./aspect"
,dojo/has
测试DOM的addEventListener方法的可用性。如果发现它没有加载任何内容,因为?
和:
之间的部分是无效的。如果未找到,则会加载dojo/aspect
。
如果模块也可以在浏览器中没有DOM的服务器端运行,则通常会使用这样的代码。我要说的是,如果你只在浏览器中运行,你可以安全地省略整个要求,因为每个体面的浏览器都支持addEventListener
也就是说,您所获得的错误是不能以某种方式dojo/has
相对模块路径正确加载。加载./aspect
时它也应该失败,但它并不奇怪。确保dojo/has
可用,因为删除要求是一种解决方法,而不是解决您实际问题的方法。