it-swarm-ko.tech

"해제 된 스크립트에서 코드를 실행할 수 없습니다"오류가 발생하는 원인

나는 얼마 전에 해결책을 찾았다 고 생각했다 (내 blog 참조) :

JavaScript (또는 JScript 여야 함) 오류 "해제 된 스크립트에서 코드를 실행할 수 없음"오류가 발생하는 경우 헤드에서 메타 태그를 이동하여 스크립트 태그 앞에 오도록하십시오.

...하지만 가장 최근의 블로그 댓글 중 하나에 따르면 내가 제안한 수정 사항이 모든 사람에게 적용되지 않을 수 있습니다. 나는 이것이 StackOverflow 커뮤니티에 개방하기에 좋은 것이라고 생각했다 ....

"해제 된 스크립트에서 코드를 실행할 수 없습니다"라는 오류가 발생하는 원인과 해결 방법은 무엇입니까?

61
Tom Robinson

더 이상 존재하지 않는 창 또는 프레임에서 작성된 함수를 호출하면이 오류가 발생합니다.

창이 여전히 존재하는지 미리 알 수없는 경우 시도/캐치를 수행하여이를 감지 할 수 있습니다.

try
{
  f();
}
catch(e)
{
  if (e.number == -2146823277)
    // f is no longer available
    ...
}
34
Sjoerd Visscher

오류는 스크립트의 '부모'창이 삭제 될 때 발생합니다 (예 : 닫힘). 그러나 여전히 다른 스크립트와 같이 유지되는 스크립트에 대한 참조가 호출됩니다. ' object '는 아직 살아 있지만 실행하려는 컨텍스트는 없습니다.

다소 더럽지 만 Windows 사이드 바 가제트에서 작동합니다.

일반적인 아이디어는 다음과 같습니다. '메인'창은 일부 코드를 평가하는 기능을 설정합니다. 그런 다음 '자식'은이 "빌더 기능"(메인 창의 범위에/bound /)을 호출하고 '메인'창에 바인딩 된 함수를 다시 가져올 수 있습니다. 당연히 불리한 점은 '리바운드'기능이 어쨌든 충분히 정의 된 범위를 넘어 설 수 없다는 것입니다.

이것은 부분적으로 의사 코드이지만 Windows 사이드 바 가제트에서 변형을 사용합니다 (사이드 바 가제트는 "제한되지 않은 영역 0"에서 실행되므로 시나리오가 크게 변경되거나 변경되지 않을 수 있음).


