2012-05-17 52 views
3

我是javascript新手,请耐心等待。我试图让点击出现在我已经完成的点击上,但是我需要点击另一个点击来返回到隐藏状态。这是我迄今为止所拥有的。如何让点击时显示一个范围,但点击另一个点击时会消失?

<html> 
<head> 
<style> 
aside.apps{ 
    position:relative; 
} 

span.socialApp{ 
    visibility:hidden; 
    position:absolute; 
    top:20px; 
    left: 0; 
    background-color:#e9e9e9; 
} 
</style> 

<script> 
var state = 'hidden'; 

function showApp(a) { 

    if (state == 'visible') { 
     state = 'hidden'; 
    } 
    else { 
     state = 'visible'; 
    } 

    if (document.getElementById && !document.all) { 
     x = document.getElementById(a); 
     x.style.visibility = state; 
    } 
} 
</script> 
</head> 

<body> 

     <aside class="apps"> 
      <a href="javascript://" onclick="showApp('app1');">link1</a> 
       <span class="socialApp" id="app1">stuff goes here1</span> 
      <a href="javascript://" onclick="showApp('app2');">link2</a> 
       <span class="socialApp" id="app2">stuff goes here2</span> 
      <a href="javascript://" onclick="showApp('app3');">link3</a> 
       <span class="socialApp" id="app3">stuff goes here3</span> 
      <a href="javascript://" onclick="showApp('app4');">link4</a> 
       <span class="socialApp" id="app4">stuff goes here4</span> 
     </aside> 
</body> 
</html> 

目前LINK1时点击APP1出现,那么一旦被点击链接2 APP2出现在链路1的顶部。当link2被关闭时,link1仍然可见。我需要检查全部4个,并且除了当前选择以外全部隐藏。

+0

欢迎来到SO!伟大的第一个问题,但你会发现更多的人想要回答,如果你确保正确缩进你的代码,以便更易于阅读。 – Jivings

回答

1

,欢迎堆栈溢出!

首先,我将建议您使用jQuery帮助您使用JavaScript。 jQuery(以及Zepto,MooTools和Dojo等其他类似框架)对JavaScript中的一些裂缝如cross browser inconsistenciesmake things a lot easier进行了修改。包括jQuery的在你的项目,你只需要添加到网页的<head>标签以下内容:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 

jQuery的现在,你就可以访问你可以删除所有onclick的属性,您添加到您的<a>标签。使用onclick标签是不鼓励的,因为它可以追溯到web开发的早期阶段,而DOM(第1层)标准已经(几乎)同意。相反,它建议你绑定到'点击'事件 - 这将有助于保持你的HTML和JavaScript分开,并使你的JavaScript更易于阅读和调试。

jQuery的工作变得非常简单绑定一个处理程序(功能)的点击事件,你只需要使用on语法:

// #id is the 'id' attribute of the element you want to add a click handler to. 
$('#id').on('click', function() { alert("Clicked!"); }); 

的jQuery还提供了一个快速简便的方法来显示和隐藏要素通过showhide在页面上,在这里它是如何工作:

// Again, #id is the id attribute of the element you want to show/hide. 
$('#id').show(); // Make a hidden element visible. 
$('#id').hide(); // Hide a visible element. 

唯一要注意这里的是,当你“隐藏”使用jQuery的元素,它实际上将T的display CSS属性他的元素。在上面的代码中,您通过切换visibility属性来隐藏元素。

答案的最后部分在于我们如何看到当前可见的元素;这可以通过添加一个跟踪显示哪个元素的新变量来实现 - 您可以在我修改后的代码中看到这一点。

<html> 
    <head> 
     <style> 
span.socialApp { 
    /* use display: none instead of visibilty: hidden */ 
    display: none; 

    position:absolute; 
    top:20px; 
    left: 0; 
    background-color:#e9e9e9; 
} 
     </style> 

     <!-- include jQuery --> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 

     <!-- Script for toggle apps --> 
     <script> 
// Create an Array of all the app names. 
var apps = [ 'app1', 'app2', 'app3' ]; 

// Variable which keeps track of which app is currently visible 
var visibleAppName = null; 

function onLinkClicked(event) { 
    // Get the id of the link that was clicked. 
    var linkName = event.target.id; 

    // Strip off the '-link' from the end of the linkName 
    var dashIndex = linkName.indexOf('-link'); 
    var appName = linkName.substr(0, dashIndex); 

    // Call show app with the correct appName. 
    showApp(appName); 
} 

