2012-05-17 65 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

相關問題