// This has to be setup from the main window, not a child/etc!
mainWindow.functionBuilder = function (func, args) {
  // trim the name, if any
  var funcStr = ("" + func).replace(/^function\s+[^\s(]+\s*\(/, "function (")
  try {
    var rebuilt
    eval("rebuilt = (" + funcStr + ")")
    return rebuilt(args)
  } catch (e) {
    alert("oops! " + e.message)
  }
}

// then in the child, as an example
// as stated above, even though function (args) looks like it's 
// a closure in the child scope, IT IS NOT. There you go :)
var x = {blerg: 2}
functionInMainWindowContenxt = mainWindow.functionBuilder(function (args) {
  // in here args is in the bound scope -- have at the child objects! :-/
  function fn (blah) {
    return blah * args.blerg
  }
  return fn
}, x)

x.blerg = 7
functionInMainWindowContext(6) // -> 42 if I did my math right

변형으로, 메인 윈도우 컨텍스트에 functionBuilder 함수가 정의되어있는 한 메인 윈도우는 functionBuilder 함수를 자식 윈도우에 전달할 수 있어야합니다!

너무 많은 단어를 사용한 것 같습니다. YMMV.

19
user166390

일부 태그가 처리되는 방식에서 버그/문제가 발생했거나 메소드를 실행하려고하는 릴리스 된 객체에 대한 참조가있는 것 같습니다.

먼저 <meta> 태그 앞에 <script> 태그가 제안 된대로 여기 및 기타 여러 위치에 있습니다.

그런 다음 논의 된 페이지/보안 문제가 있는지 확인하십시오 여기 .

19
Joe Skora

JS 객체에 액세스하려는 경우 가장 쉬운 방법은 사본을 만드는 것입니다.

var objectCopy = JSON.parse(JSON.stringify(object));

도움이 되길 바랍니다.

8
Grzegorz Ciwoniuk

자식 창에서 더 이상 열려 있지 않은 부모 창과 통신하려고 할 때 MSIE에서이 오류가 발생할 수 있습니다.

(세계에서 가장 유용한 오류 메시지 텍스트는 아닙니다.)

6
pcorcoran

이 동작을 본 매우 구체적인 경우가 있습니다. IE6 및 IE7에서 재현 가능합니다.

Iframe 내에서 :

window.parent.mySpecialHandler = function() { ...work... }

그런 다음 iframe이 포함 된 창에서 새 컨텐츠로 iframe을 다시로드 한 후 다음을 수행하십시오.

window.mySpecialHandler();

MySpecialHandler가 더 이상 종료되지 않는 컨텍스트 (iframe의 원래 DOM)에 정의 되었기 때문에 "사용 가능한 스크립트에서 코드를 실행할 수 없습니다"와 함께이 호출이 실패합니다. (iframe을 다시로드하면이 컨텍스트가 손상되었습니다.)

그러나 부모 창에서 "직렬화 가능"값 (기본, 함수를 직접 참조하지 않는 객체 그래프)을 안전하게 설정할 수 있습니다. 원격 창에 작업을 지정하기 위해 별도의 창 (필자의 경우 iframe)이 실제로 필요한 경우 작업을 문자열로 전달하고 수신자에서 작업을 "평가"할 수 있습니다. 이 점에 유의하십시오. 일반적으로 깨끗하거나 안전한 구현은 아닙니다.

6
aaron

IE9부터는 다른 객체의 Array에 저장된 Date 객체에서 .getTime ()을 호출 할 때이 오류가 발생하기 시작했습니다. 해결책은 Date 메소드를 호출하기 전에 Date인지 확인하는 것입니다.

실패 : rowTime = wl.rowData[a][12].getTime()

통과 : rowTime = new Date(wl.rowData[a][12]).getTime()

5
Tom

자식 프레임 내부 에서이 문제가 발생하여 최상위 창에 참조 유형을 추가하고 자식 창을 다시로드 한 후 액세스하려고했습니다.

즉.

// set the value on first load
window.top.timestamp = new Date();

// after frame reloads, try to access the value
if(window.top.timestamp) // <--- Raises exception
...

기본 유형 만 사용하여 문제를 해결할 수있었습니다

// set the value on first load
window.top.timestamp = Number(new Date());
2
wycleffsean

이것은 실제로 답이 아니지만 더 정확하게 발생하는 예입니다.

우리는 프레임 A와 프레임 B를 가지고 있습니다 (이것은 제 생각이 아니었지만 함께 살아야합니다). 프레임 A는 절대 변경되지 않으며 프레임 B는 지속적으로 변경됩니다. 코드 변경 사항을 프레임 A에 직접 적용 할 수 없으므로 (공급 업체의 지시에 따라) 프레임 B에서만 JavaScript를 실행할 수 있습니다.

5 초마다 실행해야하는 JavaScript가 있으므로 프레임 B의 JavaScript는 새 스크립트 태그를 작성하고 프레임 B의 헤드 섹션에 삽입합니다. setInterval은 다음과 같이 새 스크립트 (삽입 된 스크립트)에 존재합니다. 뿐만 아니라 호출 할 함수도 있습니다. 삽입 된 JavaScript는 기술적으로 프레임 A에 의해로드되지만 (이제 스크립트 태그가 포함되어 있기 때문에) 프레임 B가 변경되면 setInterval에서 더 이상 함수에 액세스 할 수 없습니다.

1
Nathan Crause

IE9에서 결국 iFrame을 여는 페이지 내 에서이 오류가 발생했습니다. iFrame이 열려 있지 않으면 localStorage를 사용할 수 있습니다. iFrame을 열고 닫으면이 오류 때문에 더 이상 localStorage를 사용할 수 없었습니다. 이 문제를 해결하려면 iFrame 내부의 Javascript와 localStorage를 사용하여이 코드를 추가해야했습니다.

if (window.parent) {
    localStorage = window.parent.localStorage;
}
0
Melanie

Iframe의 src를 업데이트 할 때 해당 오류가 발생합니다.

다음과 같이 주 창에서 요소의 이벤트 (내 경우에는 클릭)에 액세스하여 오류가 발생했습니다 (주 창을 직접 호출).

top.$("#settings").on("click",function(){
    $("#settings_modal").modal("show");
}); 

방금 다음과 같이 변경했으며 정상적으로 작동합니다 (iframe 창의 부모의 부모를 호출).

$('#settings', window.parent.parent.document).on("click",function(){                    
   $("#settings_modal").modal("show");      
});

모달을 포함하는 내 iframe도 다른 iframe 안에 있습니다.

0
Chan

설명은 이전 답변에서 매우 관련이 있습니다. 내 시나리오를 제공하려고합니다. 이것이 다른 사람들을 도울 수 있기를 바랍니다.

우리는 사용하고 있었다 :

<script> window.document.writeln(table) </script>

, onchange 이벤트에서 스크립트의 다른 함수를 호출하지만 writeln은 크롬에서 다른 동작을하는 IE의 HTML을 완전히 재정의합니다.

우리는 그것을 다음과 같이 변경했습니다.

<script> window.document.body.innerHTML = table;</script> 

따라서 문제를 해결 한 스크립트를 유지했습니다.

0
pavan kumar

대화 상자 및 부모 ID 또는 현재 창 ID를 찾을 수없는 동안 DHTMLX 에서이 오류가 발생했습니다.

        $(document).ready(function () {

            if (parent.dxWindowMngr == undefined) return;
            DhtmlxJS.GetCurrentWindow('wnManageConDlg').show();

});

대화 상자를 여는 동안 올바른 curr/parent window id를 보내고 있는지 확인하십시오.

0
panky sharma