2009-11-20 3 views
1

나는 팝업 윈도우의 DOM-trees와 그 개폐기가 조작하는 방법을 이해하기가 어렵다. 제가하려고하는 것을 구현하는 적절한 방법은 무엇입니까 (아래 설명 참조)?팝업 창의 내용을 AJAX 요청으로 바꾸는 방법은 무엇입니까?

JavaScript 함수가 선택된 요소를 모으고 거기에서 POST 데이터 문자열을 만드는 일반적인 브라우저 창 하나가 있습니다. 그런 다음 자리 표시 자 컨텐츠가있는 팝업 창을 열고 AJAX 요청을 수행하는 window.ready에 함수를 바인딩 한 다음 팝업 창에서 HTML을 AJAX 결과로 바꾸려고 시도합니다.

코드에서 이것은 오프너 창에서 실행되는 의 JavaScript에서 수행됩니다..


function showMessages(queryParams, width, height) { 
    var mailWindow = window.open('html/blankwithdoctype.html', 'foo', 'resizable=yes,scrollbars=yes,height='+height+',width='+width); 
    var params = queryParams.substring(1); 
    $(mailWindow.document).ready(function() { 
     doPostRequest(params, mailWindow); 
    }); 
    return mailWindow; 
} 

function doPostRequest(queryParams, mailWindow) { 
    function callback(data, textStatus) { 
     var mv = mailWindow; 
     $(mv.document).find("html").html(data); 
    }; 
    $.post('MailFile.do', queryParams, callback); 
} 

크롬 개발자 도구 나 파이어 폭스 + 지르고와 $(mv.document).find("html").html(data);에서 깨고, 나는 일시적으로 결과가 표시되는 것을 알 수 있지만, JQuery와 콜 스택 ( $.post('MailFile.do', queryParams, callback); 후) 풀리는 후 원래 빈 페이지가 다시 한번 표시됩니다.

디버거가 없으면 결과 페이지의 렌더링이 최소한으로 시작되었지만 원래의 자리 표시 자 페이지로 빠르게 바뀌 었음을 알았습니다.

뭔가 재미있는 일이 벌어지고 있습니다.

답변

0

jQuery 라이브러리가 팝업 창에로드되지 않은 것 같습니다. 그런 다음 팝업 창에서 준비 이벤트를 따르는 코드가 실행될 때 $ 기능을 알 수 없으므로 오류가 발생합니다. 나는 window)document 항상 십자가가 아니라 윈도우 방식으로 ready()을 사용하지 (그리고 결코하지만 잘못 될 수도

편집 :. 당신은 또한 (대신) 열린 창에서 jQuery를 포함로 무엇을 할 수 있는지 교체입니다 모든 $은 열린 창에서 window.opener.$입니다.하지만 그것은 오히려 못 생겼습니다. 지금은 그렇지 않습니까? ;-)

+0

jQuery 라이브러리를로드하지 않아도 문제가 발생하지 않습니다. 내 원래의 질문에 모든이 조작은 오프너 창에서 이루어집니다 그래서 열린 창에서 JQuery의 부족 문제가 안된다 설명하지 않았다. – Eonwe

+0

나는 그것을 알고 있었다. 그러나 열린 윈도우의'ready()'에 전달하는 익명 함수는 내가 틀리지 않으면 열린 윈도우의 전역 컨텍스트에서 실행됩니다. 그것이 가시성 문제가 있다고 생각한 이유입니다. 실제로 해봤습니까?폐쇄로 인해 '$'가 표시 될 수 있지만, 나는 확실히 모른다. –

0

사실이 문제를 직접 해결할 방법을 찾고있었습니다. 나는 브라우저가 보안상의 이유로 자식 윈도우의 DOM을 수정하는 것을 막을 것이라고 추측하고있다. (나는 어떤 종류의 에러를 주길 바란다.)

어쨌든 나는 이미 존재하는 페이지를 열 필요가 없었고, 나의 어플리케이션은 다중 스크린을 수용하기 위해 별도의 팝업을 필요로했다. .

window.open(null, null, "...options...")으로 팝업을 연 후 간단히 document.write("...FULL HTML FOR POPUP...")을 호출하고 전체 팝업을 기본적으로 처음부터 작성했습니다. 그 시점부터 부모 창에서 수행하고자하는 모든 DOM 작업에 액세스 할 수있었습니다. 난 단지 정말 불행하게도, 크롬과 파이어 폭스에서 이것을 테스트

// using null for the URL (defaults to about:blank in some browsers) 
// using null for the Window Name (allowed me to have multiple popups) 
var popup = window.open(null, null, "width=600,height=600"); 

// overwrite the entire document with our own HTML 
popup.document.write('<!DOCTYPE html><html><head></head><body></body></html>'); 

// Using jQuery for DOM manipulation here 
var $popup = $("body", popup.document); 

:

여기에 내가 무슨 말의 예입니다. 또한 태그를 설정해도 팝업 창의 제목은 변경되지 않았습니다. 완벽한 솔루션은 아니지만 제 상황에서 효과가있었습니다.

관련 문제