Frage

Ich Schreibe ein GreaseMonkey-Skript, wo ich bin, Durchlaufen eine Reihe von Elementen.Für jedes element, ich brauche eine string-ID, die ich verwenden kann, um Referenz, das element später.Das element selbst nicht haben ein id Attribut, und ich kann nicht ändern die original Dokument zu geben es ein (zwar kann ich machen DOM Veränderungen in meinem Skript).Ich kann nicht speichern Sie die Verweise in meinem Skript, da wenn ich Sie brauche, die GreaseMonkey-Skript selbst müssen gone out of scope.Gibt es eine Möglichkeit, um auf eine "interne" - ID, die der browser verwendet, zum Beispiel?Ein Firefox-Lösung ist in Ordnung;cross-browser-Lösung, die angewendet werden können in anderen Szenarien wäre genial.

Edit:

  • Wenn das GreaseMonkey-Skript ist aus dem Umfang, wie sind Sie verweisen auf die Elemente später? Sie GreaseMonkey-Skript hinzufügen von Ereignissen, um DOM-Objekte.Ich kann nicht speichern der Referenzen in einem array oder einem anderen ähnlichen Mechanismus, weil, wenn das Ereignis ausgelöst wird, das array wird verschwunden sein, weil die GreaseMonkey-Skript müssen gone out of scope.So dass die Veranstaltung muss einige Weg, um wissen über die element-Referenz, die das Skript hatte, wenn der Fall angebracht wurde.Und das element in Frage ist nicht die, die an dem es befestigt ist.

  • Können Sie nicht nur verwenden Sie eine benutzerdefinierte Eigenschaft für das element? Ja, aber das problem ist auf der Suche.Ich würde zurückgreifen müssen, um die Iteration über alle Elemente, suchen, die, die hat, dass die benutzerdefinierte Eigenschaft auf die gewünschte id.Das funktionieren würde, sicher, aber in großen Dokumenten könnte es sehr zeitaufwändig sein.Ich bin auf der Suche nach etwas, bei dem der browser kann die lookup-grunt work.

  • Warten Sie, kann Sie oder kann Sie nicht ändern, das Dokument? Ich kann nicht das Quelldokument ändern, aber ich kann DOM-änderungen im Skript.Ich werde klären, in Frage.

  • Können Sie nicht geschlossen? Closuses haben sich herausstellen, um zu arbeiten, obwohl ich zunächst dachte, Sie würde nicht.Siehe meine späteren post.

Es klingt wie die Antwort auf die Frage:"Gibt es eine interne browser-ID, die ich verwenden könnte?" "Nein."

War es hilfreich?

Lösung 4

UPDATE: Verschlüsse sind in der Tat die Antwort. So, nachdem einige mehr mit ihm hantieren, habe ich herausgefunden, warum Verschlüsse waren zunächst problematisch und wie man es beheben. Die heikele Sache mit einem Verschluss ist, müssen Sie vorsichtig sein, wenn durch die Elemente iteriert nicht mit allen Ihren Schließungen Referenzierung das gleiche Element enden. Zum Beispiel funktioniert das nicht:

for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    var button = document.createElement("button");
    button.addEventListener("click", function(ev) {
        // do something with element here
    }, false)
}

Aber das tut:

var buildListener = function(element) {
    return function(ev) {
        // do something with event here
    };
};

for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    var button = document.createElement("button");
    button.addEventListener("click", buildListener(element), false)
}

Wie auch immer, ich beschlossen, nicht eine Antwort zu wählen, weil die Frage zwei Antworten hatte: 1) Nein, es gibt keine internen IDs können Sie verwenden; 2) Sie sollten Verschlüsse für diese. So upvoted ich einfach die ersten Menschen zu sagen, ob es interne IDs waren oder die empfohlene Erzeugung IDs sowie alle, die Verschlüsse erwähnt. Danke für die Hilfe!

Andere Tipps

Die Antwort ist nein, es ist nicht eine interne ID, die Sie zugreifen können. Opera und IE (vielleicht Safari?) Unterstützung .sourceIndex (die sich ändert, wenn DOM der Fall ist), aber Firefox hat nichts dergleichen.

Sie können durch Erzeugen von XPath zu einem bestimmten Knoten oder die Suche nach dem Index des Knotens aus document.getElementsByTagName('*') Quelle-Index simulieren, die immer Elemente in der Reihenfolge der Quelle zurückkehren werden.

