2013-02-05 157 views
3

这可能是一个原始问题,但我是JS/jQuery的新手。选项选择onchange

我在页面上有几个不同的选择框。当选择不同的选项时,它们中的每一个都在旁边有一个图像,该图像被更改。然而,这只适用于getElementById的一个选择框,但对于其中的许多选项来说它不适用于getElementByClassName,我也不想使用这种方法,因为我读它不受IE8.0支持。有没有办法让这个工作在一个页面内的多个选择框中使用,而不是为每个选择框使用单独的ID?

您的帮助将不胜感激。这是我的代码。

<img id="color" src="content/1.png"> 
<select class="mod_select" name="colors" id="changingColor" tabindex="1" onchange="changeimg()"> 
<option value="content/1.png">1 thing</option> 
<option value="content/2.png">2 thing</option> 
<option value="content/3.png">3 thing</option> 
</select> 

<script type="text/javascript"> 
function changeimg(){ 
document.getElementById('color').src=document.getElementById('changingColor').value 
} 
</script> 

编辑:我想使用选择和img的类。然后在一个div内有一个特定的选择选项可以改变它旁边的img。那可能吗?

编辑2:这个伟大的工程:

$('.mod_select').on('change', function() { 
    var $this = $(this); 
    var img = $this.prev(); // assuming select is next to img 
    img.attr('src', $this.val()); 
}); 

但是,IMG是不相邻的选择,我想我应该用prevSibling,但我不知道怎么样。阅读jQuery API并没有多大帮助。 我真的很感谢你的帮助!这里是我的html:

<img src="content/1.png"> <!-- the image that needs to be updated with new select option --> 
<p>text</p> 
<div class="moreinfo info_icon left"></div> <!-- the div that triggers qTip --> 
<div class="moreinfo_text"> <!-- this is a hidden div this that is shown by qTip with -- text: $(this).next('.moreinfo_text') --> 
     <img src="content/qtip_img.jpg"> 
     <p>qTip text</p> 
</div> 
<select class="mod_select" name="colors" tabindex="1"> 
     <option value="content/1.png">1 thing</option> 
     <option value="content/2.png">2 thing</option> 
     <option value="content/3.png">3 thing</option> 
</select> 
+0

元素上的'id'属性应该是唯一的,所以它们应该有单独的ID。如果你想将多个元素组合在一起,那么你应该使用一个类。 –

回答

2

看看这对你的作品请:

jQuery(document).ready(function($){ 

    $('.mod_select').change(function() { 
    $('.mod_select option:selected').each(function() { 
    $('#color').attr('src', $(this).val()); 
    }); 
    }); 

});  

你应该像

<!-- Grab Google CDN's jQuery. fall back to local if necessary --> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript">/* <![CDATA[ */ 
!window.jQuery && document.write('<script type="text/javascript" src="/js/jquery.js"><\/script>') 
/* ]]> */</script> 

添加一些东西到添加的jQuery。

+0

注意:您必须删除所有其他JavaScript,并确保将jQuery添加到页面。 – user1477388

+0

尊敬的user1477388,它确实有效,但是您提供的脚本我应该为每个img分配不同的ID。我宁愿在我的页面上有一个动态内容,所以我想使用select和img类。然后在一个div内,一个特定的选项会改变它旁边的img。那可能吗? – IDihtjara

+0

当然,你可以。只需将'#color'更改为'.color'类,并将'.mod_select'和'.color'元素放入一个div元素中,该div元素也使用它自己的类名称。你可以像'$('。myDivClassNames .mod_select')'那样访问它们。你懂我的意思吗? – user1477388

1

因为jQuery提供了一个非常强大的选择,你可以使用一个类选择,以实现自己的目标如下所示:

  1. 删除onchange从选择属性。
  2. 编辑您的JavaScript。

    $('.mod_select').on('change', function() { 
        var $this = $(this); 
        var img = $this.prev(); // assuming select is next to img 
        img.attr('src', $this.val()); 
    }); 
    
+0

这很好,但我不知道如何触发IMG,如果它不是旁边选择。我更新了我的问题,希望你能帮助我。谢谢! – IDihtjara

+0

@IrinaDihtjara你能够添加一个类到你想要更新的图像吗?如果你能够添加一个类,那么我的示例中显示的方法即使使用更新后的html也能工作。如果您想使用jQuery,我将包含相同代码的jQuery示例。 –

+0

在这种情况下,我认为你最好在div中包装img和相应的选择。然后,通过jQuery的Filter方法找到img: 'var img = $ this.parent()。find('img:first-child');' – BetaRabbit

1

由于IE 8不支持getElementsByClassName您可以使用Internet Explorer中不支持的getElementsByTagName创建你自己的版本。一旦你有了元素数组,你可以迭代它们并为change事件分配一个事件处理程序,而不必与html内联。完成此操作后,您只需使用previousSiblingnextSibling的类名查找图像元素并更改其来源。

这里是JavaScript

var select = getElementsByClassName(document.body,'mod_select'); 
for (var i = 0; i < select.length; i++){ 
    select[i].onchange = function() { 
     var prevSibling = this.previousSibling; 
     while(prevSibling && prevSibling.className != 'image') { 
      prevSibling = prevSibling.previousSibling; 
     } 
     prevSibling.src = this.value; 
    } 
} 

function getElementsByClassName(node, classname) { 
    var a = []; 
    var re = new RegExp('(^|)'+classname+'(|$)'); 
    var els = node.getElementsByTagName('*'); 
    for(var i = 0, j = els.length; i < j; i++) 
     if(re.test(els[i].className))a.push(els[i]); 
    return a; 
} 

这里是一个fiddle的链接显示有关信息。注意:这不需要任何jQuery的:)

编辑

jQuery不会所有繁重的工作适合你,你可以改变上面的代码简单地

$('.mod_select').change(function(){ 
    $(this).prevAll('img:first').attr('src', this.value); 
}); 

这看起来在所有它的第一个图像的前兄弟元素,并改变其来源。您可以更改选择器以包含您在第一次编辑时要添加的类名。这是一个fiddle显示jQuery的代码。

+0

谢谢谢谢谢谢谢谢!这很好用! :) – IDihtjara