JQuery как сделать ссылку нажмите сделать другой щелчок ссылки, который имеет ту же переменную id? [Дубликат]

1) Так называемая проблема «Mutable Default Argument» - это, в общем, специальный пример, демонстрирующий, что: «Все функции с этой проблемой также страдают от аналогичной проблемы побочного эффекта от фактического параметра». Это противоречит правилам

Пример:

def foo(a=[]):                 # the same problematic function
    a.append(5)
    return a

>>> somevar = [1, 2]           # an example without a default parameter
>>> foo(somevar)
[1, 2, 5]
>>> somevar
[1, 2, 5]                      # usually expected [1, 2]

Решение: копия Совершенно безопасным решением является copy или deepcopy входной сигнал сначала, а затем делать все с копией.

def foo(a=[]):
    a = a[:]     # a copy
    a.append(5)
    return a     # or everything safe by one line: "return a + [5]"

Многие встроенные изменяемые типы имеют метод копирования, такой как some_dict.copy() или some_set.copy(), или могут быть скопированы легко, как somelist[:] или list(some_list) , Каждый объект также может быть скопирован с помощью copy.copy(any_object) или более тщательным с помощью copy.deepcopy() (последний полезен, если изменяемый объект состоит из изменяемых объектов). Некоторые объекты основаны на побочных эффектах, таких как «файл», и не могут быть осмысленно воспроизведены копией. копирование

Пример проблемы для аналогичного вопроса SO

class Test(object):            # the original problematic class
  def __init__(self, var1=[]):
    self._var1 = var1

somevar = [1, 2]               # an example without a default parameter
t1 = Test(somevar)
t2 = Test(somevar)
t1._var1.append([1])
print somevar                  # [1, 2, [1]] but usually expected [1, 2]
print t2._var1                 # [1, 2, [1]] but usually expected [1, 2]

Он не должен быть ни сохранен ни в одном ] public экземпляра, возвращаемого этой функцией. (Предполагая, что атрибуты private экземпляра не должны быть изменены извне этого класса или подкласса по соглашению, т. Е. _var1 является частным атрибутом)

Заключение: Параметры входных параметров shouldn 'изменяются на месте (мутированные), и они не должны быть привязаны к объекту, возвращаемому функцией. (Если мы предпочитаем программирование без побочных эффектов, которые настоятельно рекомендуются, см. Wiki о «побочном эффекте» (первые два абзаца имеют смысл в этом контексте.).)

2) Только если побочный эффект на фактический параметр требуется, но нежелателен по параметру по умолчанию, тогда полезным решением является def ...(var1=None): if var1 is None: var1 = [] Подробнее ..

3) В некоторых случаях используется изменчивое поведение параметров по умолчанию .

56
задан Misha Moroshko 14 December 2011 в 03:40
поделиться

7 ответов

Наличие двух элементов с одинаковым идентификатором недопустимо html в соответствии со спецификацией W3C.

Когда ваш селектор CSS имеет только селектор ID (и не используется в определенном контексте), jQuery использует native document.getElementById, который возвращает только первый элемент с этим идентификатором.

Однако в двух других случаях jQuery полагается на механизм выбора Sizzle (или querySelectorAll, если он доступен), что, по-видимому, выбирает оба элемента. Результаты могут различаться в зависимости от браузера.

Однако у вас никогда не должно быть двух элементов на одной странице с одинаковым идентификатором. Если вам это нужно для вашего CSS, используйте вместо этого класс.


Если вы абсолютно должны выбрать дублирующийся идентификатор, используйте селектор атрибутов:

$('[id="a"]');

Взгляните на скрипке: http://jsfiddle.net/P2j3f/2/

Примечание: если это возможно, вы должны квалифицировать этот селектор с помощью селектора тегов, например:

$('span[id="a"]');
72
ответ дан Joseph Silber 21 August 2018 в 09:23
поделиться
  • 1
    Не могли бы вы объяснить Note ? Когда полезно добавить селектор тэгов? – Misha Moroshko 14 December 2011 в 05:11
  • 2
    @ Миша Морошко - По возможности, вы должны включить селектор тэгов. Причина этого в том, что селектор тегов much более эффективен, чем селектор атрибутов. Если вы определили свой селектор атрибутов с помощью селектора тэгов, jQuery сначала будет использовать селектор тэгов, чтобы найти элементы с этим тегом, а затем запускать селектор атрибутов для этих элементов. Это намного эффективнее. – Joseph Silber 14 December 2011 в 06:33
  • 3
    Я вижу здесь, что div#some_id медленнее, чем #some_id: stackoverflow.com/q/7262116/247243 – Misha Moroshko 14 December 2011 в 09:55
  • 4
    @Misha Moroshko - Это потому, что селектор ID более эффективен, чем селектор тегов. Но селектор тегов по-прежнему быстрее, чем селектор атрибутов. – Joseph Silber 14 December 2011 в 16:52
  • 5
    Для чего это стоит, синтаксис ASP.NET Razor автоматически добавляет повторяющиеся идентификаторы для таких вещей, как радиокнопки, поэтому я здесь! – Gareth 1 October 2015 в 17:08

