2016-03-22 8 views
1

Dies ist nur eine Übung, an die ich beim Spielen mit jsFiddle gedacht habe.Wie man den Inhalt eines Elements auf den Wert seines Attributs mit jQuery setzt

Da Elemente mit einem Datenattribut:

<div data-test-id="3214581">Loading...</div> <div data-test-id="6584634">Loading...</div>

Ich möchte den Textinhalt setzen von Funktion mit dieser ID, so zu führen, dass die endgültige DOM ist:

<div data-test-id="3214581">John, Smith</div>

Bisher konnte ich das gegebene Element finden und irgendwie kann ich mich nicht auf das Element beziehen, das this Schlüsselwort verwendet, um seine testId zu erhalten:

$('div[data-test-id]').text(getPersonName($(this).data('testId')))

getPersonName() gibt „John Smith“

denke ich, es so einfach sein sollte, haben aber keine sich selbst verweis Beispiel wie diese auf Stapel oder jQuery docs gefunden.

EDIT: Fester Element, um mehrere divs, nicht nur eine zu zeigen. (d. h. die ID ist nicht bekannt und sollte nicht im Selektor sein). Behebt die Auswahl, um einzelne Anführungszeichen zu haben.

+1

Ihre Erwartung spiegelt ein grundlegendes Missverständnis über [wie 'this' Arbeiten ermöglichen soll ] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this). – nnnnnn

+0

Es scheint, dass Ihre Selektoren nicht korrekt sind. Der Selektor ist ein String: '$ ('div [data-test-id]') '.... –

+0

Sie können die' each' Funktion - '$ (div [data-test-id]) verwenden. function() {$ (this) .text (getPersonName ($ (this) .data ('testId')));}); ' –

Antwort

3

this ist der Kontext der Funktion.

Wenn nichts weiter spezifiziert, this ist einfach window.

Was Sie wollen, ist ein Rückruf zu $.text passieren, dass auf das ausgewählte DOM-Element gebunden werden:

$('div[data-test-id]').text(function(){ 
    // here this is your div 
    return getPersonName($(this).data('testId')) 
}) 
+2

Dies ist korrekt, außer dass Sie den 'return getPersonName' vergessen haben. Die Funktion sollte die Zeichenfolge zurückgeben und sie wird in text() platziert. Vielen Dank! – dlite922

2

Leider ist das this Schlüsselwort wird dir nicht helfen dies im aktuellen Kontext zu tun. Sie müssen jQuerys each verwenden, um die Ergebnisse der $(div[data-test-id])-Abfrage zu durchlaufen. Innerhalb des Rückrufs, der jedem gegeben wird, wird dann der Wert this an den DOM-Knoten gebunden.

// "this" in this scope is not the DOM element 
$(div[data-test-id]).each(function() { 
    // "this" inside this scope is bound to the DOM element 
    $(this).text(getPersonName($(this).data('testId'))); 
}); 
+2

Oder .text() akzeptiert eine Callback-Funktion, die für jedes übereinstimmende Element aufgerufen wird, also keine Notwendigkeit für .each(). – nnnnnn

+1

Das ist wahr, wenn Sie eine Funktion haben, die etwas zurückgibt. @ moonwave99 hat es bekommen, aber er hat das Schlüsselwort vergessen. – dlite922

1

Ich wurde neugierig, wie viel länger eine reine Javascript-Übersetzung mit der Antwort von moonwave99 verglichen würde. Für den Fall, jemand ist in diesem wie auch interessiert, hier ist sie:

[].forEach.call(document.querySelectorAll("div[data-test-id]"),function(el){ 
    el.innerHTML=getPersonName(el.getAttribute("data-test-id")); 
}); 

jsfiddle

+0

'.innerHTML =' unterscheidet sich sehr von einem '.text()' Aufruf. – Bergi

+2

'für (lassen Sie el von document.querySelectorAll (" div [Daten-Test-ID] ")) el.textContent = getPersonName (el.dataset.testId);' sollte es tun. – Bergi

1

Es ist nicht notwendig Verwendung Iterationsverfahren; .text() iteriert jedes Element am Selektor, this ist bereits aktuelles Element innerhalb der Funktion .text(function(index, text){}).

Sie getPersonName zur Unterzeichnung von .text() einstellen, die Sie Muster verwenden

$("div[data-test-id]").text(getPersonName); 

var names = { 
 
    3214581: "John, Smith", 
 
    6584634: "Stack, Overflow" 
 
} 
 

 
function getPersonName(index, text) {  
 
    return names[$(this).data().testId] 
 
} 
 

 
$("div[data-test-id]").text(getPersonName);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<div data-test-id="3214581">Loading...</div> 
 
<div data-test-id="6584634">Loading...</div>

+0

Smart Trick, um die gleiche Signatur zu verwenden! Guter Tipp! Vielen Dank! – dlite922