如何使用jQuery禁用/启用按钮?

时间:2016-03-07 21:19:13

标签: javascript jquery

我正在为一个课堂上的项目工作,而我在这方面几乎是一个绝对的初学者。我有一个在Ubuntu上运行的服务器。在script.js里面我有

$(document).ready(function(){
    $.get('/var/www/html/hadoopstatus.txt', function(response) {
        var $hadoopstatus = response;
    }, "text");
    if ($hadoopstatus == 'Running'){
        document.getElementById('b2').disabled = false;
    }
    if ($hadoopstatus == 'Stopped'){
        document.getElementById('b1').disabled = false;
    }
});

在index.html里面我有

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="script.js"></script>
// some stuff
</head>

<body>
// stuff
<form method="post">
<button type="submit" id="b1" disabled>Start Hadoop</button>
<button type="submit" id="b2" disabled>Stop Hadoop</button>
</form>
// stuff
</body>

/var/www/html/hadoopstatus.txt仅包含

Running

我遇到的问题是按钮,在这种情况下是“停止Hadoop”按钮,将无法启用。我做错了什么?

3 个答案:

答案 0 :(得分:1)

$ .get函数是异步的,所以你必须等到它完成。

所以将代码更改为:

 $.get('/var/www/html/hadoopstatus.txt', function(response) {
   var $hadoopstatus = response;
   if ($hadoopstatus == 'Running') {
     document.getElementById('b2').disabled = false;
   }
   if ($hadoopstatus == 'Stopped') {
     document.getElementById('b1').disabled = false;
   }
 }, "text");

完全控制:

var jqxhr = $.get('/var/www/html/hadoopstatus.txt', function(response) {
  alert( "success" );

  if (response == 'Running') {
     document.getElementById('b2').disabled = false;
   }
   if (response == 'Stopped') {
     document.getElementById('b1').disabled = false;
   }


}, "text")
  .done(function() {
    alert( "second success" );
  })
  .fail(function() {
    alert( "error" );
  })
  .always(function() {
    alert( "finished" );
  });

答案 1 :(得分:0)

你有两个问题。首先,您已在回调函数中定义了$hadoopstatus变量。一旦回调函数退出,变量将被清除。但另一个更严重的问题是你正在进行AJAX调用,这可能需要几秒钟才能完成。但是在发起该呼叫后,您立即检查$hadoopstatus的值。

这是异步编程的问题。您需要记住AJAX调用将在您启动后完成一段时间。这就是为什么有一个回调函数。当AJAX调用完成加载数据时,该代码将运行......无论是几毫秒还是10秒。

我调整了代码以使所有业务逻辑适合您的回调函数。当AJAX调用完成后,它将从响应中创建$hadoopstatus变量,然后检查该值并禁用相应的按钮。

$(document).ready(function(){
    $.get('/var/www/html/hadoopstatus.txt', function(response) {
        var $hadoopstatus = response;
        if ($hadoopstatus == 'Running'){
            document.getElementById('b2').disabled = false;
        }
        if ($hadoopstatus == 'Stopped'){
            document.getElementById('b1').disabled = false;
        }
    }, "text");

});

请记住,$hadoopstatus的值在此函数之外将不可用,因为您在函数内部创建了“var”。功能完成后,变量也是如此。如果在AJAX调用之前使用“var”命令,那么您仍然会遇到问题,因为当代码因为加载延迟而尝试运行它时,它可能不会包含该值。换句话说,在期待您的AJAX呼叫是即时的时要小心。它可能不会。

答案 2 :(得分:0)

另一种可能的解决方案是:

$(function() {
  $.get('hadoopstatus.txt', function(response) {
    switch (response.trim()) {
      case 'Running':
        document.getElementById('b2').disabled = false;
        break;
      case 'Stopped':
        document.getElementById('b1').disabled = false;
        break;
    }
  }, "text");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

<form method="post">
    <button type="submit" id="b1" disabled>Start Hadoop</button>
    <button type="submit" id="b2" disabled>Stop Hadoop</button>
</form>

评估.get函数中的响应。这是一个异步功能。