Javascript 带有全局变量的IE bug。如何绕过这个错误?
正如标题所说,我在IE8和Javascript方面有一些问题。众所周知,它在解释全局变量时存在缺陷:如果不声明为:Javascript 带有全局变量的IE bug。如何绕过这个错误?,javascript,jquery,internet-explorer,Javascript,Jquery,Internet Explorer,正如标题所说,我在IE8和Javascript方面有一些问题。众所周知,它在解释全局变量时存在缺陷:如果不声明为: var variable1 = something; 问题是,我正试图创建一个脚本,通过单击按钮来更改主体背景,我需要一个全局变量来包装实际状态(我正在加载的bg-x.png)。这个脚本适用于FF、Safari和Chrome,但显然不适用于IE。帮助?(问题在于变量“状态”) $(“#更改”)。单击(函数(){ 风险值numStates=2; var name=$(this.te
var variable1 = something;
问题是,我正试图创建一个脚本,通过单击按钮来更改主体背景,我需要一个全局变量来包装实际状态(我正在加载的bg-x.png)。这个脚本适用于FF、Safari和Chrome,但显然不适用于IE。帮助?(问题在于变量“状态”)
$(“#更改”)。单击(函数(){
风险值numStates=2;
var name=$(this.text();
如果(!(状态)){
状态=parseInt(1,10);
}
如果(status由于您已经在使用jQuery,您可以使用以下变量代替全局变量:
$('#change').click(function() {
var numStates = 2;
var name = $(this).text();
// If data-status isn't defined set it to the initial value
if($('body').data('status') === undefined)
$('body').data('status',1);
// Extract the status
var status = parseInt($('body').data('status'),10);
// Handle the status
if(status < numStates)
status++;
else
status = 1;
// Save the status
$('body').data('status',status);
/* ... Rest of your code ... */
$(“#更改”)。单击(函数(){
风险值numStates=2;
var name=$(this.text();
//如果未定义数据状态,请将其设置为初始值
if($('body').data('status')==未定义)
$('body')。数据('status',1);
//提取状态
var status=parseInt($('body')。数据('status'),10);
//处理状态
如果(状态
请注意,这在IE中的XML文档中不起作用(根据jQuery文档)。状态是窗口对象的预定义成员,指向状态栏的内容。请使用另一个变量名。您知道何时使用»var«?
我刚刚用以下方法清理了您的代码:
添加“var status;”使其成为局部变量
删除switch语句中已定义变量的“var”
删除“background:bgvar”后面不必要的逗号,这将导致IE中出现错误
$('#change').click(function () {
var numStates = 2;
var name = $(this).text();
var status;
if (!(status)) {
status = parseInt(1, 10);
}
if (status < numStates) {
status = parseInt(status, 10) + 1;
} else {
status = parseInt(1, 10);
}
alert(status);
var bgvar = null;
switch (parseInt(status, 10)) {
case 1:
bgvar = ' #7097ab url(./img/bg-' + status + '.png) top center repeat';
name = 'Pattern';
break;
case 2:
bgvar = ' #7097ab url(./img/bg-' + status + '.png) top center repeat-x';
name = 'Sfumato';
break;
default:
alert('Default');
}
$('body').css({
background: bgvar
});
$(this).text(name);
});
$(“#更改”)。单击(函数(){
风险值numStates=2;
var name=$(this.text();
var状态;
如果(!(状态)){
状态=parseInt(1,10);
}
如果(状态
现在能用了吗
注意:用于防止此类错误。1)发布包含“状态”声明的代码,以及声明的位置。2)您是否尝试更改变量名称?可能是“状态”不知何故是一个保留的IE8关键字,我不知道…实际上状态在这个保留的JS关键字列表中:全局变量永远不需要。@cristystatus
在该代码块中声明。我在代码中发现了两个错误。第一个错误是关于变量名(cristy建议它是保留的),另一个错误是检查“status”已定义。我正在使用正确的代码进行编辑。不管怎样@Lucero我如何避免使用全局变量?有很多方法可以避免它们,Zeta已经发布了一个解决方案。常用的方法是使用闭包。这根本不起作用,因为状态
现在将在每次调用时重新初始化,因此它会被删除es状态应该包含两个调用。它不起作用,因为在函数执行结束时,状态变量设置为1。我需要它保持在函数执行过程中增加的数字。但是,感谢您提供有关使用“var”的提示。我对JS语法不是很精通,因为很清楚:)我用你的方式。非常感谢你的帮助!
$('#change').click(function() {
var numStates = 2;
var name = $(this).text();
// If data-status isn't defined set it to the initial value
if($('body').data('status') === undefined)
$('body').data('status',1);
// Extract the status
var status = parseInt($('body').data('status'),10);
// Handle the status
if(status < numStates)
status++;
else
status = 1;
// Save the status
$('body').data('status',status);
/* ... Rest of your code ... */
$('#change').click(function () {
var numStates = 2;
var name = $(this).text();
var status;
if (!(status)) {
status = parseInt(1, 10);
}
if (status < numStates) {
status = parseInt(status, 10) + 1;
} else {
status = parseInt(1, 10);
}
alert(status);
var bgvar = null;
switch (parseInt(status, 10)) {
case 1:
bgvar = ' #7097ab url(./img/bg-' + status + '.png) top center repeat';
name = 'Pattern';
break;
case 2:
bgvar = ' #7097ab url(./img/bg-' + status + '.png) top center repeat-x';
name = 'Sfumato';
break;
default:
alert('Default');
}
$('body').css({
background: bgvar
});
$(this).text(name);
});