2015-11-19 3 views
3

jsfiddleПочему .prop ('src') возвращает неправильное значение, когда свойство src равно null или пустое?

$('img').click(function() { 
 
    alert($(this).prop('src')) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script> 
 
<img src="http://www.w3schools.com/tags/smiley.gif" /> 
 
<img src="" style="width: 10px; height: 10px; border: 1px solid;">

Когда я нажимаю на второе изображение, оно предупреждает http://stacksnippets.net/js.

Почему?

+0

Почему вы удалили мое редактирование? Я предоставил вам рабочий jsfiddle и сделал невидимое и незаметное изображение видимым и кликабельным. – Oleander

+1

@Oleander Потому что я не хочу, чтобы все перенаправлялись на другую страницу, чтобы проверить мой пример. Это уже на странице. –

+1

Все здесь, в SO, используют jsfiddle для предоставления запущенных примеров. Ваш текущий код также не работает здесь. Нажмите на изображение и попробуйте его самостоятельно, никаких предупреждающих сообщений не будет. – Oleander

ответ

2

Согласно официальному документу:

HTMLImageElement.src Является DOMString, что отражает атрибут SRC HTML, содержащий полный URL изображения, включая базовый URI.

, который, очевидно, означает, что, без какого-либо пути, указанному в src, атрибут src будет равен только по ссылке base URI

: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement

быстрый Javascript обходной путь будет установить src в null если оно не заполнено

var src = $(this).prop('src') || null; 

jsfiddle: http://jsfiddle.net/g9d8e4wh/1/

относительно вашего .attr() vs .prop() беспокойства, я предлагаю вам голова на там .prop() vs .attr()

+2

'$ (this) .attr ('src') || null' короче. – Oriol

+0

Извините, но я не упоминаю о '.attr ('src')'. Вы можете отредактировать свою демонстрацию, замените 'attr' на' prop'. Он будет предупреждать 'http: // fiddle.jshell.net/_display /' –

+0

Итак, почему 'attr', почему' prop'? Я хочу использовать '.prop', потому что это быстрее, чем' .attr() ' –

1

Когда SRC пуст, $ (this) перенастраивает объект IMG, а src возвращает контекст объектов и baseURI. Вы можете увидеть его просмотра свойств объекта в консоли:

$('img').click(function() { 
    alert($(this).prop('src')) 
    console.log($(this)); 
}) 
+0

Это лучше :) – Oleander

+0

Вклеена в неправильную ячейку раньше, derp: P –

0

Существует синхронизация между свойствами и атрибутами, но не для всех случаев. Например, «href» и «src» не синхронизированы. В вашем случае вы должны использовать

$('img').click(function() { 
    alert($(this).attr('src')) 
}) 

или getAttribute() при использовании ванильного JS. Вы можете узнать больше здесь ->http://javascript.info/tutorial/attributes-and-custom-properties

1

Это потому, что src отражается:

alt, src IDL атрибуты должны reflect соответствующее содержание атрибутов одного и того же имени.

И при получении отражающего атрибута IDL, который имеет значение URL, вы получите абсолютный один:

Если отражающий атрибут IDL является DOMString атрибутом, содержание которого атрибута определенно содержать URL , а затем на получение, то IDL атрибут должен resolve значения атрибута содержания относительно элемента и возвращает полученный absolute URL если это успешно, или пустая строка в противном случае

Если вы не хотите этого поведения, вы можете использовать getAttribute, чтобы получить атрибут content вместо IDL.

+0

Небольшой вопрос: почему' src' называется «атрибут» в вашей первой цитате? Я думаю, что это свойство 'src' –

+1

@ Mr.Wolf [атрибуты IDL] (http://www.w3.org/TR/WebIDL/#idl-attributes) также обычно называют [свойствами] (http: // www. ecma-international.org/ecma-262/5.1/#sec-4.3.26). Официальные имена отличаются друг от друга, потому что один определяется Web IDL, а другой - ECMAScript. – Oriol

+0

Извините за многие вопросы, но все ваши ссылки не упоминают о том, как использовать '.prop()' для проверки 'src' является нулевым или нет. Например: 'if ($ ('img'). Prop ('src') == null || $ ('img'). Prop ('src') == '') {}' –

Смежные вопросы