ما الذي يسبب الخطأ "لا يمكن تنفيذ التعليمات البرمجية من برنامج نصي محرر"

StackOverflow https://stackoverflow.com/questions/83132

  •  01-07-2019
  •  | 
  •  

سؤال

اعتقدت أنني وجدت الحل منذ فترة (انظر ملفي مدونة):

إذا ظهرت لك رسالة خطأ JavaScript (أو ينبغي أن تكون JScript) "لا يمكن تنفيذ تعليمات برمجية من برنامج نصي مُحرر" - فحاول نقل أي علامات وصفية في الرأس بحيث تكون قبل علامات البرنامج النصي.

...ولكن استنادًا إلى أحد أحدث تعليقات المدونة، قد لا يعمل الإصلاح الذي اقترحته مع الجميع.اعتقدت أن هذا سيكون أمرًا جيدًا للانفتاح على مجتمع StackOverflow....

ما الذي يسبب الخطأ "لا يمكن تنفيذ التعليمات البرمجية من برنامج نصي محرر" وما هي الحلول/الحلول البديلة؟

هل كانت مفيدة؟

المحلول

يبدو أنك واجهت خطأ/مشكلة في طريقة التعامل مع بعض العلامات أو أن لديك إشارات إلى الكائنات التي تم إصدارها والتي تحاول تنفيذ الأساليب عليها.

أولاً سأقوم بتحريك أي شيء <meta> العلامات قبل أي <script> العلامات كما هو مقترح هنا والعديد من الأماكن الأخرى.

ثم تحقق لمعرفة ما إذا كانت لديك مشكلات تتعلق بالصفحة/الأمان تمت مناقشتها هنا.

نصائح أخرى

تحصل على هذا الخطأ عند استدعاء دالة تم إنشاؤها في نافذة أو إطار لم يعد موجودًا.

إذا كنت لا تعرف مقدمًا ما إذا كانت النافذة لا تزال موجودة، فيمكنك إجراء محاولة/التقاط لاكتشافها:

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

يحدث الخطأ عند التخلص من نافذة البرنامج النصي "الأصل" (على سبيل المثال:مغلق) ولكن يتم استدعاء إشارة إلى البرنامج النصي الذي لا يزال محتجزًا (كما هو الحال في نافذة أخرى). على الرغم من أن "الكائن" لا يزال حيًا، إلا أن السياق الذي يريد التنفيذ فيه ليس كذلك.

إنها قذرة إلى حد ما، ولكنها تعمل مع أداة الشريط الجانبي لنظام التشغيل Windows:

وهذه هي الفكرة العامة:تقوم النافذة "الرئيسية" بإعداد وظيفة ستقوم بتقييم بعض التعليمات البرمجية، نعم، إنها قبيحة إلى هذا الحد.ثم يمكن لـ "الطفل" استدعاء "وظيفة الإنشاء" هذه (التي تكون / منضمة إلى نطاق النافذة الرئيسية /) واستعادة وظيفة مرتبطة أيضًا بالنافذة "الرئيسية".العيب الواضح هو، بطبيعة الحال، أن الوظيفة التي يتم "ارتدادها" لا يمكنها الإغلاق على النطاق الذي يبدو أنها محددة فيه ...على أية حال، يكفي هراء:

