1

関数内の各リンクのURLを返す次のコードがあります。

var nav_link;
$('#nav_what-we-do').find('.top-dropdown').find('a').each(function(index, elem) {
    console.log("Descendant: " + elem.tagName + " " + elem.href);
    the_link = $(this);
    nav_link = elem.href.split('#');
    if (nav_link[0] === '/what-we-do/') {
        the_link.attr('href','#'+nav_link[1]);
        the_link.click(function() {
            var tab_id = $(this).attr('href');
            selectTab(tab_id);
            return false;
        });
    }
});

コンソールは次のようなリンクを出力します。

Descendant: A http://localhost/testsite/what-we-do/#solutions
Descendant: A http://localhost/testsite/what-we-do/#features
Descendant: A http://localhost/testsite/what-we-do/features/test
Descendant: A http://localhost/testsite/what-we-do/solutions/test2

ここで、ハッシュ(#)を含むリンクのみが必要であり、このハッシュを使用してそれらを分割します。次に、array(0)に「/what-we-do/」という文字が含まれているかどうかを確認します。私はこのようにリンクを分割しようとしました:

nav_link = elem.href.split('#');

しかし、IF部分は機能していません。

誰かが私が間違っていることを教えてもらえますか?

編集

TJからの提案によると

$('#nav_what-we-do').find('.top-dropdown').find('a').each(function(index, elem) {
    //console.log("Descendant: " + elem.tagName + " " + elem.href);
    var the_link = elem.href,
        hashIndex = the_link.split("#");
    if(hashIndex.length == 2) {
        console.log(hashIndex);
        console.log("Descendant: " + elem.tagName + " " + elem.href);
        console.log('First part is: ' + hashIndex[0].indexOf("/what_we_do/"));
    }
    if (hashIndex.length == 2 && hashIndex[0].indexOf("/what_we_do/") !== -1) {
        the_link.attr('href', "#" + hashIndex[1]);
        the_link.attr('href', the_link.substring(hashIndex));
        the_link.click(function() {
            var tab_id = $(this).attr('href');
            selectTab(tab_id);
            return false;
        });
    }
});

コンソールで印刷すると、次のようになります。

["http://localhost/testsite/what-we-do/", "solutions"] site_javascript.js:133
Descendant: A http://localhost/testsite/what-we-do/#solutions site_javascript.js:134
First part is: -1 site_javascript.js:135

["http://localhost/testsite/what-we-do/", "features"] site_javascript.js:133
Descendant: A http://localhost/testsite/what-we-do/#features site_javascript.js:134
First part is: -1 

最初の部分は値hashIndex[0].indexOf( "/ what_we_do /")である必要があります

hashIndexには文字列/what-we-do/があるので、何が起こっている可能性がありますか?

4

2 に答える 2

3

私はあなたがおそらく望むと思います:

var nav_link;
$('#nav_what-we-do').find('.top-dropdown').find('a').each(function(index, elem) {
    console.log("Descendant: " + elem.tagName + " " + elem.href);
    var the_link = elem.href,
        hashIndex = the_link.indexOf("#");
    if (hashIndex !== -1 && the_link.indexOf("/what-we-do/") !== -1) {
        the_link.attr('href', the_link.substring(hashIndex));
        the_link.click(function() {
            var tab_id = $(this).attr('href');
            selectTab(tab_id);
            return false;
        });
    }
});

(私が宣言したことに注意してくださいthe_link。イテレータ関数の外部のどこかですでに宣言されている場合は、それを削除できますが、ローカルである必要があるようです。)

または、代わりに技術的には、ハッシュの後に/what-we-do/ある場合は上記が一致します) :

var nav_link;
$('#nav_what-we-do').find('.top-dropdown').find('a').each(function(index, elem) {
    console.log("Descendant: " + elem.tagName + " " + elem.href);
    var the_link = elem.href,
        split = the_link.split("#");
    if (split.length === 2 && split[0].indexOf("/what-we-do/") !== -1) {
        the_link.attr('href', "#" + split[1]);
        the_link.click(function() {
            var tab_id = $(this).attr('href');
            selectTab(tab_id);
            return false;
        });
    }
});

そこで、最初のハッシュの後にハッシュがある場合、それが一致しないように制限しました。

于 2012-07-09T16:36:17.307 に答える
0

絶対パス全体(http:// .....)をそのトークン(/ what-we-do /)に対してチェックしているため、これは失敗します。

これを回避する方法はいくつかあります。最も簡単なのは、探しているトークンがURLに含まれているかどうかを確認することです(現在のように、トークンとまったく同じではありません)。

if (nav_link.indexOf('#') != -1 && nav_link[0].indexOf('/what-we-do/') != -1) {
    ...
于 2012-07-09T16:38:03.093 に答える