it-swarm-tr.com

Hataya neden olan "Serbest bir komut dosyasından kod yürütülemiyor"

Çözümü bir süre önce bulduğumu düşünmüştüm ( blog'uma bakın ):

Herhangi bir JavaScript (veya serbest bırakılmış bir komut dosyasından kod çalıştırılamıyor) hatası - JavaScript kodunu alırsanız (ya da JScript olmalıdır) - kafanızdaki meta etiketlerini kod etiketlerinizden önce taşımaya çalışın. 

... ancak en son blog yorumlarından birine göre, önerdiğim düzeltme herkes için işe yaramayabilir. StackOverflow topluluğuna açılmanın iyi olacağını düşündüm.

"Serbest bir komut dosyasından kod yürütemez" hatasına neden olan nedir ve çözümler/geçici çözümler nelerdir?

57
Tom Robinson

Bazı etiketlerin işlenme biçiminde bir hataya/soruna çarpmışsınız veya üzerinde yöntemler çalıştırmaya çalıştığınız yayınlanmış nesnelere referanslar almışsınız.

Öncelikle, <meta> etiketlerini, here 'in önerdiği şekilde <script> etiketlerinden önce ve diğer pek çok yerde taşımak isterdim.

Ardından burada tartışılan sayfa/güvenlik sorunlarınız olup olmadığını kontrol edin here .

19
Joe Skora

Artık mevcut olmayan bir pencerede veya çerçevede oluşturulmuş bir işlevi çağırdığınızda bu hatayı alırsınız. 

Pencerenin hala mevcut olup olmadığını bilmiyorsanız, tespit etmek için bir deneme/yakalama yapabilirsiniz:

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

Hata, betiğin 'üst' penceresi atıldığında (yani: kapalı), ancak hala tutulan komut dosyasına (başka bir pencerede olduğu gibi) başvuru yapıldığında ortaya çıkar. 'nesne' hala hayatta olsa da, yürütmek istediği içerik değildir.

Biraz kirli, ancak Windows Kenar Çubuğu Gadget'ım için çalışıyor:

İşte genel fikir: 'Ana' penceresi bazı kodları değerlendirebilecek bir işlev ayarlar, evet, bu çok çirkin . Sonra bir 'çocuk' bu "oluşturucu işlevi" olarak adlandırabilir (ki bu/ana pencerenin kapsamına bağlı /) ve 'ana' pencereye de bağlı bir işlevi geri alır. Açık bir dezavantaj, elbette, 'geri tepme' işlevinin görünüşte tanımlandığı kapsamda kapanamamasıdır ... yine de ...

Bu kısmen sahte koddur, ancak Windows Sidebar Gadget'ında bunun bir türevini kullanıyorum (Bunu söylüyorum çünkü Sidebar Gadget'ları senaryoyu büyük ölçüde değiştirebilecek veya değiştirmeyecek şekilde "sınırsız bölge 0" da çalışıyorlar.)


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

Bir değişken olarak, ana pencere functionBuilder işlevini alt pencereye geçirebilmelidir - functionBuilder işlevi ana pencere bağlamında tanımlandığı sürece!

Çok fazla kelime kullanmış gibi hissediyorum. YMMV.

18
user166390

JS nesnesine erişmeye çalışıyorsanız, en kolay yol bir kopya oluşturmaktır:

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

Umarım yardımcı olur.

8
Grzegorz Ciwoniuk

İşte bu davranışı gördüğüm çok özel bir durum. IE6 ve IE7'de benim için tekrarlanabilir.

Bir iframe içinden:

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

Ardından, yeni içeriği olan iframe'i yeniden yükledikten sonra, iframe'i içeren pencerede:

window.mySpecialHandler();

