Zmiana identyfikatora elementu za pomocą jQuery

302

Muszę zmienić identyfikator elementu za pomocą jQuery.

Najwyraźniej te nie działają:

jQuery(this).prev("li").attr("id")="newid"
jQuery(this).prev("li")="newid"

Dowiedziałem się, że mogę to zrobić za pomocą następującego kodu:

jQuery(this).prev("li")show(function() {
    this.id="newid";
});

Ale to nie wydaje mi się właściwe. Musi być lepszy sposób, nie? Ponadto, jeśli nie ma, jakiej innej metody mogę użyć zamiast pokazywać / ukrywać lub inne efekty? Oczywiście nie chcę pokazywać / ukrywać ani wpływać na element za każdym razem, aby zmienić jego identyfikator.

(Tak, jestem początkującym jQuery.)

Edytuj
W tym przypadku nie mogę używać klas, muszę używać identyfikatorów.

yoavf
źródło
5
W JavaScript można przypisać do zmiennej ( foo = 1), elementu obiektu ( foo.bar = 2lub foo['bar'] = 2) lub indeksu tablicy ( foo[0] = 3), ale przypisać do wyrażenia, takiego jak wynik operatora ( (x + b) = 5) lub wynik wywołania funkcji ( foo() = 1, foo(x).bar(y) = 7) nie ma żadnego sensu, więc zdecydowanie nie będzie to działało w jQuery ani w żadnej innej bibliotece JavaScript.
rakslice,

Odpowiedzi:

520

Twoja składnia jest niepoprawna, powinieneś przekazać wartość jako drugi parametr:

jQuery(this).prev("li").attr("id","newId");
Eran Galperin
źródło
4
Myślę, że nowy powinien być w cytatach
Jay Corbett
5
Czy nie musisz odłączać elementu od DOM i zastępować go nowym elementem z nowym ID w jego miejscu? Aby uniknąć uszkodzenia DOM ...?
cllpse,
15
jQuery się tym zajmuje, roosteronacid.
McPherrinM,
15
przybył tutaj podwójne sprawdzenie zmiany przypisania identyfikatora - czy powinno to być teraz .prop( ... )zamiast .attr( ... )?
Carl
2
@Carl zgodnie z najnowszymi dokumentami i przykładami jquery, idnależy nadal ustawić za pomocąattr(...)
JoeBrockhaus
71

PREFEROWANĄ OPCJĄ powyżej .attrnależy użyć w następujący .propsposób:

$(this).prev('li').prop('id', 'newId');

.attrpobiera atrybutu elementu natomiast .propPobiera właściwość, że odniesienia atrybutów (czyli to, czego rzeczywiście zamierza zmodyfikować)

Jeremy Moritz
źródło
4
.attr jest przestarzałe - jest to właściwy sposób na zrobienie tego.
PointlessSpike
7
Skąd pochodzą te informacje? api.jquery.com/attr nie mówi nic o deprecjacji ...
Sergej
To nie jest przestarzałe. „ Począwszy od jQuery 1.6 , .prop()metoda zapewnia sposób jawnego pobierania wartości właściwości, podczas gdy .attr()pobiera atrybuty.”
Iluminator
@Illuminator odpowiednio poprawiłem swoją odpowiedź. Dzięki.
Jeremy Moritz
45

Masz na myśli:

jQuery(this).prev("li").attr("id", "newID");

To ustawi identyfikator na nowy identyfikator

Pim Jager
źródło
11

Z tym konstruktem zrobiłem coś podobnego

$('li').each(function(){
  if(this.id){
    this.id = this.id+"something";
  }
});
Petr Safar
źródło
7

Nie jestem pewien, jaki jest twój cel, ale czy zamiast tego lepiej byłoby użyć addClass? Mam na myśli, że identyfikator obiektu powinien moim zdaniem być statyczny i specyficzny dla tego obiektu. Jeśli po prostu próbujesz zmienić to, aby wyświetlać się na stronie lub coś w tym rodzaju, umieściłbym te szczegóły w klasie, a następnie dodałem je do obiektu, a nie próbowałem zmienić jego identyfikator. Znowu mówię to bez zrozumienia twojego podkreślającego celu.

Tim Knight
źródło
3
radości starszych systemów - rozumiem zatem twój ból. Odpowiedź Erana jest wtedy zdecydowanie najlepsza.
Tim Knight
5
Właściwie ustawienie identyfikatora jest przydatne i przydatne, jeśli budujesz DOM za pomocą ukrytych szablonów w HTML, a następnie klonujesz je za pomocą jquery.
Steve Knight
5
$("#LeNomDeMaBaliseID").prop('id', 'LeNouveauNomDeMaBaliseID');
Sébastien
źródło
1
To rozwiązanie zostało już tutaj
Cristik
1
Nie zamieszczaj odpowiedzi tylko na kod - zawsze dodawaj wyjaśnienie do swojego kodu w odpowiedzi.
Daniel W.
2
<script>
       $(document).ready(function () {
           $('select').attr("id", "newId"); //direct descendant of a
       });
</script>

To może zrobić wszystko. Po prostu dodaj przed tagiem zamykającym ciało i nie dodawaj Jquery.min.js

Prassanna D. Manikandan
źródło
0

Odpowiedź Erana jest dobra, ale chciałbym do tego dołączyć. Musisz obserwować każdą interaktywność, która nie jest wbudowana w obiekt (to znaczy, jeśli zdarzenie onclick wywoła funkcję, nadal będzie działać), ale jeśli do tego identyfikatora dołączona jest obsługa zdarzeń javascript lub jQuery, zostanie ona zasadniczo porzucona :

$("#myId").on("click", function() {});

Jeśli identyfikator zostanie teraz zmieniony na # myID123, funkcja dołączona powyżej nie będzie już działać poprawnie z mojego doświadczenia.

rfornal
źródło