【问题标题】:Jquery callback function variables always local?Jquery回调函数变量总是本地的?
【发布时间】:2015-12-27 18:58:49
【问题描述】:

为什么我不能将 $('#temizle').innerHTML 设置为字符串 'Temizlendi'; 代码打击只是不起作用。但在结束前的行中,我可以设置它。我很困惑。

        $('#temizle').click(function(){
            $.post('OdbcConnection.php',
                {islem: 'Temizle'},
                function(data, status){
                    if(status == 'success'){
                        alert(status);
                        $('#temizle').innerHTML = 'Temizlendi';
                    }else{
                        this.innerHTML = 'Hata Var';
                    }
                });
            //this.innerHTML = 'Temizlendi';
        });

【问题讨论】:

  • 定义“不起作用”。这有什么作用?有错误吗?具体的意外行为?当你调试这个时,jQuery 选择器是否找到了你正在寻找的元素?
  • * 没有错误。 $('#temizle') 这是一个
    元素。 * 意外行为是 = 我无法在第 7 行将其 innerHTML 属性设置为字符串 'temizlendi'。 * 我也不能在第 9 行将 innerHTML 属性设置为字符串。但;我可以在第 12 行设置

标签: javascript jquery scope


【解决方案1】:

简短的回答是因为innerHTML 是本机DOM 节点方法,而不是jQuery 方法,因此在诸如$('#temizle') 之类的jQuery 对象上调用它只会在jQuery 对象中设置一个新的innerHTML 属性。它可以在您的 $.post 调用之外工作,因为 this 继承了本机 DOM 节点,而不是 jQuery 对象。

尝试使用$.html() 方法而不是innerHTML

$('#temizle').html('Temizlendi');

或者,在$.post 范围之外,也可以将this.innerHTML 重写为$(this).html(),因为包装this 会将其转换为jQuery 对象。

如果您绝对必须使用 innerHTML 而不是 jQuery 方法,如其他答案中所述,您还可以通过使用 get() 方法或访问 0 索引处的节点从 jQuery 对象获取 DOM 节点jQuery 对象:

$( '#temizle' ).get(0).innerHTML = 'Foo';
$( '#temizle' )[0].innerHTML = 'Bar';

虽然这会破坏使用 jQuery 的目的。

要记住的另一件事是this 的值取决于当前作用域,因此在$.post 内部调用this 时将不等于您的元素。为了解决这个问题,您可以在 post 调用范围之外缓存您的元素,以便您可以轻松地在回调中引用它:

$('#temizle').click(function(){
    var $el = $( this );

    $.post('OdbcConnection.php',
        {islem: 'Temizle'},
        function(data, status){
            if(status == 'success'){
                alert(status);
                $el.html( 'Temizlendi' );
            }else{
                $el.html( 'Hata Var' );
            }
        });

    //$el.html( 'Temizlendi' );
});

为了更好地理解this,我强烈建议您查看关于它的MDN 参考here

【讨论】:

  • $('#temizle').html('Temizlendi');那条线解决了这个问题。谢谢大家。
【解决方案2】:

alert(status) 被调用了吗?如果不是,这仅仅意味着您的 POST 请求失败。

如果确实失败,请检查php文件的路径是否正确。您现在拥有的是相对路径,也许您需要将其转换为绝对路径, 即:将'OdbcConnection.php' 更改为'/OdbcConnection.php''/{SOME_FOLDER}/OdbcConnection.php'

【讨论】:

  • alert(status) 工作得很好。它提醒“成功”。但是属性没有改变。
  • 检查其他答案,他们解决了您将 j​​Query 对象与本机元素对象混淆的问题。
【解决方案3】:

首先你要写

$('#temizle').html('Temizlendi')  //not   $('#temizle').innerHTML='Temizlendi'  

或者你可以使用

$('#temizle')[0].innerHTML ='Temizlendi'

第二个:你用过

this.innerHTML = 'Hata Var';

但是“this”是针对函数而不是针对 $('#temizle') 元素的

【讨论】:

    【解决方案4】:

    当您使用 $('#temizle').InnerHTML 时,您调用的是方法 innerHTML,它属于 DOM 对象,但不属于 jQuery 对象。在这种情况下,您应该使用 jQuery 的 html() 方法: $('#temizle')html('Temizlendi');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多