JavaScript-自调用函数可以';无法从外部脚本查看函数
我对以下代码的作用域有一个概念上的问题 该代码是用于两个表单的简单客户端验证脚本 我使用了一个自调用函数来尝试一种不同的方法,避免设置所有全局变量,但它的行为在我看来有点奇怪 我仍在学习使用JavaScript编写代码,我不是专家,但这些高级功能有点复杂 我不想使用jQuery,只想使用纯JavaScript来学习基础JavaScript-自调用函数可以';无法从外部脚本查看函数,javascript,html,scope,global-variables,self-invoking-function,Javascript,Html,Scope,Global Variables,Self Invoking Function,我对以下代码的作用域有一个概念上的问题 该代码是用于两个表单的简单客户端验证脚本 我使用了一个自调用函数来尝试一种不同的方法,避免设置所有全局变量,但它的行为在我看来有点奇怪 我仍在学习使用JavaScript编写代码,我不是专家,但这些高级功能有点复杂 我不想使用jQuery,只想使用纯JavaScript来学习基础 <!-- Forms handling --> <script src="validate_functions.js"></script>
<!-- Forms handling -->
<script src="validate_functions.js"></script>
<script>
(function main() {
var frmPrev = document.getElementById('frmPrev');
var frmCont = document.getElementById('frmCont');
var btnPrev = frmPrev['btnPrev'];
var btnCont = frmCont['btnCont'];
var caller = '';
var forename = '';
var surname = '';
var phone = '';
var email = '';
var privacy = '';
var message = '';
var infoBox = document.getElementById('info-box');
var infoBoxClose = infoBox.getElementsByTagName('div')['btnClose'];
btnPrev.onclick = function(e) {
submit(e);
};
btnCont.onclick = function(e) {
submit(e);
};
function submit(which) {
caller = which.target.name;
var errors = '';
if(caller == 'btnPrev') {
forename = frmPrev['name'].value.trim();
surname = frmPrev['surname'].value.trim();
phone = frmPrev['phone'].value.trim();
email = frmPrev['email'].value.trim();
message = frmPrev['message'].value.trim();
privacy = frmPrev['privacy'].checked;
}
if(caller == 'btnCont') {
phone = frmCont['phone'].value.trim();
email = frmCont['email'].value.trim();
message = frmCont['message'].value.trim();
}
errors = validateFields(caller, forename, surname, phone, email, privacy, message);
if(errors == '') {
var params = 'which=' + caller;
params += '&fname=' + forename;
params += '&sname=' + surname;
params += '&tel=' + phone;
params += '&email=' + email;
params += '&priv=' + privacy;
params += '&mess=' + message;
var request = asyncRequest();
request.open('POST', "send-mail.php", true);
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
request.setRequestHeader('Content-length', params.length);
request.setRequestHeader('Connection', 'close');
request.onreadystatechange = function() {
if(this.readyState == 4) {
if(this.status == 200) {
if(this.responseText != null) {
infoBox.innerHTML = this.responseText;
} else {
infoBox.innerHTML = '<p>No data from server!</p>';
}
} else {
infoBox.innerHTML = '<p>Could not connect to server! (error: ' + this.statusText + ' )</p>';
}
}
}
request.send(params);
} else {
infoBox.innerHTML = errors;
}
infoBox.style.display = 'block';
}
infoBoxClose.onclick = function() {
infoBox.style.display = 'none';
infoBox.innerHTML = '';
};
function validateFields(_caller, _forename, _surname, _phone, _email, _privacy, _message) {
var errs = '';
if(_caller == 'btnPrev') {
errs += validateForename(_forename);
errs += validateSurname(_surname);
errs += validatePhone(_phone);
errs += validateEmail(_email);
errs += validateMessage(_message);
errs += validatePrivacy(_privacy);
}
if(_caller == "btnCont") {
errs += validatePhone(_phone);
errs += validateEmail(_email);
errs += validateMessage(_message);
}
return errs;
}
function asyncRequest() {
var request;
try {
request = new XMLHttpRequest();
}
catch(e1) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(e2) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
}
catch(e3) {
request = null;
}
}
}
return request;
}
})();
(函数main(){
var frmPrev=document.getElementById('frmPrev');
var frmCont=document.getElementById('frmCont');
var btnPrev=frmPrev['btnPrev'];
var btnCont=frmCont['btnCont'];
var调用者=“”;
变量名=“”;
var姓氏=“”;
var phone='';
var电子邮件=“”;
var隐私=“”;
var消息=“”;
var infoBox=document.getElementById('info-box');
var infoBoxClose=infoBox.getElementsByTagName('div')['btnClose'];
btnPrev.onclick=函数(e){
提交(e);
};
btnCont.onclick=函数(e){
提交(e);
};
功能提交(哪个){
调用者=which.target.name;
var误差=“”;
如果(呼叫者=='btnPrev'){
forename=frmPrev['name'].value.trim();
姓氏=frmPrev['姓氏].value.trim();
phone=frmPrev['phone'].value.trim();
email=frmPrev['email'].value.trim();
message=frmPrev['message'].value.trim();
隐私=frmPrev[“隐私”]。已选中;
}
如果(调用者=='btnCont'){
phone=frmCont['phone'].value.trim();
email=frmCont['email'].value.trim();
message=frmCont['message'].value.trim();
}
错误=验证字段(呼叫者、姓名、姓氏、电话、电子邮件、隐私、消息);
如果(错误=“”){
var params='which='+调用者;
params+='&fname='+forename;
params+='&sname='+姓氏;
params+='&tel='+电话;
参数+='&电子邮件='+电子邮件;
params+='&priv='+隐私;
参数+='&mess='+消息;
var request=asyncRequest();
open('POST','sendmail.php',true);
setRequestHeader('Content-type','application/x-www-form-urlencoded');
request.setRequestHeader('Content-length',params.length);
setRequestHeader('Connection','close');
request.onreadystatechange=函数(){
if(this.readyState==4){
如果(this.status==200){
如果(this.responseText!=null){
infoBox.innerHTML=this.responseText;
}否则{
infoBox.innerHTML='没有来自服务器的数据!';
}
}否则{
infoBox.innerHTML='无法连接到服务器!(错误:'+this.statusText+');
}
}
}
请求发送(params);
}否则{
infoBox.innerHTML=错误;
}
infoBox.style.display='block';
}
infoBoxClose.onclick=function(){
infoBox.style.display='none';
infoBox.innerHTML='';
};
函数验证字段(\u呼叫者、\u名字、\u姓氏、\u电话、\u电子邮件、\u隐私、\u消息){
var errs='';
如果(_caller=='btnPrev'){
errs+=validateForename(_forename);
errs+=validateSurname(_姓氏);
errs+=验证电话(_电话);
errs+=validateEmail(_email);
errs+=验证消息(_消息);
errs+=验证隐私(_隐私);
}
如果(_caller==“btnCont”){
errs+=验证电话(_电话);
errs+=validateEmail(_email);
errs+=验证消息(_消息);
}
返回错误;
}
函数asyncRequest(){
var请求;
试一试{
请求=新的XMLHttpRequest();
}
渔获物(e1){
试一试{
请求=新的ActiveXObject('Msxml2.XMLHTTP');
}
渔获物(e2){
试一试{
请求=新的ActiveXObject('Microsoft.XMLHTTP');
}
渔获物(e3){
请求=null;
}
}
}
返回请求;
}
})();
Web控制台一直告诉我没有定义单一验证函数
为什么?
它们应该从外部脚本加载。。此外,它们应该具有全球范围
提前感谢:)问题解决了
外部脚本的路径不正确
对不起,这些垃圾^^“删除函数main(){`(和结尾的右括号)前面的
(
)@dustytrash为什么?会有什么变化?你确定问题不包含在validate_functions.js
中吗?如果validate_functions.js文件中有IIFEs,那么这些函数不是全局函数。命名函数表达式的名称仅在函数本身中可见。解决后,我确定外部文件的路径是c正确,但事实并非如此;由于路径不正确,脚本未加载“validate_functions.js”。谢谢大家:)