2013-01-25 16 views
1

下面代碼中的pastPath變量令我感到困惑。我通常使用C#和MVC,這當然意味着我使用HTML,JavaScript和JQuery以及其他相關的網絡/移動技術。對javascript/jquery變量作用域感到困惑

當我運行此代碼並單擊.moreBtn pastPath報告時,它將按照我的意圖設置爲URL。然而,當我嘗試使用.backBtn來設置URL並強制瀏覽器返回上一頁時,我得到的是pastPath未定義,或者它被設置爲hello。

我知道我在這裏有一個問題的理解範圍。我已經閱讀了關於JavaScript範圍的文章,但是我想知道是否有人可以解決這個問題,並解釋我如何從第一個函數獲取URL到第二個函數。

我將在後面閱讀更多關於範圍的內容,但它在大多數其他語言中的範圍看起來非常不同,我目前沒有時間正確地研究它。

$(document).ready(function() 
{ 
    pastPath = "hello"; 

    $(".moreBtn").click(function() 
    { 
     var controller = $(".moreBtn").data('ctrl'); 
     var action = $(".moreBtn").data('action'); 
     loc = GetPathDetails("full"); //This simply returns the part of the URL I need. 
     pastPath = loc; 
     alert(pastPath); 
     var fullPath = loc + "/" + controller + "/" + action; 
     window.location = fullPath; 
    }); 

    $(".backBtn").click(function() 
    { 
     alert(pastPath); 
     //window.location = pastPath; 
    }); 

}); 

感謝您的幫助。

+1

擺脫'this.',它應該工作。不要忘記用'var pastPath'來初始化'pastPath';' – Blender

+0

編輯的問題,當我按照建議去除這個問題時,我在第二個函數中得到hello。謝謝你的幫助。 –

+0

@Juhana我不明白,你有什麼困難。我覺得,pastPath應該在第一個函數中點擊設置,並且應該在第二個函數中輕鬆讀取,因爲它是在兩個外面定義的,但這不會發生。所以我想知道我做錯了什麼,以及如何解決它。它應該很簡單。謝謝你的幫助。 –

回答

4

.moreBtn點擊更改頁面,以便存儲在pastPath中的任何數據都將丟失。

看一看DOM存儲,https://developer.mozilla.org/en-US/docs/DOM/Storage

+1

這是爲什麼在第一次編碼後顯示「hello」的正確答案。 – Louis

+0

啊...現在它是有道理的。所以我應該只是將查詢字符串中的值彈出並在第二個函數中讀取它。或者類似的東西。感謝您的回答。 –

+1

取決於您想要存儲多少條以前的路徑,查詢字符串可能會變得漫長而混亂。請參閱上面的網址,您可以保留一組路徑。 – Alex

1
  • 當你正在使用jQuery,在點擊時(或其他事件)處理, 的「這」將是指引發該DOM元素事件。

  • 如果你沒有使用「var pastPath」聲明你的變量,那麼pastPath將是一個「全局變量」,這意味着它將是全局對象的一個​​屬性。

在點擊處理程序不訪問相同的變量您是否正在訪問this.pastPath或只是pastPath(除非this指的是全局對象,這是因爲它是由jQuery的具體DOM觸發它不您點擊的元素)。

0

正如我們所知,變量有兩個範圍,即局部範圍和全局範圍。全局範圍:一個變量,它以簡單的術語(但不完全)在函數之外聲明或定義。

本地範圍:在函數內聲明的變量。

so $(document).ready(function(){});也是一個函數,所以在這之外聲明變量將解決問題。但是可能會使用該變量作爲局部變量的函數內部避免使用var pastPath。

所以你的最終代碼將變爲 var pastPath =「hello」; $(document).ready(function(){

$(".moreBtn").click(function() { 
    var controller = $(".moreBtn").data('ctrl'); 
    var action = $(".moreBtn").data('action'); 
    loc = GetPathDetails("full"); 
    //This simply returns the part of the URL I need. 
    pastPath = loc; 
    alert(pastPath); 
    var fullPath = loc + "/" + controller + "/" + action; 
    window.location = fullPath; 
}); 

$(".backBtn").click(function() { 
    alert(pastPath); 
    //window.location = pastPath; 
}); 

});

+0

因爲我讀到關於JavaScript範圍的文檔,所以在發佈問題之前,我實際上也試過這樣做。然後我在第二個函數中收到了一個消息框,表示「未定義」。謝謝你的幫助。 –

+0

不錯,但請確保你在js頁面的開頭添加了它!希望可能會有差異(偶然)。 – user1954395

+0

我不認爲範圍是問題了。正如兩個人已經正確指出的那樣,由於頁面被刷新,它被重置。所以我需要將值存儲在其他地方,比如查詢字符串,cookie或會話變量。但是,感謝您的時間和協助。 –

1

當您點擊$(「。moreBtn」)時,它將您重定向到fullpath,並且此重定向再次設置pastPath =「hello」,因此如果您希望在下一頁上使用過路徑值,請將其作爲查詢字符串發送,然後使用這是你的後扣。

類似:

$(document).ready(function() 
    { 
     var pastPath = "hello"; 

     $(".moreBtn").click(function() 
     { 
     var controller = $(".moreBtn").data('ctrl'); 
     var action = $(".moreBtn").data('action'); 
     loc = GetPathDetails("full"); //This simply returns the part of the URL I need. 
     pastPath = loc; 
     alert(this.pastPath); 
     var fullPath = loc + "/" + controller + "/" + action + " ?pastpath="+loc; 
     window.location = fullPath; 
     }); 

     $(".backBtn").click(function() 
     { 
        var path = window.location + ''.split('pathname='); 
        alert(path1[1]); 
       }); 

    }); 
+1

請注意,變量路徑路徑的範圍對整個頁面是全局的,但是當你刷新頁面時,它將在每個$(document).ready(function()' – imVJ

+0

總是歡迎:) – imVJ

+0

+2爲好回答。被接受的答案也解釋了這一點,並且我的想法是像你一樣使用查詢字符串,直到他把我引向另一條路。那是因爲我反正使用HTML5,爲什麼不使用會話存儲。所以我查了一下並解決了我的問題。但是,對於那些擔心後向瀏覽器兼容性問題(我不是),我覺得查詢字符串(如此答案中所示)將是現在更好的方式。感謝您花時間回答並尋求您的幫助。 –