Селектор jQuery id возвращает только один результат. Селектора descendant и multiple во втором и третьем операциях предназначены для выбора нескольких элементов. Это похоже на:

Statement 1

var length = document.getElementById('a').length;

... Допускается один результат.

Утверждение 2

var length = 0;
for (i=0; i<document.body.childNodes.length; i++) {
    if (document.body.childNodes.item(i).id == 'a') {
        length++;
    }
}

. .. Имеет два результата.

Утверждение 3

var length = document.getElementById('a').length + document.getElementsByTagName('div').length;

... Также дает два результата.

3
ответ дан Aaron 21 August 2018 в 09:23
поделиться

Если у вас несколько элементов с одинаковым идентификатором или одним и тем же именем, просто назначьте один класс этим элементам и получите доступ к ним по индексу & amp; выполните требуемую операцию.

  <div>
        <span id="a" class="demo">1</span>
        <span id="a" class="demo">2</span>
        <span>3</span>
    </div>

JQ:

$($(".demo")[0]).val("First span");
$($(".demo")[1]).val("Second span");
2
ответ дан Baqer Naqvi 21 August 2018 в 09:23
поделиться

Должен быть только один элемент с заданным id. Если вы застряли в этой ситуации, см. Вторую половину моего ответа для параметров.

Как работает браузер, когда у вас есть несколько элементов с одним и тем же идентификатором (нелегальный HTML), не определяется спецификацией. Вы можете протестировать все браузеры и узнать, как они себя ведут, но неразумно использовать эту конфигурацию или полагаться на какое-либо конкретное поведение.

Используйте классы, если вы хотите, чтобы несколько объектов имели один и тот же идентификатор.

<div>
    <span class="a">1</span>
    <span class="a">2</span>
    <span>3</span>
</div>

$(function() {
    var w = $("div");
    console.log($(".a").length);            // 2
    console.log($("body .a").length);       // 2
    console.log($(".a", w).length);         // 2
});

Если вы хотите надежно смотреть на элементы с идентификаторами, которые являются одинаковыми, потому что вы не можете исправить документ, тогда вам придется выполнять свою собственную итерацию, так как вы не можете полагаться на какие-либо из встроенных функций DOM.

Вы можете сделать это следующим образом:

function findMultiID(id) {
    var results = [];
    var children = $("div").get(0).children;
    for (var i = 0; i < children.length; i++) {
        if (children[i].id == id) {
            results.push(children[i]);
        }
    }
    return(results);
}

Или , используя jQuery:

$("div *").filter(function() {return(this.id == "a");});

Рабочий пример jQuery: http://jsfiddle.net/jfriend00/XY2tX/ .

Что касается того, почему вы получаете разные результаты, которые связаны с внутренней реализацией любой части кода, выполняющей фактическую операцию селектора. В jQuery вы можете изучить код, чтобы узнать, что делает какая-либо данная версия, но поскольку это незаконный HTML, нет гарантии, что он будет оставаться неизменным с течением времени. Из того, что я видел в jQuery, он сначала проверяет, является ли селектор простым id, например #a, и если да, просто использовал document.getElementById("a"). Если селектор более сложный, чем querySelectorAll(), jQuery часто передает селектор в функцию встроенного браузера, которая будет иметь реализацию, специфичную для этого браузера. Если querySelectorAll() не существует, то он будет использовать механизм выбора Sizzle, чтобы вручную найти селектор, который будет иметь собственную реализацию. Таким образом, вы можете иметь как минимум три разных реализации в одном и том же семействе браузеров в зависимости от точного селектора и того, как новый браузер. Затем отдельные браузеры будут иметь свои собственные реализации querySelectorAll(). Если вы хотите надежно справиться с этой ситуацией, вам, вероятно, придется использовать свой собственный итерационный код, как показано выше.

4
ответ дан jfriend00 21 August 2018 в 09:23
поделиться
  • 1
    Он не может. Он получает его от Google, вот в чем проблема – Ralph Lavelle 14 December 2011 в 03:51
  • 2
    @RalphLavelle - я добавил метод обращения с идентификаторами dup, если вы застряли с ним. – jfriend00 14 December 2011 в 03:58

На странице id Selector jQuery :

Каждое значение id должно использоваться только один раз в документе. Если нескольким элементам был присвоен одинаковый идентификатор, запросы, которые используют этот идентификатор, будут выбирать только первый согласованный элемент в DOM. Однако это поведение нельзя полагаться; документ с более чем одним элементом, использующим один и тот же идентификатор, недействителен.

Непослушный Google. Но они даже не закрывают теги <html> и <body>, которые я слышу. Вопрос в том, почему 2-й и 3-й запросы Миши возвращают 2, а не 1.

3
ответ дан Ralph Lavelle 21 August 2018 в 09:23
поделиться

вы можете просто написать $ ('span # a'). length для получения длины.

Вот решение для вашего кода:

console.log($('span#a').length);

попробуйте JSfiddle: https://jsfiddle.net/vickyfor2007/wcc0ab5g/2/

0
ответ дан Ravindra Dhage 21 August 2018 в 09:23
поделиться
0
ответ дан Héctor Lazarte 1 November 2018 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: