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 が表示され、次に link2 がクリックされると app2 が link1 の上に表示されます。link2 が閉じられても、link1 は引き続き表示されます。4つすべてをチェックして、現在の選択を除いてすべて非表示にする必要があります。

4

5 に答える 5

2

少し更新; 関数は自己完結型になりました。

これはあなたが望むように動作するはずです。正しいスパンが表示され、もう一度クリックすると再び非表示になります。

ここに再びコードがあります:

    <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>

</p>

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;
}​
于 2012-05-17T19:42:45.743 に答える
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/

于 2012-05-17T20:05:28.340 に答える
1

現在表示されているアイテムを変数 (最初は ) で追跡する必要がありますnull

が呼び出されるたびshowAppに、現在表示されているアイテムを非表示にします。

次に、クリックしたばかりのスパンを表示し、それが現在表示されているアイテムであることを覚えておいてください (クリックしたばかりのスパンが今まで表示されていたものと同じでない限り、その場合は何も表示しないでください)。現在表示されているアイテムはもうありません)。

于 2012-05-17T19:42:03.393 に答える
1

スタック オーバーフローへようこそ!

まず、jQueryを使用して JavaScript を支援することをお勧めします。jQuery (および Zepto、MooTools、Dojo などの他の同様のフレームワーク) は、クロスブラウザーの不一致など、JavaScript のいくつかの欠点を克服し、作業を大幅に容易にします。<head>プロジェクトに jQuery を含めるには、ページのタグに次を追加するだけです。

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

jQuery にアクセスできるようになったので、タグonclickに追加したすべての属性を削除できます。<a>タグの使用は、onclickDOM レベル 1 標準が (ほぼ) 合意される前の Web 開発の初期にさかのぼるため、お勧めできません。代わりに、「クリック」イベントにバインドすることをお勧めします。これにより、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!"); }); 

showjQuery は、およびを介してページ上の要素をすばやく簡単に表示および非表示にする方法も提供しますhide

// 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 を使用して要素を「非表示」にすると、実際に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 開発について詳しく知りたい場合は、オブジェクト指向 JavaScriptを読むことをお勧めします。これは、言語とその癖の優れた紹介を提供します。

于 2012-05-17T20:04:55.633 に答える
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 を学ぶことを勧めています。

また、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>
于 2012-05-17T19:23:58.567 に答える