我使用jQuery data()来存储元数据,但似乎jQuery 1.4.4和1.4.3都存在问题。有些部件有效,有些部件不起作用。
例如,我有
const UimConst = {
NODE_OBJECT: "nodeObject",
CHILDREN: "children",
PARENT: "parent",
SID: "sid",
COUNT: "count",
EXCLUDE: "exclude",
PARENT_COUNT: "pcount",
HEIGHT: "UimHeight"
};
Workspace.prototype.findAncestor = function(element){
if(this.ancestor == null){
this.ancestor = $(element);
this.ancestor.data(UimConst.HEIGHT, 0);
} else {
...
}
其中element是DOM元素。然后,我得到我存储的值如下,
var height = this.ancestor.data(UimConst.HEIGHT);
logger.debug("Current UI module height " + height);
遗憾的是,返回值未定义。
为了进一步追踪问题,我将代码更改为
if(this.ancestor == null){
this.ancestor = $(element);
this.ancestor.data(UimConst.HEIGHT, 0);
logger.debug("After set the ancestor height, the value is " + this.ancestor.data(UimConst.HEIGHT));
} else {
日志中的返回值也是“未定义”。真的很沮丧。
我在其他地方使用过data()并且工作正常。不确定发生了什么。 任何提示?
如果有人想看看,项目就在这里:
http://aost.googlecode.com/svn/trunk/tools/tellurium-ide
只需执行subversion check out并运行以下命令:
mvn install
然后将生成的.xpi文件安装到Firefox。
之后,您可以打开Tellurium IDE Firefox插件和JavaScript调试器Firefox插件来跟踪执行情况。
对于此问题,请转到workspace.js并在findAncestor()方法的开头设置一个breakpointer。
有关Tellurium IDE的更多详细信息,请访问:
http://code.google.com/p/aost/wiki/TelluriumIde080RC1
提前致谢,
约翰
答案 0 :(得分:2)
如果element
为null
,或者字符串与文档中的任何元素都不匹配,就会发生这种情况。
$(element).data(key, value)
,则 $(element).length == 0
不执行任何操作。
jQuery也默默地拒绝在某些元素(embed
,applet
和除Flash之外的任何object
上存储数据,但这似乎不是你的问题。
更新:如果这是试图对网页中的元素进行操作的Firefox附加代码,那么我不会感到惊讶它不起作用。从附加组件中使用时,元素的行为略有不同,因此在普通网页中运行良好的库(如jQuery)可能无法在附加组件中工作。
更新2:我的新建议是使用jQuery的开发版本,例如http://code.jquery.com/jquery-latest.js,并逐步调试调试器中的数据方法。有趣的部分发生在jQuery.data中,它只有40多行:
data: function( elem, name, data ) {
[...]
var isNode = elem.nodeType,
id = isNode ? elem[ jQuery.expando ] : null,
cache = jQuery.cache, thisCache;
if ( isNode && !id && typeof name === "string" && data === undefined ) {
return;
}
// Get the data from the object directly
if ( !isNode ) {
cache = elem;
// Compute a unique ID for the element
} else if ( !id ) {
elem[ jQuery.expando ] = id = ++jQuery.uuid;
}
// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if ( typeof name === "object" ) {
if ( isNode ) {
cache[ id ] = jQuery.extend(cache[ id ], name);
} else {
jQuery.extend( cache, name );
}
} else if ( isNode && !cache[ id ] ) {
cache[ id ] = {};
}
thisCache = isNode ? cache[ id ] : cache;
// Prevent overriding the named cache with undefined values
if ( data !== undefined ) {
thisCache[ name ] = data;
}
return typeof name === "string" ? thisCache[ name ] : thisCache;
},
答案 1 :(得分:0)
将代码粘贴到jslint会有所帮助。你可以在那里获得很多好的提示。
const声明不适用于所有浏览器,因此将其更改为var是一个提示。
但是没有足够的代码可以做很多事情。
在Javascript module design pattern上查看这些提示,以获得进一步的帮助。
答案 2 :(得分:0)
您必须在Html标签的末尾连接js和jquery文件,就像->
<html>
<head>
</head>
<body>
<!--your body code goes here-->
<script src="jquery"></script>
<script src="js"></script>
</body>
</html>