2013-09-25 4 views
1

애드온 빌더를 사용하여 기본 기능이있는 애드온을 빌드합니다.
- http://youtube.com에서 의견 (A)을 받으십시오.
- 웹 서버에서이 텍스트를 처리하고 json을 반환합니다.
- (A)를 (B)로 바꾸고 사용자에게 표시합니다.
서버 요청에 문제가 있습니다 (브라우저 콘솔에 많은 줄이 있습니다) :
JSON.parse 예상치 못한 데이터 파이어 폭스 추가 기능

GET http://localhost:8084/Test/Test [HTTP/1.1 200 OK 8ms] 
JSON.parse unexpected end of data fire fox addon. 

하지만 마지막 요청은 성공합니다. 그리고 내 코드는 요청 응답 전에 변경 되었기 때문에 주석이 변경되지 않습니다.

lib 디렉토리/main.js

var tag = "p"; 
var data = require("sdk/self").data; 
var pageMod = require("sdk/page-mod"); 

pageMod.PageMod({ 
    include: "*.youtube.com", 
    contentScriptFile: data.url("element-getter.js"), 
    contentScriptWhen: "end"  
}); 

데이터/요소-getter.js

var target = document.querySelector('#watch-discussion'); 

var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
    var commenttexts = document.querySelectorAll(".comment-text"); 
    for (var i = 0; i < commenttexts.length; ++i) { 
      var url = "http://localhost:8084/Test/Test";   
      var request = new XMLHttpRequest(); 
      var cm = " hello "; 
      request.open("GET", url, true); 
      request.onload = function() { 
      var jsonResponse = JSON.parse(request.responseText); 
      var status = jsonResponse.status; 
      cm = status; 
      }; 
      request.send();    
      commenttexts[i].innerHTML = cm; 
    }   
    });  
}); 
var config = { childList: true }; 
observer.observe(target, config); 

JSON 서버 반환 : 당신은 assynchronous 요청을 만드는

{"status":"1","label":"true"} 
+0

for 루프 대신 forEach 루프를 수행하여 XHR 요청이 자체 클로저에 있도록 할 수 있습니다. 현재 각 루프에서 '요청'을 덮어 씁니다. – jsantell

답변

1

, 그래서 Thist 관련 부 :

commenttexts[i].innerHTML = cm; 

은 요청이 응답 할 때, 즉 request.send(); 다음이 아닌 request.onload 함수 내부에서 호출되어야합니다. 결국 요청이 돌아 오기 전에 먼저 해당 부분을 실행한다는 의미입니다.

는이 같은이 있어야합니다

for (var i = 0; i < commenttexts.length; ++i) { 
  (function(i) { 
    var request = new XMLHttpRequest(); 
    var cm = " hello "; 
    request.open("GET", url, true); 
    request.onload = function() { 
     var jsonResponse = JSON.parse(request.responseText); 
     var status = jsonResponse.status; 
     cm = status; 
     commenttexts[i].innerHTML = cm; 
    }; 

    request.send(); 
  })(i); 
} 

이 돌아 오면, 당신은 온로드 기능 내부 변수 i에 액세스 할 경우에만 변경됩니다 이런 식으로.

+0

도움을 주셔서 감사합니다. 애드온을 실행할 때 충돌 폭탄 오류가 발생하고 회선 코드를 모른다 : i cumga007

+0

오타입니다. 그것은 오직 하나 < –

+0

고마워요, 고쳐 주셔야합니다. 정말 고맙습니다!!! – cumga007

관련 문제