将函数传递给变量

时间:2011-10-01 12:12:50

标签: jquery

我正在尝试将函数传递给变量(req):

var req;
$('#complete-field').bind('keyup', function() { 
var url =  prefixUrl + escape($('#complete-field').val());
req = function() {
  if (window.XMLHttpRequest) {
    if (navigator.userAgent.indexOf('MSIE') != -1) {
        isIE = true;
    }
    return new XMLHttpRequest();

    } else if (window.ActiveXObject) {
        isIE = true;
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
};

req.open("GET", url, true);
req.onreadystatechange = callback;
req.send(null); 
});

但我总是得到以下错误:

  
    

req.open不是一个函数     req.open(“GET”,url,true);

  

任何想法如何解决这个问题。 非常感谢

7 个答案:

答案 0 :(得分:1)

你应该命名你的功能并调用它。

var req;
$('#complete-field').bind('keyup', function() { 
var url =  prefixUrl + escape($('#complete-field').val());

function ajaxObject() {
  if (window.XMLHttpRequest) {
    if (navigator.userAgent.indexOf('MSIE') != -1) {
        isIE = true;
    }
    return new XMLHttpRequest();

    } else if (window.ActiveXObject) {
        isIE = true;
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
};

req = ajaxObject();
req.open("GET", url, true);
req.onreadystatechange = callback;
req.send(null); 
});

您的代码会将整个函数存储到req变量中..而不是它的返回值(它从未被调用过。

答案 1 :(得分:0)

您的req变量是指一个函数。这意味着您可以使用括号调用它,如

req()

结果将是一个XmlHttpRequest,然后您可以调用open和其他函数。

此外,请注意,您似乎正在尝试重新发明轮子,jquery已经通过$ .ajax和类似的API支持跨浏览器XHR。

答案 2 :(得分:0)

您需要编写req()而不是req.,因为您执行req会返回您需要的对象:

var request = req();
request.open("GET", url, true);
request.onreadystatechange = callback;
request.send(null); 

答案 3 :(得分:0)

您想要执行该功能并将结果保存到变量:

req = (function() {
  if (window.XMLHttpRequest) {
    if (navigator.userAgent.indexOf('MSIE') != -1) {
      isIE = true;
    }
    return new XMLHttpRequest();

  } else if (window.ActiveXObject) {
      isIE = true;
      return new ActiveXObject("Microsoft.XMLHTTP");
    }
})();

答案 4 :(得分:0)

在您调用req.open()时,变量req包含一个函数,而不是XMLHTTP对象。该功能尚未执行。

要执行声明的功能,请将()添加到结尾。

req = function() {
    ...
}();

答案 5 :(得分:0)

您正在将函数的引用放在变量中。使用这个:

var req;
req = function() {
  ...
}

基本上与:

相同
function req() {
  ...
}

(在这种情况下,范围当然会有所不同,因为你在事件处理者之外声明了变量。)

问题在于您如何使用该功能。函数和它的返回值不一样,你必须调用函数来获取返回值:

var xhr = req();

现在您可以使用返回值:

xhr.open("GET", url, true);
xhr.onreadystatechange = callback;
xhr.send(null);

答案 6 :(得分:0)

我将它用于本机AJAX:

(window.ActiveXObject) ? httpRequest = new ActiveXObject("Microsoft.XMLHTTP") : httpRequest = new XMLHttpRequest();  


httpRequest.open('POST', 'btAppendX.php', true);    
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
httpRequest.onreadystatechange =  function () { (httpRequest.readyState == 4 && httpRequest.status == 200) ? responseData(httpRequest) : window.status = httpRequest.statusText;}                                     
httpRequest.send(zAllInOne);

压缩......