2010-12-02 12 views
2

jQuery data()を使用してメタデータを格納しますが、jQuery 1.4.4と1.4.3の両方に問題があるようです。一部の部品は動作し、他の部品は動作しません。例えばjQuery data()は未定義を返します

、私は要素がDOM要素である

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 { 
... 

} 

を持っています。次に、私は次のように格納した値を取得します。

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はチェックアウトして、次のコマンドを実行します:

mvn install 

、その後のFirefoxに生成された.xpiファイルをインストールします。

その後、Tellurium IDE FirefoxプラグインとJavaScriptデバッガーFirefoxプラグインを開いて実行を追跡できます。

この問題は、workspace.jsに移動し、findAncestor()メソッドの先頭にブレークポインタを設定してください。

もっとテルルIDEについての詳細はこちらです:事前に

http://code.google.com/p/aost/wiki/TelluriumIde080RC1

おかげで、

jslintでコードを貼り付けるジョン

+0

'Workspace.prototype.findAncestor'が呼び出されていますか?おそらく '' console.log( 'データが設定されました:' + this.ancestor.data(UimConst.HEIGHT)); ' – clarkf

+0

はい、すぐに設定されることを証明する何らかの出力を追加してみてください。いわゆる。実行フローをトレースするためにJavaScriptデバッガを使用しました。 –

答えて

0

が役立ちます。あなたはそこに良いヒントをたくさん得ることができます。

const宣言はすべてのブラウザで機能しないため、varに変更するのがヒントです。

しかし、コードを実行するには十分ではありません。

詳細については、Javascript module design patternこちらのヒントをご覧ください。

+0

さて、私はFirefoxのプラグインを使っていますが、たくさんのファイルがあり、jslintにカットアンドペーストするのは難しいです。しかし、私はjslint Mavenプラグインを実行しましたが、jQueryライブラリであっても警告が多すぎます。それほど役に立たない。 –

2

elementnullの場合、または文書内の要素と一致しない文字列の場合に発生します。

$(element).data(key, value)$(element).length == 0の場合は何もしません。

jQueryはまた、特定の要素(embedapplet、およびFlash以外のobject)にデータを格納するのを黙って拒否しますが、問題はないようです。

更新:これがFirefoxのアドオンコードでWebページの要素を操作しようとしている場合、それがうまくいかないことは驚きではありません。アドオンで使用すると、要素の動作がちょっと違うので、通常のWebページでうまく動作するライブラリ(jQueryなど)はアドオンで動作しない可能性があります。

更新2:私の新しいアドバイスは、http://code.jquery.com/jquery-latest.jsなどの開発バージョンのjQueryを使用し、デバッガのデータメソッドをステップ実行することです。興味深いのは、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; 
}, 
+0

要素は、Firefoxプラグインが取得したDOM要素であり、nullではありません。 JavaScriptデバッガでチェックしました。それは実際には入力ボックスです。 –

+0

ありがとうございます。そのような場合は、別の実装を探す必要があります。しかし、有線のものは、同じプロジェクトの他の場所でかなりjQueryデータを使用していたことです。 –

関連する問題