2012-01-25 15 views
0

event.targetまたはevent.srcElementで要素を取得しています。javascriptを使用してIDなしで同じhtml要素を取得

idを設定せずに選択した以前の要素を正確に知るために、イベントのどの情報を保存できますか?

ページを閉じると、同じ要素を取得する方法は?

すべてのparentNodeを保存すると、再度要素を取得するのが非常に遅いようです。

もっと効率的な方法がありますか?

ページには固定数の要素が含まれます。しかし、このページは変更できません。id属性を含めることはできませんでした。ただし、ユーザーがページを再び開いたときにクリックされた最後のタグをマークします。

+0

ただ、明確にするために、 'this'はあなたが(あなたのイベントハンドラのスコープ内で)必要な要素を指していませんか? – cheeken

+0

ページを閉じて戻ってくると、明らかにすべての要素が再作成されているので、これを達成する唯一の方法は一種の一意のIDです。あなたは正確に何をしようとしていますか? – SoWeLie

+0

最も効率的な方法はほぼ確実に設定され、 'id'です。最も簡単な解決法を禁止するのはなぜですか? –

答えて

0

私は興味深い方法を見つけました。取得するには

// Save node name and position with this 
// el = elemento 
var p = document.getElementsByTagName(nodeName); 
for(var i=0; i<p.length; i++) 
{ 
    if(el == p[i]) 
    { 
     return i; 
    } 
} 

:要素を保存するには

// With nodeName saved and "position" i 
var elem = document.getElementsByTagName(nodeName)[i]; 
1

あなたの要件に基づいて、クラス名と存在しない場合は要素名に基づいて、ある種のxpathを生成するのが最善の方法です。要素の一意の識別子を取得する唯一の方法であるIDを持っていない場合。例として私のjsfiddleを見てください。

var getNodeIdentifier = function(element) { 
    return element.nodeName.toLowerCase() + "." + $(element).index(); 
};  

var current = element; 
var xpath = getNodeIdentifier(this); 

while (current.parentNode != null) { 
    xpath = getNodeIdentifier(current.parentNode) + "/" + xpath; 
    current = current.parentNode; 
} 

console.log(xpath); 

http://jsfiddle.net/qZMXN/29/

注意してください、唯一の問題は、あなたの要素のどれもがいずれかのクラスを持っていない場合は、同じノード型と同じレベルで複数の要素を持っている場合、これはおそらくそこに、理由は動作しませんですそれらを一意に識別する手段ではありません。

+0

ページは、同じレベルの同じノードを持つ複数の要素を持ちます。私はjffiddleページ+1を好きでした。 – Cobaia

+0

Hmm ...はい、あなたは親の中でインデックスを使うことができるかもしれません。あなたはjqueryをこのページは? – SoWeLie

+0

私はクロムを使用します.Javascriptについてよくわからないことを忘れて、jqueryが何であるか分かりません、私はそれについて読んでいます。 – Cobaia

1

私は似た何かが必​​要と私は(離れて、古いブラウザの互換性から)CSSセレクタを使用してと間違って行くことができるかと思っています。以下のような

何か:

$('body>div:nth-of-type(1)>div:nth-of-type(2)>ul>li:nth-of-type(3)') 

http://jsfiddle.net/ddimitrop/Qa8P2/

一つは、簡単に身体へのパスまで、次のようにセレクタを構築することができます。

function structureSelector(element) { 
    var tagName = element.tagName.toLowerCase(); 
    if (tagName == 'body') { 
    return tagName; 
    } 
    var indexInParent = Array.prototype.indexOf.call(element.parentNode.childNodes, element); 
    return structureSelector(element.parentNode)+'>'+tagName+':nth-child('+(indexInParent+1)+')'; 
} 

http://jsfiddle.net/ddimitrop/w9tbw/

関連する問題