Javascript 带有全局变量的IE bug。如何绕过这个错误?

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

正如标题所说,我在IE8和Javascript方面有一些问题。众所周知,它在解释全局变量时存在缺陷:如果不声明为:

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关键字列表中:全局变量永远不需要。@cristy
    status
    在该代码块中声明。我在代码中发现了两个错误。第一个错误是关于变量名(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);
    
    
    });