سؤال

هنا هو ما أحاول تحقيقه.لدي نموذج يستخدم مسج لجعل اياكس الاتصال إلى ملف PHP.ملف PHP يتفاعل مع قاعدة البيانات ثم يخلق محتوى الصفحة إلى عودة باسم اياكس الاستجابة ؛ أيهذه الصفحة محتوى كتب إلى نافذة جديدة في نجاح المهمة $.ajax المكالمة.كجزء من محتوى الصفحة يتم إرجاعها بواسطة ملف PHP لدي واضحة HTML العلامة النصي الذي يحتوي ملف جافا سكريبت.على وجه التحديد:

<script type="text/javascript" src="pageControl.js"></script>

هذا ليس ردد في php (على الرغم من أنني حاولت أن) ، هو مجرد html.على pageControl.js هو في نفس الدليل كما كان ملف php الذي يولد المحتوى.

مهما حاولت, أنا لا يمكن أن يبدو للحصول على pageControl.js وشملت ملف أو العامل في الناتج نافذة جديدة أنشئت استجابة النجاح في اياكس الاتصال.أنا في نهاية المطاف مع أخطاء مثل "المتوقع كائن" أو متغير غير معرف ، مما يؤدي بي إلى الاعتقاد الملف هو عدم الحصول على المدرجة.إذا كنت نسخ جافا سكريبت مباشرة إلى PHPfile بدلا من استخدام العلامة النصي مع src يمكنني الحصول على عمل.

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


مرحبا مرة أخرى:

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

هنا هو التسلسل:

  1. المستخدم يختار بعض الخيارات ، نقرات زر على النموذج.
  2. شكل انقر فوق الزر يتم التعامل معها من قبل رمز مسج التي تبدو مثل هذا:

    $(document).ready(function() {
      $("#runReport").click(function() {
    
        var report = $("#report").val();
        var program = $("#program").val();
        var session = $("#session").val();
        var students = $("#students").val();
    
        var dataString = 'report=' +report+ 
                         '&program=' +program+
                         '&session=' +session+
                         '&students=' +students;
    
        $.ajax({
            type: "POST",
            url: "process_report_request.php",
            cache: false,
            data: dataString,
            success: function(pageContent) {
                if (pageContent) {
                    $("#result_msg").addClass("successMsg")
                        .text("Report created.");
    
                    var windowFeatures = "width=800,menubar=yes,scrollbars=1,resizable=1,status=yes";
    
                    // open a new report window
                    var reportWindow = window.open("", "newReportWindow", windowFeatures);
    
                    // add the report data itself returned from the AJAX call
                    reportWindow.document.write(pageContent);
                    reportWindow.document.close();
                }
                else {
                    $("#result_msg").addClass("failedMsg")
                        .text("Report creation failed.");
                }
            }
        }); // end ajax call
        // return false from click function to prevent normal submit handling
        return false;
      }); // end click call    
    }); // end ready call
    

هذا كود ينفذ اياكس الاتصال إلى ملف PHP (process_report_request.php) أن يخلق صفحة محتوى نافذة جديدة.هذا المحتوى مأخوذ من قاعدة البيانات و HTML.في ملف PHP أريد أن تدرج آخر ملف جافا سكريبت في الرأس مع جافا سكريبت تستخدم في نافذة جديدة.أنا أحاول أن تشمل على النحو التالي

<script src="/folder1/folder2/folder3/pageControl.js" type="text/javascript"></script>

تغيير مسار مجلد أسماء لحماية الأبرياء :)

على pageControl.js بالفعل الملف في نفس المجلد مثل مسج رمز الملف و ملف php, ولكن أنا أحاول المسار الكامل فقط لتكون آمنة. أنا أيضا قادرة على الوصول إلى ملف js باستخدام عنوان URL في المتصفح ، وأنا بنجاح يمكن إدراجه في html ثابتة صفحة الاختبار باستخدام script src الوسم.

بعد ملف جافا سكريبت يتم تضمينها في ملف php لدي مكالمة إلى إحدى وظائفها على النحو التالي (صدى من php):

 echo '<script type="text/javascript" language="javascript">writePageControls();</script>';

لذلك بمجرد ملف php يرسل كل محتويات الصفحة إلى اياكس الاتصال, ثم من النافذة الجديدة يتم فتح و عاد محتوى كتب بواسطة رمز مسج أعلاه.

على writePageControls الخط هو أين أحصل على خطأ "خطأ:المتوقع كائن" عند تشغيل الصفحة. ومع ذلك ، منذ جافا سكريبت يعمل بشكل جيد في كلتا ساكنة صفحة HTML وعندما يتم تضمينها "مضمن" في ملف PHP هو يقود لي أن أعتقد أن هذا هو المسار المسألة من نوع ما.

مرة أخرى, مهما حاولت ، يدعو إلى وظائف في pageControls.js الملف لا يعمل. إذا وضعت محتويات pageControl.js الملف في ملف php بين علامات البرنامج النصي تغيير أي شيء آخر ، فإنه يعمل كما هو متوقع.

