var els = [];
els.push($("#something"));
#something のプロパティが変更され、元のプロパティ (高さ、幅の位置など) を取得する必要があるため、これを配列に追加する必要があります。
els 配列内の要素を使用するにはどうすればよいですか?
var els = [];
els.push($("#something"));
#something のプロパティが変更され、元のプロパティ (高さ、幅の位置など) を取得する必要があるため、これを配列に追加する必要があります。
els 配列内の要素を使用するにはどうすればよいですか?
保存された jQuery オブジェクトを使用するには、通常の配列インデックスを使用するだけです。
els[0].css("backgroundColor", "purple");
ここで、その jQuery オブジェクトを保存してその状態を保持するとします。それはうまくいきません。jQuery オブジェクトは、セレクターによって選択された DOM 要素へのアクセスを提供する単なるラッパーです。ただし、DOM の状態をコピーまたは保持することはありません。DOM が変更された場合、それらの変更はその jQuery オブジェクトに反映され、古いプロパティ値は使用できなくなります。
要素の状態を保持したい場合は、明示的に行う必要があります。たとえば、「something」が の場合<input>
、その値を保存できます。
var savedValue = $('#something').val();
プロパティを配列に保存する場合:
var els = [];
els.push({
height: $('#something').height(),
width: $('#something').width(),
position: $('#something').position()
});
これにより、まったく新しいオブジェクト ( jQuery オブジェクトではなく、プロパティを持つ単純なオブジェクト) がプッシュされ、DOM の状態がキャプチャされます。
これで、「値」プロパティのコピーが得られました。その後の DOM の更新では、それが変更されることはありません。
「要素」とその「css」のコピーを保存して、すべてを利用できるようにする場合は、次のようにする必要があります。(POJS と jquery の例)
CSS
#target {
position: relative;
top: 100px;
left: 150px;
height: 50px;
width: 70px;
}
HTML
<div id="target">Text</div>
Javascript
// IE5+ support
function snapshot(node) {
var computedStyle = {},
style = {},
prop;
if (typeof document.defaultView.getComputedStyle === "function") {
computedStyle = document.defaultView.getComputedStyle(node, null);
} else if (node.currentStyle) {
computedStyle = node.currentStyle;
} else {
throw new Error("Unable to get a computed style.");
}
for (prop in computedStyle) {
if (computedStyle.hasOwnProperty(prop)) {
style[prop] = computedStyle[prop];
}
}
return {
node: node.cloneNode(true),
style: style
}
}
// Whatever jquery supports
$.fn.snapshot = function () {
var node = this.get(0),
computedStyle = {},
style = {},
prop;
if (typeof document.defaultView.getComputedStyle === "function") {
computedStyle = document.defaultView.getComputedStyle(node, null);
} else if (node.currentStyle) {
computedStyle = node.currentStyle;
} else {
throw new Error("Unable to get a computed style.");
}
for (prop in computedStyle) {
if (computedStyle.hasOwnProperty(prop)) {
style[prop] = this.css(prop);
}
}
return {
node: this.clone(true),
style: style
}
}
var snap1 = snapshot(document.getElementById("target")),
snap2 = $("#target").snapshot();
console.log(snap1, snap2);
jsfiddleについて
一方、実際に求めているのは、境界クライアントの四角形情報です。次に、このようなことができます。
CSS
#target {
position: relative;
top: 100px;
left: 150px;
height: 50px;
width: 70px;
}
HTML
<div id="target">Text</div>
Javascript
// IE5+ support
var getBoundingClientRect = (function () {
// Gecko < 1.9.1 test
var test = document.body.getBoundingClientRect();
// Gecko < 1.9.1
if (!test.hasOwnProperty("height") || !test.hasOwnProperty("width")) {
return function (node) {
var rect = target.getBoundingClientRect();
rect.height = rect.bottom - rect.top;
rect.width = rect.right - rect.left;
return rect;
};
}
// Gecko >= 1.9.1
return function (node) {
return target.getBoundingClientRect();
};
}());
// Whatever jquery supports
$.fn.getBoundingClientRect = function () {
var offset = this.offset(),
height = this.height(),
width =this.width(),
rect = {
width: width,
height: height,
top: offset.top,
left: offset.left,
bottom: offset.top + height,
right: offset.left + width
};
return rect;
}
var rect1 = getBoundingClientRect(document.getElementById("target")),
rect2 = $("#target").getBoundingClientRect();
console.log(rect1, rect2);
jsfiddleについて
els 配列内の要素を使用するにはどうすればよいですか?
標準的なArray
方法を使用して、 内に保存した個々の要素にアクセスしますels
。
ループなど、実行したい内容に応じて、利用可能な jquery メソッドもいくつかあります。jQuery.each
情報に対して「やりたいこと」はあなた次第です。質問でそれを指定していません。
jQuery オブジェクトの静的コピーを作成しようとしています。明らかに不可能です (または実行するのが非常に困難です)。次の方法で、オブジェクトの重要なプロパティのみを保存する必要があります。
{value: something.val()}
もちろん、このための関数を作成できます。
function xyz (Element, List) {
// in List you can use form 'val' for methods without arguments and ['attr', 'argument']
// for others.
// eg. ['val', ['attr', 'id'], ['css', 'height']]
Element = $(Element); // to be sure it's jQuery Object
var InfoList = {},
i, it, MethodName, MethodArg;
for (i = 0; i < List.length; i++) {
it = List[i];
if (typeof it === 'object') {
MethodName = it[0];
MethodArg = it[1];
if(!InfoList[MethodName])
InfoList[MethodName] = {};
InfoList[MethodName][MethodArg] = Element[MethodName](MethodArg);
}
else if (typeof it === 'string') {
InfoList[it] = Element[it];
}
else {
console.log('O.o');
}
}
return InfoList;
}
出力の例 (私は th を使用しました):
JSON.stringify(xyz($('#hlogo'), ['html', ['attr', 'id'], 'height', ['css', 'color']]))
{
"html": "\n <a href=\"\/\">\n Stack Overflow\n <\/a>\n ",
"attr": {
"id": "hlogo"
},
"height": 61,
"css": {
"color": "rgb(0, 0, 0)"
}
}