2015-07-21 30 views
0

我有這樣的代碼在JavaScript:JavaScript的全局變量在功能和.hover

status = document.getElementById('status2'); 

$('#slider > img').hover(
    function() { 
     stopLoop(); 
     status.innerHTML = "paused"; 
    }, 
    function() { 
     startSlider(); 
     status.innerHTML = "playing"; 
    } 
); 

,我找都在我的HTML有ID滑塊,當我懸停,然後我要添加圖像一個字(暫停或播放)到id爲status2的span標籤。但我不知道爲什麼全局變量不工作,我做它的工作是把一個局部變量每個funcion內像這樣的唯一途徑:

function() { 
    stopLoop(); 
    var status = document.getElementById('status2'); 
    status.innerHTML = "paused"; 
}, 
function() { 
    startSlider(); 
    var status = document.getElementById('status2'); 
    status.innerHTML = "playing"; 
} 

任何人都可以我爲什麼?

注意:正如我之前所說的所有使用局部變量但不將其設置爲全局變量。

+1

因爲在你運行'status = document.getElementById('status2')的時候''DOM沒有準備好,所以你把'status'設置爲'undefined',所以它不會進一步工作 – vinayakj

+1

你說你看所有圖像的ID爲'slider',但是你的代碼檢查圖像,這些圖像是id爲'slider'的元素的直接子元素。也許[本頁](https://css-tricks.com/child-and-sibling-selectors/)更好地解釋它? ID爲「滑塊」的圖像被用'$(「IMG#滑塊」)'選擇,而與ID爲「滑塊」元素的圖像的兒童用'$(「#滑塊> IMG」)來選擇。 – FWDekker

+0

如果你願意,你可以去完整的jQuery並使用'var status = $(「status2」);''''和'status.html(「playing」);'。 – Anders

回答

1

因爲到那時你跑那麼你得到的地位不確定,所以它不會進一步工作

status = document.getElementById('status2'); 

DOM還沒有準備好。

因此,要麼將代碼放在ready

$(document).ready(function(){ 
    //code goes here 
}) 

把腳本在文件末尾。

+0

不要加在我之前已經使用過的document.ready在另外一個功能。就緒 –

+0

和此代碼下面,我通過使用jQuery函數的.html(解決),而不是innerHTML的和sliderStatus = $(「狀態2」),而不是關閉document.getElementById('status2');它的工作 – angel

+0

Doesnt有道理..編寫下面的代碼.ready並不意味着它會在DOM準備就緒,因爲你說'我已經在另一個函數中使用過document.ready了,並且這個代碼在那之下。 – vinayakj

1

不要添加在

$(document).ready(function(){ 

}); 

此等待,直到一切都已經完成加載到內執行代碼。這樣它不應該返回undefined。

ALSO

我不禁注意到,你似乎在試圖給多個項目相同的ID。

請勿爲多個元素使用ID。這不是他們如何設計使用,也不是以這種方式工作。如果您給多個元素使用相同的ID,然後嘗試使用CSS對其進行樣式設置,則只會對第一個元素進行樣式設置。使用一堂課。如果您使用

document.getElementById(); 

,試圖抓住具有相同ID的多個元素,則腳本只能搶到第一元素與ID,因爲,因爲它是一個ID,它希望只有一個元素。如果要使用多個元素,請使用類,然後使用

document.getElementsByClassName(); 

這將抓取具有該類的所有元素。例如, 表示您有四個帶「foo」類的span元素。要抓住所有這些和更改文本,這樣做:

elements=document.getElementsByClassName("foo"); 
for (i=0; i<elements.length; i++){ 
elements[i].innerHTML='insert your text here'; 
} 

關於全局和局部變量,全局變量聲明是這樣的:

global_variable='foo' 

和局部變量聲明是這樣的:

var local_variable='foo' 

一個全局變量可以在腳本中任何聲明,並可以在腳本中使用的任何地方(甚至在被連接到相同的HTML文件的其他腳本),而本地瓦里如果在函數內聲明,只能在函數內部使用,或者如果在函數外部聲明它,則除非將該變量傳遞給該函數,否則不能在該函數內進行訪問。

希望有幫助!

+0

我已經之前所使用的的document.ready在另一個函數,該代碼是下面的是,我通過使用Jquery的函數的.html(解決)代替innerHTML的和sliderStatus = $(「STATUS2」),而不是關閉的document.getElementById('STATUS2 「);它的工作原理 – angel

+0

'global_variable ='foo''它不是全局變量被聲明的方式之一,而且這個方法是隱式的全局變量。 – vinayakj