it-swarm-id.com

Apa yang menyebabkan kesalahan "Tidak dapat menjalankan kode dari skrip yang dibebaskan"

Saya pikir saya sudah menemukan solusinya beberapa saat yang lalu (lihat blog ) saya:

Jika Anda pernah mendapatkan kesalahan JavaScript (atau yang seharusnya menjadi JScript) "Tidak dapat menjalankan kode dari skrip yang dibebaskan" - coba pindahkan meta tag di kepala sehingga mereka berada di depan tag skrip Anda. 

... tetapi berdasarkan pada salah satu komentar blog terbaru, perbaikan yang saya sarankan mungkin tidak bekerja untuk semua orang. Saya pikir ini akan menjadi yang baik untuk membuka komunitas StackOverflow ....

Apa yang menyebabkan kesalahan "Tidak dapat menjalankan kode dari skrip yang dibebaskan" dan apa solusi/penyelesaiannya?

57
Tom Robinson

Kedengarannya seperti Anda telah menemukan bug/masalah dalam cara beberapa tag ditangani atau bahwa Anda memiliki referensi ke objek yang dirilis di mana Anda mencoba menjalankan metode.

Pertama saya akan memindahkan tag <meta> sebelum tag <script> seperti yang disarankan di sini dan banyak tempat lainnya.

Kemudian periksa untuk melihat apakah Anda memiliki masalah halaman/keamanan dibahas di sini .

19
Joe Skora

Anda mendapatkan kesalahan ini ketika Anda memanggil fungsi yang dibuat di jendela atau bingkai yang tidak ada lagi. 

Jika Anda tidak tahu sebelumnya apakah jendela itu masih ada, Anda dapat mencoba/menangkap untuk mendeteksinya:

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

Kesalahan ini disebabkan ketika jendela 'induk' skrip dibuang (yaitu: ditutup) tetapi referensi ke skrip yang masih ditahan (seperti di jendela lain) dipanggil. Meskipun 'objek' masih hidup, konteks di mana ia ingin mengeksekusi tidak.

Agak kotor, tetapi berfungsi untuk Windows Sidebar Gadget saya:

Berikut adalah ide umum: Jendela 'utama' mengatur fungsi yang akan mengevaluasi beberapa kode, ya, itu jelek . Kemudian 'anak' dapat memanggil ini "fungsi pembangun" (yang merupakan/terikat ke ruang lingkup jendela utama /) dan mendapatkan kembali fungsi yang juga terikat ke jendela 'utama'. Kerugian yang jelas adalah, tentu saja, bahwa fungsi yang 'melambung' tidak dapat menutup ruang lingkup yang tampaknya didefinisikan dalam ... bagaimanapun, cukup banyak omong kosong:

Ini sebagian pseudo-code, tetapi saya menggunakan varian itu pada Windows Sidebar Gadget (Saya terus mengatakan ini karena Sidebar Gadgets berjalan di "unlimitedricted zone 0", yang mungkin - atau mungkin tidak - mengubah skenario dengan sangat baik.)


// 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

Sebagai varian, jendela utama harus dapat meneruskan fungsi functionBuilder ke jendela anak - selama fungsi functionBuilder didefinisikan dalam konteks jendela utama!

Saya merasa seperti saya menggunakan terlalu banyak kata. YMMV.

18
user166390

Jika Anda mencoba mengakses objek JS, cara termudah adalah membuat salinan:

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

Semoga ini bisa membantu.

8

Inilah kasus yang sangat spesifik di mana saya telah melihat perilaku ini. Ini direproduksi untuk saya di IE6 dan IE7.

Dari dalam iframe:

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

Kemudian, setelah memuat ulang iframe dengan konten baru, di jendela yang berisi iframe:

window.mySpecialHandler();

Panggilan ini gagal dengan "Tidak dapat menjalankan kode dari skrip yang dibebaskan" karena mySpecialHandler didefinisikan dalam konteks (DOM asli iframe) yang tidak lagi keluar. (Memuat ulang iframe menghancurkan konteks ini.)