All dies erfordert eine völlig statische Datei natürlich. Änderungen an DOM werden die Lookup brechen.

Was ich nicht verstehe, ist, wie Sie Verweise auf Knoten lösen können aber nicht beschränkt auf (theoretisch) interne ID? Entweder Schließungen und Aufgaben arbeiten, oder sie tun nicht. Oder bin ich etwas fehlt?

Closure ist der Weg zu gehen. Auf diese Weise werden Sie auf das Element genau Bezug haben, dass sogar einige Schlurfen von DOM wird überleben.

Beispiel für diejenigen, die Verschlüsse nicht wissen:

var saved_element = findThatDOMNode();

document.body.onclick = function() 
{
   alert(saved_element); // it's still there!
}

Wenn Sie hatten es in einem Cookie gespeichert werden, dann XPath Ich empfehle Berechnung für sie (zB zu Fuß die DOM Zählen vorherigen Geschwister, bis Sie Element mit einer ID finden und Sie werden am Ende mit so etwas wie [@id=foo]/div[4]/p[2]/a).

XPointer ist die Lösung von W3C für dieses Problem.

Ein bisschen nach dem Wortlaut der Frage verwirrt - Sie sagen, dass Sie „um eine String-ID benötigen, die [Sie] das Element verweisen später verwenden können,“ aber, dass Sie „können die Verweise nicht speichern in [Ihre] Skript denn wenn [Sie] sie benötigen, hat der Greasemonkey-Skript selbst dem Gültigkeitsbereich weg. "

Wenn das Skript außerhalb des Gültigkeitsbereichs gegangen sind, dann wie werden Sie sie später werben?!

Ich werde die Tatsache ignorieren, dass ich verwirrt bin von dem, was Sie an und Sie bekommen sagen, dass ich sehr oft Greasemonkey-Skripte schreiben und können ändern Sie die DOM-Elemente, die ich auf sie zugreifen eine ID geben Eigentum. Dies ist Code können Sie verwenden, um eine pseudo-eindeutigen Wert für den temporären Einsatz zu erhalten:

var PseudoGuid = new (function() {
    this.empty = "00000000-0000-0000-0000-000000000000";
    this.GetNew = function() {
        var fourChars = function() {
            return (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1).toUpperCase();
        }
        return (fourChars() + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + fourChars() + fourChars());
    };
})();

// usage example:
var tempId = PseudoGuid.GetNew();
someDomElement.id = tempId;

Das funktioniert für mich, die ich getestet es nur in einem Greasemonkey-Skript selbst.


UPDATE: Verschlüsse sind der Weg zu gehen - persönlich, als Hard-Core-JavaScript-Entwickler, ich weiß nicht, wie Sie nicht von denen denken sofort . :)

myDomElement; // some DOM element we want later reference to

someOtherDomElement.addEventListener("click", function(e) {
   // because of the closure, here we have a reference to myDomElement
   doSomething(myDomElement);
}, false);

Nun ist myDomElement eines der Elemente offenbar Sie, aus Ihrer Beschreibung, haben bereits um (da Sie der Zugabe einer ID ihm dachten, oder was auch immer).

Vielleicht, wenn Sie ein Beispiel schreiben, was Sie zu tun versuchen, wäre es einfacher, Ihnen zu helfen, vorausgesetzt, dies ist nicht der Fall.

Wenn Sie können schreiben Sie an die DOM (Ich bin sicher, Sie können). Ich würde das so lösen:

eine Funktion zurückzukehren oder eine ID erzeugen:

//(function () {

  var idCounter = new Date().getTime();
  function getId( node ) {
    return (node.id) ? node.id : (node.id = 'tempIdPrefix_' + idCounter++ );
  }

//})();

Verwenden Sie diese IDs zu erhalten, wie erforderlich:

var n = document.getElementById('someid');
getId(n);  // returns "someid"

var n = document.getElementsByTagName('div')[1];
getId(n);  // returns "tempIdPrefix_1224697942198"

Auf diese Weise brauchen Sie nicht zu befürchten, was die HTML aussieht, wenn der Server übergibt es Ihnen.

Wenn Sie nicht das DOM modifizieren Sie können sie alle durch indizierte Bestellung erhalten:

( Prototype Beispiel)

myNodes = document.body.descendants()
alert(document.body.descendants()[1].innerHTML)