function showApp(appNameToShow) { 
    // Hide the currently visible app (if there is one!) 
    if (visibleAppName !== null) { 
     $('#' + visibleAppName).hide(); 
    } 

    // And show the one passed 
    $('#' + appNameToShow).show(); 

    // Update the visibleApp property. 
    visibleAppName = appNameToShow; 
} 

// $(document).ready waits for the page to finish rendering 
$(document).ready(function() { 
    // Walk through the Array of Apps and add a click handler to 
    // it's respective link. 
    apps.forEach(function(name) { 
     $('#' + name + '-link').on('click', onLinkClicked); 
    }); 
});   
     </script> 
    </head> 
    <body> 
      <aside class="apps"> 
      <a href="#" id="app1-link">link1</a> 
      <span class="socialApp" id="app1">stuff goes here1</span> 

      <a href="#" id="app2-link">link2</a> 
      <span class="socialApp" id="app2">stuff goes here2</span> 

      <a href="#" id="app3-link">link2</a> 
      <span class="socialApp" id="app3">stuff goes here3</span>    
     </aside> 
    </body> 
</html>​​​​​​​​​​​ 

如果你渴望了解更多关于JavaScript的开发则可能我建议阅读Object Orientation JavaScript它提供了一个很好的介绍语言和一些它的怪癖。

+0

它不好建议jQuery的人是谁的第一行是 “我是全新的JavaScript,所以请忍受我” – Jashwant

+0

......为什么不呢?您宁愿他们必须了解附加点击事件侦听器的各种不同方式,而不是解决其实际问题? – JonnyReeves

+1

我是jQuery粉丝。其实,我必须测试我自己的纯JavaScript代码,bcoz我不会那样编码。但学习是一种渐进的方法。如果你在第一个地方建议他使用jQuery,他不会学习javascript。而且可能永远不会尝试一个替代框架。另外,你总是不能使用jQuery。你需要知道JavaScript的方式。 – Jashwant

1

我的不好,编辑了答案,它会帮助你。我不认为,有任何需要使用变量。只需隐藏所有跨度,然后显示您作为变量传递的那个跨度。

<html> 
<head> 
<style> 
aside.apps{ 
    position:relative; 
} 
span.socialApp{ 
    visibility:hidden; 
    position:absolute; 
    top:20px; 
    left: 0; 
    background-color:#e9e9e9; 
} 
</style> 

<script> 
function showApp(a) { 
    var aside = document.getElementById('myaside'); 
    var spans = aside.getElementsByTagName('span'); 
    for(i=0,len=spans.length;i<len;i++){ 
    spans[i].style.visibility = 'hidden'; 
    } 
    x = document.getElementById(a); 
    x.style.visibility = 'visible'; 
} 

</script> 
</head> 

<body> 

     <aside class="apps" id="myaside"> 
      <a href="javascript://" onclick="showApp('app1');">link1</a> 
       <span class="socialApp" id="app1">stuff goes here1</span> 
      <a href="javascript://" onclick="showApp('app2');">link2</a> 
       <span class="socialApp" id="app2">stuff goes here2</span> 
      <a href="javascript://" onclick="showApp('app3');">link3</a> 
       <span class="socialApp" id="app3">stuff goes here3</span> 
      <a href="javascript://" onclick="showApp('app4');">link4</a> 
       <span class="socialApp" id="app4">stuff goes here4</span> 
     </aside> 
</body> 
</html> 

更新:

如你是新来的JavaScript,只是不潜入的jQuery,因为它更容易为别人,每当你问他们会抛出一个代码。

不是我,但所有伟大的JavaScript开发人员建议您在学习其JavaScript框架之前学习JavaScript。

此外,jQuery有缓解的东西,简单的代码和单独的标记和JavaScript。

你不应该现在但如果你愿意稍后尝试,你应该按照这样的方法。 (在没有标记的onclick和简单的代码)

<html> 
<head> 
<style> 
aside.apps{ 
    position:relative; 
} 
span.socialApp{ 
    display:none; 
    position:absolute; 
    top:20px; 
    left: 0; 
    background-color:#e9e9e9; 
} 
</style> 
<script src='http://code.jquery.com/jquery-latest.min.js'></script> 
<script> 
$(document).ready(function(){ 
    $('aside').on('click','a',function(){  // This lines says that select aside and fire onclick even on click of anchor tag inside it 
     $(this).parent().find('span').hide(); // $(this) is the clicked anchor 
     $(this).next('span').show(); // Find the span next to clicked anchor and show it i.e. display:block 
    }) 
}) 

