2011-01-30 5 views
1
$("#button").click(function() { 
    //debugger; 
    if ($("img[id=image][src:contains(Grass)]")) 
     $("img").attr({ src: "/Content/images/Spring.jpg", alt: "Spring" }); 
    else 
     $("img").attr({ src: "/Content/images/Grass.jpg", alt: "Grass" }); 
}); 

<a href="/Content/images/Grass.jpg"><img src="/Content/images/Grass.jpg" alt="image" id="image"/></a> 
<input type="button" id="button" name="button"/> 

У меня есть простая форма с изображением и кнопкой, я хочу, чтобы каждое нажатие кнопки изменилось. Логика очень проста. По умолчанию image src = /Content/images/Grass.jpg Когда я нажимаю кнопку, первое изображение меняется, но когда я нажимаю второй раз, он не возвращается обратно. Я проверяю отладчик и узнаю, что условие $("img[id=image][src:contains(Grass)]") всегда true. Но после первого нажатия кнопки не должно получиться false?jQuery кнопка нажмите изменить изображение

если я объявляю

var img1 = $("img#image[src:contains(Grass)]"); 
    var img2 = $("img#image[src:contains(Grass2)]"); 
    var img3 = $("img#image[src:contains(blabla)]"); 

каждый img1.length = 1 img2.length = 1 img3.length = 1 Почему?

но

var img1 = $("img#image[src*='Grass']"); 
var img2 = $("img#image[src*='Grass2']"); 
var img3 = $("img#image[src*='blabla']"); 

каждый img1.length = 1 img2.length = 0 img3.length = 0 это то, что ожидалось.

Означает ли это, что src:contains(text) и src*=text так отличается?

ответ

2

Линия if ($("img[id=image][src:contains(Grass)]")) всегда будет правдой. Функция $() возвращает объект jQuery, и объект всегда оценивает значение true. Вы должны проверить, что длина результата не 0.

if ($("img[id=image][src:contains(Grass)]").length > 0)

+1

Кстати, этот код не очень хороший способ сделать что-то, и я бы посоветовал не использовать его на производственном сайте. Но если вы просто экспериментируете с тем, как работает jQuery, тогда этот ответ даст вам то, что вам нужно. –

+0

Не работает, я смотрю в debug, в обоих случаях ($ ("img [id = image] [src: contains (Grass)]"). Length и $ ("img [id = image] [src: contains (Spring)] ").) В то же время я получаю длину, равную 1 – Reg

+0

@ Джейсон ЛеБрун Я просто экспериментирую, но каков лучший способ сделать это? – Reg

2

Попробуйте это:

var img = $("#image"), 
    a = img.parent('a'); 
$("#button").click(function() { 
    var str = (img.attr('src').search('Grass') != -1) ? "Spring" : "Grass", 
     src = "/Content/images/"+str+".jpg"; 
    img.attr({ src: src, alt: str }); 
    a.attr("href", src); 
}); 

Сначала мы кэшируем #image объект JQuery, не нужно, чтобы выбрать его каждый раз, когда нажата кнопка. Затем мы выполняем обычный поиск по javascript в строке src. Если в нем есть трава, мы меняем ее на весну. Поскольку мы кэшировали объект jQuery #image, нам не нужно его повторно выбирать, чтобы изменить атрибуты src и alt. Также, если вы меняете img src Я предполагаю, что вы, вероятно, захотите обновить ссылку вокруг него.

+0

Значит ли это, что в этом случае селектор $ ("img [id = image] [src: contains (Grass)]") работает не так, как ожидалось? – Reg

+0

@Reg yes: contains - это специальный селектор, который не работает с атрибутами. http://api.jquery.com/contains-selector/ – PetersenDidIt

3
$("#button").click(function() { 
    var alt = ($('img#image[alt="Grass"]').length) ? 'Spring' : 'Grass'; 
    $('img#image').attr({ src: "/Content/images/"+alt+".jpg", alt:alt }); 
}); 

<a href="/Content/images/Grass.jpg"> 
    <img src="/Content/images/Grass.jpg" alt="Grass" id="image"/> 
</a> 
<input type="button" id="button" name="button"/> 
+0

Должно быть «img # image», а не изображение # img, почему в этом случае лучше проверить alt? – Reg

+0

да, должно быть – sod

+0

, но если я не настроил бы alt. Если alt постоянна? Мне все равно нужно проверить src. – Reg

0

Одно простое исправление, чтобы заменить это:

$("img[id=image][src:contains(Grass)]") 

... с этим:

$("#image[src*=Grass]").length 

Related selectors:

a^=b a starts with b 
a$=b a ends with b 
a!=b a does not equal b 
a*=b a contains b 
+0

. Я уже исправляю это, используя [attribute * = value] вместо из [attribute: contains (value)], но все еще исследуют, почему они возвращают разные результаты. [attribute * = value] vs [attribute: contains (value)] – Reg

0
  $("#button").click(function() {     
      var value = ($("img#image[src*='Grass']").length) ? 'Spring' : 'Grass'; 

      $("img").attr({ src: "/Content/images/" + value + ".jpg", alt: value }); 
      }); 
Смежные вопросы