0

私が遭遇している非常に奇妙な問題があります。私は自分のサイトの 1 つで JQueryUI の jsTree を使用しており、さまざまな .js ファイルでさまざまな実装を使用しています。そのうちの 1 つが機能しているように見えますが、壊れている実装とほぼ同じコード (変数名のみが異なる) を使用しているため、非常に混乱しています。問題は contextmenu 機能から来ています。私が使用しているコードは次のとおりです。

$(document).ready(function () {
    if(typeof dryerList == 'undefined' || dryerList.length == 0) {
        var dryerList = [];
        $.ajax({
            url:'../TrackingApp/getGrainBins.php?t=234.23423452353',
            async: false,
            success: function(text) {
                try {
                    dryerList = $.parseJSON(text);
                } catch (e) {
                    alert('ERROR: ' + e);
                }

                if(dryerList.length == 0) {
                    alert('ERROR: No fleet data received.')
                }
            }
        });
    }

    $("#dryerListTree").jstree({
        plugins : ['json_data', 'ui', 'themes', 'contextmenu'],
        contextmenu: {items: customBinMenu},
        json_data : { data: binNodes }
    });

    $('#dryerListTree').bind("dblclick.jstree", function (event) {
        var node = $(event.target).closest("li");
        var id = node[0].id;

        for(i=0; i < dryerList.length; i++) {
            if(id == dryerList[i].id) {
                centerMap(dryerList[i].y, dryerList[i].x);
                break;
            }
        }
    });
});


function customBinMenu(node) {
    if ($(node).hasClass("folder")) {
        return;
    }

    var items = {
        centerItem: {
            label: "Locate",
            action: function () {
                // Centers map on selected bin
                var id = node[0].id;

                for(i=0; i < dryerList.length; i++) {
                    if(id == dryerList[i].id) {
                        centerMap(dryerList[i].y, dryerList[i].x);
                        break;
                    }
                }
            }
        },
        dashboardItem: {
            label: "Dashboard",
            action: function () {
                // Opens dryer info window over map
                var id = node[0].id;
                var dryerIndex = -1;

                for(i=0; i < dryerList.length; i++) {
                    if(id == dryerList[i].id) {
                        dryerIndex = i;
                        break;
                    }
                }
            }
        }
    };

return items;
}

奇妙な点は、ダブルクリック ハンドラーが問題なく動作することです。customBinMenu() 関数に到達すると、dryerList 配列があり、dryerList[0] には 5 つの値のうちの 4 つが含まれていますが、何らかの理由で「id」要素がそのオブジェクトから削除されています。私はこれをかなり長い間見てきましたが、特に同じコードが同様のリストに対して機能している場合、他のデータを失うことなくオブジェクトから単一の要素を削除する方法を理解できません。助言がありますか?

4

1 に答える 1

1

わかりました、私はあなたの質問を読みました:「そしてドライヤーリスト[0]には5つの値のうち4つが含まれています-しかし、どういうわけか「id」要素がそのオブジェクトから削除されました」
したがって、「要素」「値」によって、 「属性」を意味する: 正確にはノードの「id」属性??

私はあなたのコードで見る:var id = node[0].id;

それは次のようになります。var id = node[0].getAttribute("id");

幸運を!

更新 1:
OK、(コメントに従って) var id = node[0].id;(node[0] から ID を取得する) が OKの場合if(id == dryerList[i].id)、id を node[0] の ID の値として (再) 定義しただけなので、間違っているように見えます。
実際、私は 'id' を var-name として使用しません (この場合)。

それで、あなたがした場合はどうなりますか:var idc = node[0].getAttribute("id");
そして:if(idc === dryerList[i].getAttribute("id"))

更新 5:ところで、まだいくつかのエラーがあります。

  • アラートを閉じるためのセミコロンを忘れました:
    if(dryerList.length == 0) { alert('ERROR: No fleet data received.') }
  • 2行目と14行目で「===」を使用して「0」と比較する必要があります
  • 当然、実生活では、関数 customBinMenu(node) を document.read 関数で使用する前に定義します。
    コードの順番を入れ替えて修正。
  • この document.ready 関数についても同じことが言えます。ここでは、定義される前に var dryerList を使用しました。
    修正:var dryerList = dryerList || []; if(dryerList.length === 0){//ajax & json code}

現在有効な javascriptであるこの fiddleが、意図したベースライン コードを表しているかどうかを確認してください。これは問題ではないとコメントしたため、更新1で言及されたもの を除いて、このjsfiddleで修正された単純なエラー)?

(document.ready から始めたので) 質問してもよろしいですか? なぜ、(まだ) dryerList が存在するかどうかを確認するのですか?
その修正されたフィドルを、私たちがいじるためのデモデータで更新していただけないでしょうか?

于 2012-08-08T17:21:33.790 に答える