2015-07-21 40 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