MySpecialHandler artık varolmayan bir bağlamda (iframe'nin orijinal DOM'si) tanımlandığı için bu çağrı "Serbest bir komut dosyasından kod yürütülemiyor" ile başarısız oluyor. (İframe'in yeniden yüklenmesi bu içeriği tahrip etti.)

Bununla birlikte, üst pencerede "serileştirilebilir" değerleri (ilkel, doğrudan işlev görmeyen nesne grafikleri) güvenle ayarlayabilirsiniz. Uzak bir pencereye bazı çalışmalar yapmak için gerçekten ayrı bir pencereye (benim durumumda, iframe) ihtiyacınız varsa, işi bir String olarak geçirebilir ve alıcıda "değerlendirebilirsiniz". Buna dikkat edin, genellikle temiz veya güvenli bir uygulama yapmaz.

6
aaron

IE9'dan başlayarak, başka bir Nesne içindeki bir Array'da saklanan bir Date nesnesindeki .getTime () öğesini çağırırken bu hatayı almaya başladık. Çözüm, Date yöntemlerini çağırmadan önce bir Date olduğundan emin olmaktı:

Başarısız: rowTime = wl.rowData[a][12].getTime()

Geçiş: rowTime = new Date(wl.rowData[a][12]).getTime()

5
Tom

Bu hata MSIE'de, bir alt pencere artık açık olmayan bir üst pencere ile iletişim kurmaya çalıştığında ortaya çıkabilir.

(Dünyadaki en yararlı hata mesajı metni değil.)

3
pcorcoran

Bir alt çerçevenin içinde üst seviye pencereye bir referans türü ekledim ve alt pencere yeniden yüklendikten sonra erişmeye çalıştığımda bu sorunu yaşadım

diğer bir deyişle.

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

Bu sorunu yalnızca ilkel türleri kullanarak çözebildim

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

Bu gerçekten bir cevap değil, bunun tam olarak nerede gerçekleştiğine bir örnek.

A çerçevesi ve B çerçevesi var (bu benim fikrim değildi, ama onunla yaşamak zorundayım). Kare A asla değişmez, Kare B sürekli değişir. Kod değişikliklerini doğrudan A çerçevesine uygulayamayız, bu nedenle (satıcının talimatlarına göre) sadece B çerçevesindeki JavaScript'i çalıştırabiliriz - sürekli değişen çerçeve.

Her 5 saniyede bir çalışması gereken bir JavaScript parçamız vardır, bu nedenle B karesindeki JavaScript yeni bir komut dosyası etiketi oluşturur ve B çerçevesinin baş bölümüne ekler. SetInterval bu yeni komut dosyalarında (enjekte edilen) çağırmak için işlev. Enjekte edilen JavaScript teknik olarak A karesiyle teknik olarak yüklenmesine rağmen (şu anda script etiketini içerdiğinden), B karesi değiştiğinde, fonksiyona setInterval tarafından erişilemez.

1
Nathan Crause

Bu hatayı IE9'da sonunda bir iFrame açan bir sayfa içinde aldım. İFrame açık olmadığı sürece localStorage kullanabilirim. İFrame açılıp kapandıktan sonra, bu hata nedeniyle artık localStorage'ı kullanamadım. Bunu düzeltmek için, bu kodu iFrame'in içindeki Javascript'e eklemek ve ayrıca localStorage kullanarak eklemek zorunda kaldım.

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

İframe's src güncellemesinde bu hatayı alıyorum.

Ana penceredeki bir öğeye ait bir olaya (benim durumumda tıkla) erişerek (ana/dış pencereyi doğrudan çağırarak) bu hatayı aldım: 

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

Ben sadece bu şekilde değiştirdim ve iyi çalışıyor (iframe penceresinin ebeveyni ebeveyni çağırıyor):

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

Modal içeren iframe'im de başka bir iframe'in içinde.

0
Chan

Açıklamalar önceki cevaplarda çok önemlidir. Sadece senaryoyu sunmaya çalışıyorum. Umarım bu başkalarına yardımcı olabilir.

kullanıyorduk:

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

ve komut dosyasındaki onchange olaylarında diğer işlevleri çağırmak ancak yazı yazmak, IE içindeki HTML'yi tamamen geçersiz kılar; burada, kromda farklı davranışlar vardır.

olarak değiştirdik:

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

Böylece sorunu gideren komut dosyasını korudu.

0
pavan kumar

bir diyaloğu açarken DHTMLX’te bu hatayı aldım & ana kimliği 

        $(document).ready(function () {

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

});

Diyalog açarken doğru akım/ana pencere kimliği gönderdiğinizden emin olun

0
panky sharma