استنادا إلى ما سبق أن قلت, وأنا أتساءل عما إذا كان المسار القرار حديثا فتحت نافذة غير صحيح.ولكن أنا لا أفهم لماذا لأن أنا باستخدام المسار الكامل.أيضا الخلط بين الأمور أكثر ، ربط الأنماط يعمل على ما يرام من ملف PHP.

أعتذر عن طول المدة ، ولكن إذا كان أي شخص لديه الوقت أن ننظر إلى أبعد من ذلك ، وأود أن نقدر ذلك.أنا الحيرة. أنا مبتدئ عندما يتعلق الأمر الكثير من هذا, لذا إذا كان هناك فقط طريقة أفضل للقيام بذلك و تجنب هذه المشكلة ، أنا كل آذان (أو عيون أعتقد...)

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

المحلول

لقد كان أيضا مشاكل مع مشكلة مشابهة لهذا ، كان هذا هو صداع حقيقي.النهج التالي قد لا تكون أنيقة ، ولكنها عملت بالنسبة لي.

  1. تأكد من أن الملف الخاص بي فقط النواتج ما تريد في حياتك الجسم
  2. إضافة مسج إلى النافذة رئيس حيوي
  3. إضافة أي ملفات البرامج النصية الخارجية إلى النافذة رئيس حيوي
  4. استخدام مسج html على نافذة الوثيقة إلى دعوة (html) مع تحميل المحتوى على الجسم ، بحيث النصوص وتقييمها.

على سبيل المثال ، في اياكس النجاح:

success: function(pageContent) {
        var windowFeatures = "width=800,menubar=yes,scrollbars=1,resizable=1,status=yes";
        var reportWindow = window.open("", "newReportWindow", windowFeatures);

        // boilerplate
        var boilerplate = "<html><head></head><body></body></html>";

        reportWindow.document.write(boilerplate);

        var head = reportWindow.document.getElementsByTagName("head")[0];

        var jquery = reportWindow.document.createElement("script");
        jquery.type = "text/javascript";
        jquery.src = "http://code.jquery.com/jquery-1.7.min.js";
        head.appendChild(jquery);

        var js = reportWindow.document.createElement("script");
        js.type = "text/javascript";
        js.src = "/folder1/folder2/folder3/pageControl.js";
        js.onload= function() {
            reportWindow.$("body").html(pageContent);
        };
        head.appendChild(js);


        reportWindow.document.close();

    }

حظا سعيدا!

نصائح أخرى

ربما لا تبحث أين تعتقد أنه يتطلع إلى انتزاع ملف جافا سكريبت الخاصة بك.

حاول الخادم النسبية تنسيق مثل هذا:

<script src="/some/path/to/pageControl.js"></script>

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

تأكد من أن لديك أنه في غضون إما <head> أو <body> من صفحة HTML.أيضا أود التحقق من مسار .ملف js.يمكنك أن تفعل ذلك عن طريق لصق "pageControl.js" في جذر عنوان الويب الخاص بك.

للبحث عن الأشياء:

  • استخدام الحرائق (NET) للتحقق مما إذا كان ملف شبيبة يتم تحميلها مع الوضع 200.كما تحقق في وحدة التبويب أي أخطاء جافا سكريبت.
  • هل تستخدم HTML5 حاليا.إذا كنت تفعل, ربما يخدم النسخة المخبأة التي لا تشمل <script> الوسم.
  • عرض مصدر الصفحة و تأكد من أنه يتضمن script الوسم.
  • تغيير مصدر تنسب إلى المسار المطلق: <script src="http://www.example.com/js/pageControl.js" type="text/javascript"></script>
  • زيارة http://www.example.com/js/pageControl.js وتأكد من أنه يظهر بشكل صحيح.
  • في محاولة لوضع <script> بعد <head> بحيث يقوم بتحميل الأولى.

هذا هو كل ما كنت أفكر.

يمكنك بشكل حيوي تحميل البرنامج النصي بإنشاء عنصر ومن ثم إلحاقها إلى الرأس أو عنصر آخر:

reportWindow.document.write(pageContent);                      
var script = document.createElement('script');
script.src = 'pageControl.js';
script.type = 'text/javascript';
reportWindow.document.getElementsByTagName('head')[0].appendChild(script);
reportWindow.document.close();

هل حاولت استخدام مسج $("#target_div").load(...) هذا أيضا ينفذ شبيبة داخل الإخراج...

اقرأ هذا المستند إلى معرفة كيفية استخدامها :

http://api.jquery.com/load/

بالنسبة لي يبدو أنك تنتظر تفريغ نصي إلى العمل.

محاولة أخذ نظرة هنا: http://ensure.codeplex.com/SourceControl/changeset/view/9070#201379

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

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

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

منذ انها على الارجح مجرد سلسلة بقدر PHP العطاء ، يمكنك إنشاء أنها PHP دوم كائن وأدخله بشكل صحيح (على الرغم من أن هذا يمكن أن تكون شاقة).بدلا من ذلك, ربما في نهاية الصفحة, فقط قبل إغلاق العلامات الجسم. (هذا هو موقف المفضل js على أي حال الميت الماضي ، بعد كل العناصر الأخرى على الصفحة تحميل و تتوفر دوم.)

HTH :)

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