jQuery data()返回undefined

时间:2010-12-02 20:11:56

标签: jquery

我使用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

提前致谢,

约翰

3 个答案:

答案 0 :(得分:2)

如果elementnull,或者字符串与文档中的任何元素都不匹配,就会发生这种情况。

如果$(element).data(key, value),则

$(element).length == 0不执行任何操作。

jQuery也默默地拒绝在某些元素(embedapplet和除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>