Namun Anda dapat dengan aman menetapkan nilai "serialisasi" (primitif, grafik objek yang tidak mereferensikan fungsi secara langsung) di jendela induk. Jika Anda benar-benar membutuhkan jendela terpisah (dalam kasus saya, iframe) untuk menentukan beberapa pekerjaan ke jendela jarak jauh, Anda dapat meneruskan pekerjaan sebagai String dan "eval" di penerima. Hati-hati dengan ini, umumnya tidak membuat untuk implementasi yang bersih atau aman.

6
aaron

Kesalahan ini dapat terjadi di MSIE ketika jendela anak mencoba berkomunikasi dengan jendela induk yang tidak lagi terbuka.

(Bukan teks pesan kesalahan yang paling membantu di dunia.)

3
pcorcoran

Saya mengalami masalah ini ketika di dalam bingkai anak saya menambahkan jenis referensi ke jendela tingkat atas dan mencoba mengaksesnya setelah jendela anak dimuat ulang

yaitu.

// 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
...

Saya bisa menyelesaikan masalah dengan hanya menggunakan tipe primitif

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

Ini sebenarnya bukan jawaban, tetapi lebih merupakan contoh di mana ini tepatnya terjadi.

Kami memiliki bingkai A dan bingkai B (ini bukan ide saya, tapi saya harus hidup dengannya). Frame A tidak pernah berubah, Frame B berubah secara konstan. Kami tidak dapat menerapkan perubahan kode langsung ke frame A, jadi (sesuai instruksi vendor) kami hanya dapat menjalankan JavaScript di frame B - frame persis yang terus berubah.

Kami memiliki bagian JavaScript yang perlu dijalankan setiap 5 detik, jadi JavaScript di bingkai B membuat tag skrip baru dan memasukkan ke dalam bagian kepala bingkai B. SetInterval ada di skrip baru ini (yang disuntikkan), serta fungsi untuk memanggil. Meskipun JavaScript yang disuntikkan secara teknis dimuat oleh frame A (karena sekarang berisi tag skrip), begitu frame B berubah, fungsinya tidak lagi dapat diakses oleh setInterval.

1
Nathan Crause

Saya mendapatkan kesalahan ini di IE9 dalam halaman yang akhirnya membuka iFrame. Selama iFrame tidak terbuka, saya bisa menggunakan localStorage. Setelah iFrame dibuka dan ditutup, saya tidak dapat menggunakan localStorage lagi karena kesalahan ini. Untuk memperbaikinya, saya harus menambahkan kode ini ke dalam Javascript yang ada di dalam iFrame dan juga menggunakan localStorage.

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

Pada pembaruan src iframe saya mendapatkan kesalahan itu.

Mendapat kesalahan itu dengan mengakses suatu peristiwa (klik dalam kasus saya) dari suatu elemen di jendela utama seperti ini (langsung memanggil jendela utama/paling luar): 

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

Saya baru saja mengubahnya seperti ini dan berfungsi baik (memanggil induk dari induk jendela iframe):

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

Iframe saya yang berisi modal juga di dalam iframe lain.

0
Chan

Penjelasannya sangat relevan dalam jawaban sebelumnya. Hanya berusaha memberikan skenario saya. Semoga ini bisa membantu orang lain.

kami menggunakan:

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

, dan memanggil fungsi lain dalam skrip pada acara onchange tetapi writeln sepenuhnya menimpa HTML di IE di mana ia memiliki perilaku berbeda di chrome.

kami mengubahnya menjadi:

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

Dengan demikian mempertahankan skrip yang memperbaiki masalah ini.

0
pavan kumar

mendapatkan kesalahan ini di DHTMLX saat membuka dialog & id induk atau id jendela saat ini tidak ditemukan 

        $(document).ready(function () {

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

});

Pastikan Anda mengirim id jendela arus/induk yang benar saat membuka dialog

0
panky sharma