Использовать jQuery для замены XMLHttpRequest

Я совершенно новый для библиотек JavaScript. Я хотел заменить мой текущий код на jQuery. Мой текущий код выглядит следующим образом:

var req;

function createRequest() {
   var key = document.getElementById("key");
   var keypressed = document.getElementById("keypressed");
   keypressed.value = key.value;
   var url = "/My_Servlet/response?key=" + escape(key.value);
   if (window.XMLHttpRequest) {
      req = new XMLHttpRequest();
   } else if (window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
   }
   req.open("Get", url, true);
   req.onreadystatechange = callback;
   req.send(null);
}

function callback() {
   if (req.readyState == 4) {
      if (req.status == 200) {
         var decimal = document.getElementById('decimal');
         decimal.value = req.responseText;
      }
   }
   clear();
}

Я хотел заменить мой код чем-то немного более дружелюбным, как

jQuery <
$.get(url, callback);

Однако он не вызывает мою функцию обратного вызова.

Также я хотел бы называть функцию с именем createRequest непрерывно. У jQuery есть хороший способ сделать это?

Ответы

Ответ 1

$.get(url, {}, callback);

должен сделать трюк. Ваш обратный вызов можно упростить следующим образом:

function callback(content){
    $('#decimal').val(content);
}

Или даже короче:

$.get(url, {}, function(content){
    $('#decimal').val(content);
});

И все, что я думаю, это должно сработать:

function createRequest() {
    var keyValue = $('#key').val();
    $('#keypressed').val(keyValue);
    var url = "/My_Servlet/response";
    $.get(url, {key: keyValue}, function(content){
        $('#decimal').val(content);
    });
}

Ответ 2

Выньте проверки готовности и состояния. jQuery только вызывает ваш обратный вызов при успешном завершении. В вашем обратном вызове представлены аргументы (data, textStatus), поэтому вы должны использовать data вместо req.responseText.

window.setTimeout(), как было предложено другим ответом, не будет делать то, что вы хотите - это только ждет, а затем вызывает вашу функцию один раз. Вместо этого вам нужно использовать window.setInterval(), который будет вызывать вашу функцию периодически, пока вы ее не отмените.

Итак, вкратце:

var interval = 500; /* Milliseconds between requests. */
window.setInterval(function() {
    var val = $("#key").val();
    $("#keypressed").val(val);
    $.get("/My_Servlet/response", { "key": val }, function(data, textStatus) {
        $("#decimal").val(data);
    });
}), interval);

Ответ 3

Я не думаю, что jQuery реализует функцию таймаута, но простой старый javascript делает это довольно красиво:)

Ответ 4

В соответствии с docs аргументы jQuery.get url, data, callback, а не url, callback.

Вызов функции setTimeout JavaScript в конце вашей функции обратного вызова должен быть достаточным для непрерывного выполнения этого.

Ответ 5

Нет необходимости устанавливать параметры GET на URL, jQuery будет устанавливать их автоматически. Попробуйте этот код:

var key = document.getElementById("key");
[...]
var url = "/My_Servlet/response";
$.get (url, {'key': key}, function (responseText)
{
    var decimal = document.getElementById ('decimal'); 
    decimal.value = responseText;
});

Ответ 6

В конце концов, я предполагаю, что был добавлен тип. Кажется, это работает для меня.

  function convertToDecimal(){ 
    var key = document.getElementById("key"); 
    var keypressed = document.getElementById("keypressed"); 
    keypressed.value = key.value; 
    var url = "/My_Servlet/response?key="+ escape(key.value);
    jQuery.get(url, {}, function(data){
       callback(data);}
       , "text" );
  }

  function callback(data){
    var decimal = document.getElementById('decimal');
    decimal.value = data;
    clear();
  }

Спасибо всем за помощь. Я проголосую за вас.