يعد هذا رمزًا زائفًا جزئيًا، لكنني أستخدم متغيرًا منه على Windows Sidebar Gadget (ما زلت أقول هذا لأن Sidebar Gadgets تعمل في "المنطقة غير المقيدة 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.

إذا كنت تحاول الوصول إلى كائن JS، فإن أسهل طريقة هي إنشاء نسخة:

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

نأمل أن يساعد.

يمكن أن يحدث هذا الخطأ في MSIE عندما تحاول نافذة فرعية الاتصال بنافذة رئيسية لم تعد مفتوحة.

(ليس بالضبط نص رسالة الخطأ الأكثر فائدة في العالم.)

إليك حالة محددة جدًا رأيت فيها هذا السلوك.إنه قابل للتكرار بالنسبة لي في IE6 وIE7.

من داخل إطار iframe:

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

بعد ذلك، بعد إعادة تحميل iframe بمحتوى جديد، في النافذة التي تحتوي على iframe:

window.mySpecialHandler();

فشل هذا الاستدعاء بسبب "لا يمكن تنفيذ التعليمات البرمجية من برنامج نصي محرر" لأنه تم تعريف mySpecialHandler في سياق (DOM الأصلي الخاص بـ iframe) والذي لم يعد يخرج.(أدى إعادة تحميل إطار iframe إلى تدمير هذا السياق.)

ومع ذلك، يمكنك تعيين قيم "قابلة للتسلسل" بأمان (الأوليات، الرسوم البيانية للكائنات التي لا تشير إلى الوظائف مباشرة) في النافذة الرئيسية.إذا كنت تحتاج حقًا إلى نافذة منفصلة (في حالتي، إطار iframe) لتحديد بعض الأعمال إلى نافذة بعيدة، فيمكنك تمرير العمل كسلسلة و"تقييمه" في جهاز الاستقبال.كن حذرًا مع هذا، فهو عمومًا لا يؤدي إلى تنفيذ نظيف أو آمن.

بداية من IE9 بدأنا نتلقى هذا الخطأ عند استدعاء .getTime() على كائن تاريخ مخزن في مصفوفة داخل كائن آخر.كان الحل هو التأكد من أنه تاريخ قبل استدعاء طرق التاريخ:

يفشل: rowTime = wl.rowData[a][12].getTime()

يمر: rowTime = new Date(wl.rowData[a][12]).getTime()

لقد واجهت هذه المشكلة عندما قمت داخل إطار فرعي بإضافة نوع مرجعي إلى نافذة المستوى الأعلى وحاولت الوصول إليه بعد إعادة تحميل النافذة الفرعية

أي.

// 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());

هذه ليست إجابة حقًا، ولكنها مثال على مكان حدوث ذلك بالتحديد.

لدينا الإطار A والإطار B (لم تكن هذه فكرتي، لكن يجب أن أتعايش معها).الإطار A لا يتغير أبدًا، والإطار B يتغير باستمرار.لا يمكننا تطبيق تغييرات التعليمات البرمجية مباشرة على الإطار A، لذا (وفقًا لتعليمات البائع) يمكننا فقط تشغيل JavaScript في الإطار B - الإطار الدقيق الذي يستمر في التغيير.

لدينا جزء من JavaScript يحتاج إلى التشغيل كل 5 ثوانٍ، لذلك يقوم JavaScript الموجود في الإطار B بإنشاء علامة برنامج نصي جديدة وإدراجها في قسم الرأس بالإطار B.يوجد setInterval في هذه البرامج النصية الجديدة (التي تم إدخالها)، بالإضافة إلى الوظيفة المطلوب استدعاؤها.على الرغم من أن JavaScript المُدخل يتم تحميله تقنيًا بواسطة الإطار A (نظرًا لأنه يحتوي الآن على علامة البرنامج النصي)، فبمجرد تغيير الإطار B، لن يكون من الممكن الوصول إلى الوظيفة من خلال setInterval.

لقد حصلت على هذا الخطأ في IE9 داخل صفحة تفتح iFrame في النهاية.طالما أن iFrame لم يكن مفتوحًا، فيمكنني استخدام localStorage.بمجرد فتح iFrame وإغلاقه، لم أتمكن من استخدام localStorage بعد الآن بسبب هذا الخطأ.لإصلاح ذلك، كان علي إضافة هذا الرمز إلى Javascript الموجود داخل iFrame وأيضًا استخدام localStorage.

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

حصلت على هذا الخطأ في DHTMLX أثناء فتح مربع حوار ولم يتم العثور على معرف الوالدين أو معرف النافذة الحالية

        $(document).ready(function () {

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

});

فقط تأكد من أنك ترسل معرف النافذة الحالي/الأصل الصحيح أثناء فتح الحوار

عند تحديث iframe's 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 آخر.

التفسيرات وثيقة الصلة جدًا بالإجابات السابقة.مجرد محاولة لتقديم السيناريو الخاص بي.نأمل أن يساعد هذا الآخرين.

كنا نستخدم:

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

, ، واستدعاء الوظائف الأخرى في البرنامج النصي onchange الأحداث ولكن writeln يتجاوز HTML تمامًا في IE حيث يكون له سلوك مختلف في chrome.

قمنا بتغييره إلى:

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

وهكذا تم الاحتفاظ بالنص الذي أصلح المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top