2012-12-22 40 views
4

这是我的HTML页面:从单独的.js文件调用主页面中的jquery函数。

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 

<script type="text/javascript" src="jquery-1.8.2.min.js"></script> 

<script type="text/javascript" src="myscript.js"></script> 

<script type="text/javascript"> 

$(document).ready(function() { 
function closecontactform(){ 
alert("closing the form"); 
}; 
}); 
</script> 
</head> 
<body> 
<p id="elementname">Click me to call function</p> 
</body> 

这是myscripts.js文件:

$(document).ready(function() { 
$('#elementname').click(function() { 
alert("click detected"); 
closecontactform(); 
}); 
}); 

我的实际页面比这更复杂了不少,包括很多jQuery的,但是这是仅显示必要代码的基本问题。我希望能够从一个单独的.js文件中调用一个函数,而函数是在主页面中定义的。在这个基本的简单版本中,我尝试删除$(document).ready(function()...并且在这个简单的例子中,这有助于我在更复杂的页面中使用这行代码,因为删除它似乎会破坏我所做的一切上。

你会看到“点击检测”被调用,但“关闭窗体”不。

您能够给我任何指针?

感谢,

回答

13

您有范围问题。您不需要在$(document).ready()中包装命名函数。

如果包装在ready中,它的作用域仅在该就绪函数中可用,因为该函数中的关闭。

例子:

$(document).ready(function() { 
    function doAlert() { 
     alert('foo'); 
    } 
    /* can call function since scope in same parent function*/ 
    doAlert(); 
}); 
/* function not in scope, is undefined here*/ 
doAlert(); 

重构等等功能是全局可用,并且将工作,如果从任何地方调用。在下面两种情况下工作:

function doAlert() { 
    alert('foo'); 
} 

$(document).ready(function() { 
    doAlert(); 
}); 
doAlert(); 

此外应注意:

很多人担心使用jQuery选择和方法的功能必须被包裹在$(document).ready()ready以外的命名函数可以包含所有的jQuery代码......但是......在DOM准备好确保html存在之后需要调用它们

+0

好的。这是一个像你说的范围问题,但是我不认为我能够删除我的$(document).ready(),因为我的实际函数实际上包含了一些变量和jQuery(和css),它们依赖于HTML正在加载。所以我所做的就是将所有代码从我的单独的.js文件中取出,并将其放在我的主页上同一个$(document).ready()中。这解决了问题。 – Maureen

+0

好的..我试着解释jQuery代码的一部分......你可能会把功能拉出来。你仍然只能从'ready'中调用许多函数,但是你可以在不同文件中使用'ready'来访问相同的全局函数 – charlietfl

+0

看看我是如何将$(document).ready包装在名为'ready'之外的调用函数中。函数在调用之前不会执行。无论您在何处定义它, – charlietfl

0

您是否尝试过移动

<script type="text/javascript" src="myscript.js"></script> 

低于<body> -tag?

0

首先,您需要将脚本标记移动到</body>之上标签。

其次,如果你只是删除准备好的文件,应该在上面工作。问题是你在一个闭包内定义了你的函数,这超出了范围。你的函数不需要在文档中准备好,因为只有当其他文档准备就绪时(意味着文档已准备就绪),它才会被触发。

+0

顶部(头部)或底部(主体)的脚本不会影响范围问题。这里没有问题 – charlietfl

相关问题