2016-07-12 2 views
2

У меня есть следующий код:Почему Cant Jquery выбирает изображение с помощью Id без имени при доступе к атрибуту?

function myfun(arg) { 
 
    var info = $(arg).attr("myinfo"); 
 
    $('#output').html((typeof info) + ": " + info); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<img id="A" myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<img id="B" name myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<ul> 
 
    <li> 
 
    <button onclick="myfun(A)">Doesn't Work</button> 
 
    </li> 
 
    <li> 
 
    <button onclick="myfun(B)">Works</button> 
 
    </li> 
 
</ul> 
 
<p id="output">Output here</p>

Когда я пытаюсь получить доступ к атрибуту myinfo в образе Id A, я не могу выбрать изображение Id для доступа myinfo с помощью JQuery.

Однако, если свойство name присутствует, тогда я легко могу выбрать myinfo с использованием того же синтаксиса. Не имеет значения, укажу ли я конкретное имя, даже работает пустой.

Что здесь происходит? Я попытался получить доступ с помощью $("#" + arg).attr("myinfo");, и это тоже не сработало.

Вот ссылка на JSFiddle также: JSFiddle Link

+2

Вы полагаться на браузер для установки '' window.A' и window.B' для вас, на основе 'id' элементов, которая не является отличная идея для начала. Однако по какой-то причине ссылка на 'A' ​​сама по себе не работает, если у нее нет атрибута' name' (см. [Скрипт] (https://jsfiddle.net/RoryMcCrossan/8dm3j9f1/5/) - 'window.A' не определено). Я не знаю, почему это так. Также обратите внимание, что 'myinfo' не является допустимым атрибутом, поэтому ваш HTML недопустим, что может вызвать проблемы в IE и более старых браузерах. Если вы хотите хранить пользовательскую информацию с помощью элемента, используйте атрибут 'data- *' –

+1

Это еще более запутанно, когда атрибут 'name' в элементе' img' устарел в соответствии с [W3C] (https: // www. w3.org/TR/html-markup/img.html). Я могу только думать, что это странность браузера, учитывая ваше странное использование пропущенных глобальных ссылок на элементы. –

+0

Странно, что это только кажется проблемой в атрибуте onclick. Если я устанавливаю точку останова в 'myfun', я могу получить доступ к' A' в отладчике JS. – Barmar

ответ

1

Вы должны поставить кавычки вокруг 'A' и 'B' в вызовах функций, а также использовать '#'+arg в качестве селектора.

function myfun(arg) { 
 
\t var info = $('#'+arg).attr("myinfo"); 
 
    $('#output').html((typeof info)+": "+info + ' ' + arg); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<img id="A" myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<img id="B" name myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<ul> 
 
<li><button onclick="myfun('A')">Doesn't Work</button></li> 
 
<li><button onclick="myfun('B')">Works</button></li> 
 
</ul> 
 
<p id="output">Output here</p>

В @Rory McCrossan и @Barmar упоминали в комментарии, это также может быть достигнуто путем доступа к элементам в качестве свойств объекта окна с window[arg].

function myfun(arg) { 
 
    var info = $(window[arg]).attr("myinfo"); 
 
    $('#output').html((typeof info)+": "+info + ' ' + arg); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<img id="A" myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<img id="B" name myinfo="kittens" src="https://placekitten.com/200/200"> 
 
<ul> 
 
<li><button onclick="myfun('A')">Doesn't Work</button></li> 
 
<li><button onclick="myfun('B')">Works</button></li> 
 
</ul> 
 
<p id="output">Output here</p>

+3

В вашем ответе стоит упомянуть, что вы также изменили способ работы селектора jQuery - вы добавили '#', чтобы он выбрал идентификатор. .. –

+0

Обратите внимание, что OP пытается передать «window.A» и «window.B» ссылки элементов на функцию. –

+0

@RoryMcCrossan - справедливо, но где же они установлены? Это метод, о котором я не знаю, и очень хотел бы понять, действительно ли это действительная/достойная практика. –