لا يمكن تحميل البرنامج النصي كنص عادي باستخدام AJAX

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

سؤال

لدي ملف جافا سكريبت في الخادم ولا أستطيع تعديله.

فيما يلي عينة من البرنامج النصي الذي يجب تنزيله:

var tags = '';
tags += '<a href="#somelink"><img src="someimage.gif"/></a>;
document.write(tags);

لقد بدأت في تنزيل البرنامج النصي عبر AJAX وتنفيذه، لكنني واجهت مشكلة "لا يمكن تنفيذ المستند.write في مكالمة غير متزامنة".

لذلك أردت تنزيل البرنامج النصي كنص عادي وأخذ ما أحتاجه من الرد ووضعه في المكان الذي يجب أن ينتقل إليه في صفحة html الخاصة بي دون تعديل البرنامج النصي الأصلي.

$.ajax({
    type: "GET",
    url: "http://myurlexample.com",
    dataType: "text",
}).success(function(msg){
    console && console.log("The script was downloaded as text: "+msg);
}).error(function(object,status,errortxt){
    console && console.log("The script wasn't downloaded as text. The error:"+ errortxt);
});

لكن AJAX يلقي خطأ عندما أقوم بطلب التنزيل باستخدام dataType = "text".هل هناك أي طريقة للتغلب على هذا وتنزيله فعليًا كنص؟

ملاحظة:البرنامج النصي مخصص لتطبيق متميز لنظام التشغيل Firefox، لذا لا يمكنني وضع البرنامج النصي مباشرة في صفحة html لأن CSP للأمان لا يسمح بذلك (https://developer.mozilla.org/en-US/Apps/CSP).

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

المحلول

منذ أن يبدو أنك قادر على ذلك يجري نجح البرنامج النصي بطريقة ما، إليك فكرة رهيبة قد تنجح:الكتابة فوق document.write.

قبل تشغيل البرنامج النصي، قم بما يلي:

document.write = function(msg) {
    handleTagStringInApp(msg);
    delete document.write; // revert to original document.write when done
};
// now load execute the script...

أين handleTagStringInApp هي وظيفة تكتبها وتقوم بمعالجة سلسلة العلامات بطريقة ما.هذا هو في الأساس JSONP، ولكن لا يمكنك ضبط اسم رد الاتصال ليكون شيئًا غير مزعج أو مفيدًا ويجب عليك بدلاً من ذلك استخدام اسم رد الاتصال document.write.

لاحظ أن هذا سيكون حقا سيء إذا كان هناك أي شيء آخر في تطبيقك يحتاج بالفعل إلى استخدامه document.write.(قد تتمكن من التغلب على هذا الأمر في التعليمات البرمجية الخاصة بك عن طريق الاحتفاظ بالإشارة إلى الملف الحقيقي document.write, ، على سبيل المثال، باستخدام var realDocWrite = document.write; عند تحميل الصفحة والاتصال بها realDocWrite.call(document, "whatever").)

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