2013-03-12 3 views
0

내 웹 사이트의 실시간 편집기를 만들고 있습니다. 나는 CSS와 HTML 부분을 가지고있다. 문제는 JS 부분이다. 여기자바 스크립트를 Iframe에 삽입

var frame = $('#preview_content'), 
      contents = frame.contents(), 
      body = contents.find('body'); 
      csstag = contents.find('head').append('<style></style>').children('style'); 
      java = contents.find('head').append('<script><\/script>').children('script');//Issues here 
     $('.area_content_box').focus(function() { 
     var $this = $(this); 
     var check = $this.attr('id'); 
     $this.keyup(function() { 

     if (check === "html_process"){ 
     body.html($this.val()); 
     } else if(check === "css_process") { 
     csstag.text($this.val()); 
     } else if (check === "java_process"){ 
     java.text($this.val()); 
     } 

     }); 
     }); 

문제는 내가이 시도 그 어느 때가 iframe을 몸이나 머리에 스크립트 태그를 주입하지 않는 것입니다 코드의 조각이다. 내가 주사를 읽고 끝점 스크립트 태그를 포함하는 몇 가지 문제를 읽었습니다. 나는 스크립트 태그를 삽입하는 방법을 알아야하고, 실제로 그것들을 머리 속에 넣고 싶지만, 몸이 더 쉽다면 괜찮습니다.

jfriend00 - 정직하게 생각한다면이 바닐라 만들기에 집중할 것입니다.

내 JS 편집기를 올바르게 사용하는 방법에 대한 조언이 필요하십니까? 이 스타일 태그를 만들고 해당 DOM 요소를 기억하는 것이 훨씬 더 좋을 것이다 것 같다

csstag = contents.find('head').append('<style></style>').children('style'); 
java = contents.find('head').append('<script><\/script>').children('script');//Issues here 

: 그들은으로 문제가있을 수 있습니다 같은 코드의

+0

iframe 대신 contenteditable 속성을 사용 하시겠습니까? IE조차도 그런 식으로 지원합니다. – Jodes

+0

contenteditable은 iframe처럼 보이게 할 수 있습니까? 내가 무슨 뜻인지 안다면? – EasyBB

+0

다르지만 동일한 효과를 얻을 수 있습니다. 요즘에는 다른 웹 사이트에서 무언가를 퍼가는 제한된 범위의 시나리오에서만 iframe을 사용하려고합니다. – Jodes

답변

4

이 두 라인이 보인다.

var iframe = document.getElementById("preview_content"); 
var iframewindow = iframe.contentWindow || iframe.contentDocument.defaultView; 
var doc = iframewindow.document; 
var csstag = doc.createElement("style"); 
var scripttag = doc.createElement("script"); 
var head = doc.getElementsByTagName("head")[0]; 
head.appendChild.cssTag; 
head.appendChild.scriptTag; 

$('.area_content_box').focus(function() { 
    var $this = $(this); 
    var check = this.id; 
    $this.keyup(function() { 
     if (check === "html_process") {\ 
      // I would expect this to work 
      doc.body.html($this.val()); 
     } else if(check === "css_process") { 
      // I don't know if you can just replace CSS text like this 
      // or if you have to physically remove the previous style tag 
      // and then insert a new one 
      csstag.text($this.val()); 
     } else if (check === "java_process"){ 
      // this is unlikely to work 
      // you probably have to create and insert a new script tag each time 
      java.text($this.val()); 
     } 
    }); 
}); 

이 코드는 본문 HTML에서 작동하며 CSS 텍스트를 스타일 태그로 사용할 수 있습니다.

나는 당신이하는 방식대로 태그에 텍스트를 할당하여 스크립트를 변경할 수 없으므로 자바 스크립트에서 작동하지 않을 것이라고 생각합니다. 스크립트가 파싱되면 javascript 네임 스페이스에 있습니다.

공개 API가 없습니다. 이전에 정의되고 해석 된 스크립트를 제거하는 것에 대해 알고 있습니다. 후속 스크립트로 전역 심볼을 재정의 할 수는 있지만 이전 스크립트 나 그 효과를 제거 할 수는 없습니다.

내 코드라면 이전 스타일 태그를 제거하고 새 스타일 태그를 만들고 DOM에 삽입하기 전에 텍스트를 설정 한 다음 DOM에 삽입하십시오.

그런 식으로하지 않으려는 경우 이미 삽입 된 (및 구문 분석 한) 스타일 태그에 .text()을 설정하는 개념이 모든 관련 브라우저에서 작동하는지 여부를 테스트해야합니다.

스크립트 태그의 경우 새 스크립트 태그를 작성하고 다시 삽입해야하지만 전역 심볼을 다시 정의하는 것 외에 이미 구문 분석 된 이전 코드를 제거 할 방법은 없습니다. 코드를 처음부터 새로 시작하려면 처음부터 새로운 iframe 객체를 만들어야합니다.


다른 문제가 있습니다. .area_content_box에 포커스가있을 때마다 .keyup() 이벤트 핸들러를 설치하면 많은 수의 이벤트 핸들러가 설치되어 결국 모두 호출되고 동일한 작업을 수행하려고 할 수 있습니다.

+0

흠 내일 내가 침대로 향할 때 이것을 살펴볼 것입니다. 나는 CSS가 작동하는 것을 안다. 이것은 단지 라이브 에디터 일뿐입니다. 요소에 스타일이 없습니다. 사람이 HTML 텍스트 영역을 클릭하고 HTML을 씁니다. 그런 다음 CSS 상자를 클릭하고 해당 요소의 스타일을 지정합니다. 그렇다면 자바 스크립트는 스크립트 태그 내에서 동일한 방법으로 사용됩니다. 일종의 JSBin과 비슷하지만, 내 사이트 전용으로 제작하고 호스팅 회사와 함께 작동하는 몇 가지 기능을 추가했습니다. 아직도 당신이 실제로 이것을 읽고 읽는 것에 투표했습니다. 고맙습니다 – EasyBB

+0

제 경우에는 iframe이 다른 도메인에서 왔으며 가능한 자바 스크립트를 주입하고 있습니까? –

+1

@coding_idiot - 보안상의 이유로 다른 도메인에서 iframe을 수정할 수 없습니다. 동일한 원산지 정책 [여기] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript)을 참조하십시오. – jfriend00