1

我正在创建一个 Chrome 扩展程序,它通过 inject.js 在页面上注入 HTML 表单,当输入查询并按下按钮时,通过 background.js 进行 API 调用。然后将内容带回 inject.js 脚本并进行处理。

当我第一次尝试通过 inject.js 拨打电话时,我收到以下错误:

    Error in event handler for 'undefined': fetchResult is not defined ReferenceError: searchResult is not defined

奇怪的是,当我稍等片刻并再次按下查询时。

我怀疑 fetchresult 第一次是未定义的,因为获取查询需要一些时间,但我不知道如何解决这个问题。

注入.js:

    function fetch() {

    var fetchResult;

    var fetchquery = document.getElementById('field').value;

    chrome.extension.sendMessage({greeting: fetchquery}, function(response) {
             fetchResults = response.farewell
            constructHTML(fetchResultsResults)      

        });
    };

背景.js:

    function loadXMLDoc(query)
    {

   if (query){
    // new cross origin XML request

   xmlhttp=new XMLHttpRequest();
   xmlhttp.onreadystatechange=function()
    {
     if (xmlhttp.readyState==4 && xmlhttp.status==200)
      {
         fetchResult = JSON.parse(xmlhttp.responseText);
         }
     }

   xmlhttp.open("GET","http://XXXXXXXXXXXXXXX&q="+query, true);
   xmlhttp.send();

   return fetchResult;

   } else {

       return "noquery";
    }
    };

    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
       if (loadXMLDoc(request.greeting) != "noquery"){
            sendResponse({farewell: loadXMLDoc(request.greeting)})
            }
    });

任何帮助将不胜感激!

4

1 回答 1

4

XMLHttpRequest 是异步的,因此return fetchResult您应该调用回调来传递结果,而不是 。这是一个例子:

   function loadXMLDoc(query, callback)
   {

   if (query){
    // new cross origin XML request

   xmlhttp=new XMLHttpRequest();
   xmlhttp.onreadystatechange=function()
    {
     if (xmlhttp.readyState==4)
      {
         if(xmlhttp.status==200)
         {
           fetchResult = JSON.parse(xmlhttp.responseText);
           callback(fetchResult);
         } else {
           callback("noquery");
         }
      }
     }

   xmlhttp.open("GET","http://XXXXXXXXXXXXXXX&q="+query, true);
   xmlhttp.send();

   } else {

       callback("noquery");
    }
    };

    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
            loadXMLDoc(request.greeting, function(fetchResult) {
              if (fetchResult != "noquery")
                sendResponse({farewell: fetchResult})
              else
                sendResponse({});
            });
            return true; // See the description of https://developer.chrome.com/extensions/extension.html#property-onMessage-sendResponse.
    });
于 2013-03-25T01:14:02.443 回答