独自のデータを入力できるデータ視覚化ツールを作成しています。データ値は、次のような順不同のリストに格納されます<ul><li data-name='name'><a href='#' onclick='showEditDv(this);'>Edit</a><span class='name'>name</span><span class='seperator'> | </span><span class='value'>7</span></li></ul
。リストには複数のリスト項目を含めることができます。[編集] ボタンをクリックすると、showEditDv()
関数が呼び出され、それ自体への参照が与えられます。関数を示す前に、data
オブジェクトが次のように構成されていることを述べておきます。
data ->
name: "root",
children: [ {name: "something", size: "7"},
{name: "something-else", size: "999"} ]
これは関数のコードです:
function showEditDv(object) {
var name = $(object).parent().attr("data-name"),
input = new Opentip($(object), {removeElementsOnHide: true, target: null, showOn: null, hideTrigger: "closeButton"}),
disabled = (data.children[getChildIndexByName(name)].hasOwnProperty("children")) ? "disabled" : "";
input.setContent("<label>Name:</label><input type='text' data-prevname='" + name + "' value='" + name + "' class='dv-add-name' /><label>Value:</label><input " + disabled + " type='text' class='dv-add-value' value='" + data.children[getChildIndexByName(name)].size + "' /><button class='callEditDv'>Apply</button>"); // Set content of opentip
input.show();
$("body").on("click", ".callEditDv", function() {
var newname = $(this).siblings(".dv-add-name").val(),
prevname = $(this).siblings(".dv-add-name").attr("data-prevname"),
value = $(this).siblings(".dv-add-value").val();
if (newname !== prevname)
{
data.children[ getChildIndexByName(prevname) ].name = newname; // Update name
$(object).parent().attr("data-name", newname); // Update parent data
$(object).siblings(".name").text(newname); // Update form
}
if (data.children[ getChildIndexByName(newname) ].size !== value)
{
data.children[ getChildIndexByName(newname) ].size = value;
$(object).siblings(".value").text(value);
}
input.hide();
});
}
Opentip を使用します。これは、動的なポップアップ/ツールチップを作成する方法の 1 つです。問題は、データ値を 1 回変更すると、再度変更しようとすると、コードが 2 回ループすることです。最初はすべてが期待どおりに機能しますが、2 回目は同じ を使用して再度実行します。これは、変数が返され、変数を設定できず、エラーが発生することprevname
を意味します。一致が見つかるまで名前をチェックする値をループし、配列内のオブジェクトのインデックスを返します。getChildIndexByName
undefined
getChildIndexByName
data.children
前もって感謝します!