2011-12-13 6 views
12

크롬 확장 (콘텐츠 스크립트)에서 JSONP 요청을 만들고 있습니다. 브라우저에서 HTML 파일을로드하는 웹 페이지로 실행할 때 모든 것이 잘 작동하지만 크롬 확장으로로드하면 서버가 응답을 보낼 때 jquery로 만든 jsonp 콜백 함수가 존재하지 않는 것처럼 보입니다. .크롬 확장 JSONP 요청, 콜백 함수가 존재하지 않습니까?

내 콘솔은 말한다 : 여기

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined 

내 아약스 요청입니다 :

$.ajax({ 
    url: 'http://example.com', 
    data: 
    { 
     imgUrl: this.href, 
     returnString:true 
    }, 
    dataType: "jsonp", 
    success: function(msg){ 
     newNode.src = msg.data; 
    }, 
    error: function(msg){ 
     console.log(msg.data); 
    } 
}) 
+0

가 명확히하기 위해, 당신은 문제없이 크롬 확장 외부에서 시도했습니다? 요청하는 URL에 대한 호스트 권한이 있습니까? –

+0

올바른 것으로, 크롬 확장이 아닌 경우 - 자바 스크립트 파일이 포함 된 웹 페이지를 열면 제대로 작동합니다. 아마도 이것이 콘텐츠 스크립트라고 언급해야합니다. –

+0

내 manifest.json 파일을 확인했는데 정확합니다. 확실한 테스트 방법이 있습니까? –

답변

23

문제는 JSONP 응답은 샌드 박스 자바 스크립트 코드의 외부, 실제 페이지에 의해 체포되고 있는지 그 Chrome 콘텐츠 스크립트는 사용자를 제한합니다.

jQuery17105683612572029233_1323808231542은 jQuery JSONP 호출이 특정 호출에 대해 동적으로 생성 한 콜백 함수의 이름입니다. 이 함수는 컨텐츠 스크립트가 액세스 할 수있는 샌드 박스 영역에 정의됩니다.

제가 알고있는 유일한 해결책은 콘텐츠 스크립트에서 XHR 호출을 만드는 것입니다. Chrome 13부터는 콘텐츠 스크립트에서 XHR로 교차 도메인 호출을 할 수 있습니다 (멋진 기능). 매니페스트 파일에서는 사용 권한에 외부 URL을 추가해야합니다

{ 
    ... 
    "permissions": [ 
     "http://example.com" 
    ] 
} 

그런 다음 XHR 호출과 같이 할 수 있습니다 :

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com/", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     //handle the xhr response here 
    } 
} 
xhr.send(); 

당신은 일 그 중 일부를 수행해야합니다 jQuery를 xhr.responeText 또는 xhr.reponseXML의 응답을 객체로 변환 할뿐만 아니라 XHR URL (해당 경우 "imrUrl"및 "returnString")에 데이터 객체의 값을 인코딩하는 것과 같이 자동으로 수행하고있었습니다.

이 접근법의 단점은이 코드를 Chrome 확장 프로그램과 다른 프로그램 (예 : 북마크릿)간에 공유하는 경우 이제 Chrome 사용 사례에 대해 다른 로직을 사용해야한다는 것입니다. 더 많은 정보를 들어

은 다음을 참조하십시오 Chrome Extension XHR

+4

우수 설명. 또한 매니페스트에서 권한을 설정하고 나면 JSONP 대신 JSON을 사용하여 jQuery AJAX를 사용할 수 있으며 작동 할 것이라고 덧붙인다. – ron

+0

답변 본문에 @ ron의 설명 내용을 추가 할 것을 제안합니다. –

관련 문제