2010-03-31 88 views
0

我想调用一个web服务使用javascript.But它显示一个错误,如 selectSingleNode()不是一个方法。我试图在Mozilla Firefox中。当我更改XMLHttpRequest到ActiveXObject.here我添加我的源代码,我在Firefox中尝试。使用Javascript调用Webservice

<script language="javascript"> 
// Web Service functionality 
// Global vars 
var xmlDoc = null; 
var _serviceCallback = null; 


// Calls web service, web service url and parms, and callback function or null must be provided. 
// Callback function receives a true or false based on success of call to host 
function callWebService(url, callback) 
{ 
    _serviceCallback = callback; 

    if(xmlDoc == null) 
    { 
     // xmlDoc = new XMLHttpRequest(); 
xmlDoc = new XMLHttpRequest(); 

    } 

    xmlDoc.onreadystatechange = stateChange; //callback for readystate 
    xmlDoc.async = true; //do background processing 

    //xmlDoc.load(url); 
xmlDoc.open('GET', url); 
xmlDoc.send(); 
//var doc= xmlDoc.responseXML; 

} 

// Updates readystate by callback 
function stateChange() 
{ 
    if (xmlDoc.readyState == 4) 
    { 
var err = xmlDoc.parseError; 
     var result = false; 
     var nd; 
     if(err.errorCode == 0) 
     { 
      nd = xmlDoc.selectSingleNode("//envelope/date_time"); 
      if(nd.text != "") 
       result = true; 
     } 

     // perform callback if provided 
     if(_serviceCallback != null) 
      _serviceCallback(result, nd == null ? "" : nd.text); 
    } 
} 

// Callback supplied to XMLHttpRequest call 
function callbackTest(result, data) 
{ 
    obj = document.getElementById("txtOuput"); 

    if(result) 
     obj.value = "Success " + data; 
    else 
     obj.value = "Web Service Call Failed"; 
} 
    </script> 
<input type="button" onclick="callWebService('http://www.hendricksongroup.com/services/WebService.asmx/GetTime?input=Test', callbackTest)" value="Click" /> 
<input type="text" id="txtOuput"/> 

请帮我...这已经杀了我8个小时......

+0

它会更容易帮助,如果你把你的代码中的一个代码块,以使其更具可读性... – sblom 2010-03-31 04:02:50

+2

是否有你的理由阻止使用已建立并经过测试的AJAX库(如jQuery)? – 2010-03-31 04:05:24

+3

尽管大多数指向jquery等的非答案答案都是有意的,但理解这些东西如何工作是有价值的。这个问题很简单,答案也是如此。干杯。 – 2010-03-31 04:35:09

回答

1

我会建议使用jQuery库。它有一些非常漂亮的机制来获取,放置和ajax调用。它可以在所有浏览器中运行,并且如果有很多教程和支持论坛可以帮助您解决问题

+0

-1不是问题的答案。 – 2010-03-31 04:28:56

1

首先,您需要使用跨浏览器技术来确保您获得有效的XMLHttpRequest对象。

这种方法不仅会为浏览器提供最好的XHR,它还是一种“记忆”功能。这意味着工厂逻辑只执行一次。

而且您可以在JS here中了解更多关于调用各种服务的信息。

function createXHR() { 
    var xmlhttp, XMLHttpFactories = [ 
     function() { 
      return new XMLHttpRequest(); 
     }, function() { 
      return new ActiveXObject("Msxml2.XMLHTTP"); 
     }, function() { 
      return new ActiveXObject("Msxml3.XMLHTTP"); 
     }, function() { 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    ]; 
    for (var i = 0; i < XMLHttpFactories.length; i++) { 
     try { 
      xmlhttp = XMLHttpFactories[i](); 
      this.createXHR = XMLHttpFactories[i]; 
      return xmlhttp; 
     } catch (e) { } 
    } 
} 

其次,您需要使用交叉浏览器技术来使用xml。您可以了解从http://www.w3schools.com/Xml/xml_parser.asp

if (window.DOMParser) 
    { 
    parser=new DOMParser(); 
    xmlDoc=parser.parseFromString(text,"text/xml"); 
    } 
else // Internet Explorer 
    { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async="false"; 
    xmlDoc.loadXML(text); 
    } 

OR

if (window.XMLHttpRequest) 
    { 
    xhttp=new XMLHttpRequest(); 
    } 
else // Internet Explorer 5/6 
    { 
    xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xhttp.open("GET","books.xml",false); 
xhttp.send(""); 
xmlDoc=xhttp.responseXML; 
+0

现有的JS框架的复制功能是正确的答案? – R0MANARMY 2010-03-31 04:31:01

+0

@ R0MANARMY - 在这个问题中没有提到任何框架。这就是问题的答案。 – 2010-03-31 04:32:21

+0

从技术上讲,你是对的,没有提及任何框架,你的答案就是问题的答案。不过,我认为,在他/她不知道/熟悉他们的情况下,将OP指向框架的方向是有价值的。 – R0MANARMY 2010-03-31 04:38:06

0

我会建议使用JSON这一点。这非常简单,浏览器的兼容性被JSON scrypting所关注。

这就像调用带有代理的web服务,调用一个公共函数并传递值(如果有的话)。此代码仅适用于.NET。

创建一个web服务,不要忘记添加ScriptService选项卡。

// Summary description for RScriptService /// </summary> 
[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService()] public class ProfileService : System.Web.Services.WebService {Public string ExecuteCommand(param, param,param){} 

}

在aspx文件

<cc1:ToolkitScriptManager ID="ScriptManager1" AsyncPostBackTimeout="600" runat="server" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError"EnablePageMethods="true"><Services><asp:ServiceReference Path="ProfileService.asmx"/></Services></cc1:ToolkitScriptManager> 

调用这些Web服务使用Javascript代码添加脚本条目。

//Call the function function GetProfileDetails(){ProfileService.ExecuteCommand(request1,request2, OnGetProfileDetailsSuccess, OnGetProfileDetailsError);} 

//Call back for succes function OnGetProfileDetailsSuccess(result){for (var property in result) {//get the result result[property];}} 

//Call back for error function OnGetProfileDetailsError(error) {alert("An error occured while executing command<br/>" + error.get_message());} 

希望这有助于..