</script> 
</head> 
<body> 
<aside class="apps"> 
    <a href="javascript:void(0);">link1</a> 
     <span class="socialApp" id="app1">stuff goes here1</span> 
    <a href="javascript:void(0);" >link2</a> 
     <span class="socialApp" id="app2">stuff goes here2</span> 
    <a href="javascript:void(0);" >link3</a> 
     <span class="socialApp" id="app3">stuff goes here3</span> 
    <a href="javascript:void(0);" >link4</a> 
     <span class="socialApp" id="app4">stuff goes here4</span> 
</aside> 
</body> 
</html> 
+0

感谢您的回应,但由于某种原因,每次点击都会拉动而不是点击一次。 – JKFrox

+1

@JKFrox这是因为每次点击时(无论点击什么),“可见度”都将“可见”,并且所有跨度都将变得可见。由于app4是最后一个,它将出现在其他的顶部。对于多个跨度有一个'state'变量是行不通的。 – sepp2k

+0

我错了,编辑了答案,我希望,它是你想要的。 – Jashwant

1

你应该保持在一个变量当前可见的项目(这是最初null)的轨道。

每次调用showApp时,隐藏当前可见的项目。

然后使刚才点击的跨度可见并记住它现在是当前可见的项目(除非刚才点击的项目与之前一直可见的项目相同 - 在这种情况下,您不应该这样做)使任何东西都可见,并且不再是当前可见的项目)。

2

轻微更新;该功能现在是独立的

This should work how you want;它会拉起正确的跨度,并且如果再次点击它将再次隐藏它。

这里再次代码:

<aside class="apps" id="aside"> 
     <a href="#" onclick="showApp('app1');">link1</a> 
      <span class="socialApp" id="app1">stuff goes here1</span> 
     <a href="#" onclick="showApp('app2');">link2</a> 
      <span class="socialApp" id="app2">stuff goes here2</span> 
     <a href="#" onclick="showApp('app3');">link3</a> 
      <span class="socialApp" id="app3">stuff goes here3</span> 
     <a href="#" onclick="showApp('app4');">link4</a> 
      <span class="socialApp" id="app4">stuff goes here4</span> 
    </aside> 

function showApp(a) { 
    var aside = document.getElementById('aside'); 
    var arr = aside.getElementsByTagName('span'); 
    for (i = 0; i < arr.length; i++) { 
     if (arr[i].getAttribute('id') != a) { 
      arr[i].style.visibility = 'hidden'; 
     } 
    } 
    var state; 
    x = document.getElementById(a); 
    if (x.style.visibility == 'visible') { 
     state = 'hidden'; 
    } 
    else { 
     state = 'visible'; 
    } 
    x.style.visibility = state; 
}​ 
+0

请注意,您可以(因此应该)只是将'state2'设为局部变量,因为您从不在'showApp'的调用中使用它的值。 – sepp2k

+0

@ sepp2k我刚刚意识到,第二次,现在功能是独立的。 – Daedalus

2

我推荐使用JQuery。它具有跨浏览器支持,并可以简化这类工作;)。

包括在标签下面

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 

这里是新的脚本

<script type="text/javascript"> 
    function showApp(a) { 
     $(".selected").removeClass("selected"); 
     $(a).addClass("selected"); 
    }; 
</script> 

改变你的HTML这个

<aside class="apps"> 
    <a href="#" onclick="showApp('#app1');">link1</a> 
     <span class="socialApp" id="app1">stuff goes here1</span> 
    <a href="#" onclick="showApp('#app2');">link2</a> 
     <span class="socialApp" id="app2">stuff goes here2</span> 
    <a href="#" onclick="showApp('#app3');">link3</a> 
     <span class="socialApp" id="app3">stuff goes here3</span> 
    <a href="#" onclick="showApp('#app4');">link4</a> 
     <span class="socialApp" id="app4">stuff goes here4</span> 
</aside> 

改变你的CSS这个

.apps{ 
    position:relative; 
} 

.socialApp{ 
    visibility:hidden; 
    position:absolute; 
    top:20px; 
    left: 0; 
    background-color:#e9e9e9; 
} 

.selected { 
    visibility: visible; 
} 

JSFiddle示例:http://jsfiddle.net/peterf/u2SFL/

+0

扎实的第一个回答彼得,upvoted :) – JonnyReeves

+0

它不好建议jQuery的人是谁的第一行是 “我是全新的JavaScript,所以请忍受我” – Jashwant

相关问题