Sie könnten Schleife durch alle Knoten und geben ihnen eine eindeutige Klassenname, die Sie später einfach auswählen können.

Sie können das id-Attribut auf einen berechneten Wert gesetzt. Es gibt eine Funktion in der Prototyp-Bibliothek, die dies für Sie tun können.

http://www.prototypejs.org/api/element/identify

Meine Lieblings Javascript-Bibliothek jQuery ist. Leider hat jQuery keine Funktion wie identifizieren. Sie können jedoch nach wie vor das id-Attribut auf einen Wert gesetzt, die Sie auf Ihrem eigenen erzeugen.

http://docs.jquery.com/Attributes/attr#keyfn

Hier ist ein Teil-Ausschnitt aus jQuery docs, die ID für divs basierend auf der Position in der Seite setzt:

  $(document).ready(function(){

    $("div").attr("id", function (arr) {
          return "div-id" + arr;
        });
  });

Sie können auch pguid (Seite-unique identifier) für die eindeutige Kennung generation:

 pguid = b9j.pguid.next() // A unique id (suitable for a DOM element)
                          // is generated
                          // Something like "b9j-pguid-20a9ff-0"
 ...
 pguid = b9j.pguid.next() // Another unique one... "b9j-pguid-20a9ff-1"

 // Build a custom generator
 var sequence = new b9j.pguid.Sequence({ namespace: "frobozz" })
 pguid = sequence.next() "frobozz-c861e1-0"

http://appengine.bravo9.com/b9j/documentation/pguid.html

Mit der Maus und / oder Positions Eigenschaften des Elements eine eindeutige ID zu erzeugen.

Sie können eine stabile, eindeutige Kennung für einen bestimmten Knoten in einem DOM mit der folgenden Funktion erzeugen:

function getUniqueKeyForNode (targetNode) {
    const pieces = ['doc'];
    let node = targetNode;

    while (node && node.parentNode) {
        pieces.push(Array.prototype.indexOf.call(node.parentNode.childNodes, node));
        node = node.parentNode
    }

    return pieces.reverse().join('/');
}

Dies wird Kennungen erstellen wie doc/0, doc/0/0, doc/0/1, doc/0/1/0, doc/0/1/1 für eine Struktur wie diese:

<div>
    <div />
    <div>
        <div />
        <div />
    </div>
</div>

Es gibt auch ein paar Optimierungen und Änderungen können zum Beispiel machen:

  • In der while Schleife, break wenn die node hat ein Attribut, das Sie wissen, einzigartig zu sein, zum Beispiel @id

  • Nicht die reverse() pieces, derzeit ist es nur mehr wie die DOM-Struktur suchen die IDs generiert werden von

  • ist nicht die erste piece doc, wenn Sie

  • keine Kennung für den Dokumentknoten müssen
  • Speichern Sie die Kennung auf dem Knoten in irgendeiner Weise, und wieder verwenden diesen Wert für untergeordnete Knoten zu vermeiden, den ganzen Weg, den Baum wieder zu durchqueren.

  • Wenn Sie diese Kennungen zurück in XML schreiben, eine andere Verknüpfungszeichen verwenden, wenn das Attribut Sie schreiben beschränkt ist.

In Javascript, könnten Sie eine benutzerdefinierte ID-Feld mit dem Knoten anhängen

if(node.id) {
  node.myId = node.id;
} else {
  node.myId = createId();
}

// store myId

Es ist ein bisschen von Hack, aber es wird jede und jeder Knoten eine ID geben Sie verwenden können. Natürlich document.getElementById() Aufmerksamkeit auf sie nicht bezahlen.

Ich denke, 'Ich habe gerade ein ähnliches Problem wie dieses Problem gelöst. Allerdings bin ich jQuery in einem Browser DOM-Umgebung.

var objA = $ ( "Selektor zu einem gewissen dom Element"); var objB = $ ( "Selektor zu einem anderen dom Elemente");

if (objA [0] === objB [0]) {   //GROSS! die beiden Objekte verweisen auf genau den gleichen dom Knoten }

OK, gibt es keine ID zu DOM-Element zugeordnet ist automatisch. DOM hat eine hierarchycal Struktur von Elementen, die die Hauptinformation ist. Aus dieser Perspektive können Sie Associate Daten DOM-Elemente mit jQuery oder jQLite. Es kann einige Probleme lösen, wenn Sie benutzerdefinierte Daten-Elemente zu binden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top