2010-03-31 122 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());} 

希望這有助於..