Почему мой тег <script>не работает из файла php? (JQuery также участвует здесь) - PullRequest
7 голосов
/ 30 ноября 2009

Вот что я пытаюсь сделать. У меня есть форма, которая использует JQuery для вызова AJAX в файл PHP. Файл PHP взаимодействует с базой данных, а затем создает содержимое страницы для возврата в качестве ответа AJAX; то есть содержимое этой страницы записывается в новое окно в функции успеха для вызова $.ajax. Как часть содержимого страницы, возвращаемого файлом PHP, у меня есть простой тег HTML-сценария с файлом JavaScript. В частности:

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

Это не отражено в php (хотя я пробовал это), это просто HTML. PageControl.js находится в том же каталоге, что и мой php-файл, который генерирует содержимое.

Независимо от того, что я пытаюсь, я не могу включить файл pageControl.js в рабочее окно, созданное в ответ на успех вызова AJAX, или работать в нем. Я получаю ошибки типа «Ожидается объект» или переменная не определена, что заставляет меня поверить, что файл не включается. Если я скопирую JavaScript прямо в PHP-файл, вместо использования тега script с src, я смогу заставить его работать.

Есть ли что-то, чего мне здесь не хватает в разрешении области между вызывающим файлом, php и jQuery AJAX? Я собираюсь включить файлы javascript таким образом в будущем и хотел бы понять, что я делаю неправильно.


Привет еще раз:

Я работал над этим вопросом, но до сих пор не повезло. Я постараюсь уточнить, что я делаю, и, возможно, это что-то напомнит. Я включил некоторый код в соответствии с просьбой, чтобы немного прояснить ситуацию.

Вот последовательность:

  1. Пользователь выбирает некоторые параметры и нажимает кнопку отправки в форме.
  2. Нажатие кнопки формы обрабатывается кодом jQuery, который выглядит следующим образом:

    $(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
    

Этот код выполняет AJAX-вызов файла PHP (process_report_request.php), который создает содержимое страницы для нового окна. Этот контент взят из базы данных и HTML. В файле PHP я хочу включить другой файл javascript в заголовок с использованием javascript в новом окне. Я пытаюсь включить его следующим образом

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

Изменены имена папок путей для защиты невинных :)

Файл pageControl.js фактически находится в той же папке, что и файл кода jQuery и файл php, но я пытаюсь использовать полный путь, чтобы быть в безопасности. Я также могу получить доступ к файлу js, используя URL-адрес в браузере, и могу успешно включить его в статическую html-тестовую страницу с помощью тега src script.

После включения файла javascript в файл php у меня есть вызов к одной из его функций следующим образом (эхо из php):

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

Итак, как только php-файл отправляет все содержимое страницы обратно на вызов AJAX, открывается новое окно, и возвращенное содержимое записывается в него с помощью приведенного выше кода jQuery.

В строке writePageControls я получаю сообщение об ошибке «Ошибка: ожидается объект» при запуске страницы. Однако, поскольку JavaScript отлично работает как на статической HTML-странице, так и при ее включении »inline "в файле PHP я думаю, что это какая-то проблема с путями.

Опять же, что бы я ни пытался, мои вызовы функций в файле pageControls.js не работают. Если я поместил содержимое файла pageControl.js в файл php между тегами script и ничего не изменил, он работает как положено.

Исходя из того, что некоторые из вас уже сказали, мне интересно, если разрешение пути к недавно открытому окну не является правильным. Но я не понимаю почему, потому что я использую полный путь. Кроме того, чтобы еще больше запутать, моя связанная таблица стилей прекрасно работает из файла PHP.

Извините за то, как долго это будет, но если у кого-то будет время взглянуть на это дальше, я был бы очень признателен. Я в тупике. Я новичок, когда дело доходит до всего этого , поэтому, если есть просто лучший способ сделать это и избежать этой проблемы, я весь слух (или глаза, я полагаю ...)

Ответы [ 8 ]

3 голосов
/ 30 ноября 2009

Вероятно, он не выглядит там, где вы думаете, чтобы захватить ваш файл JavaScript.

Попробуйте формат сервера относительно этого:

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

Если это все еще не работает, убедитесь, что вы можете ввести URL-адрес файла скрипта в браузер и загрузить его.

2 голосов
/ 08 ноября 2011

У меня также были проблемы с похожей проблемой, и это было настоящей головной болью. Следующий подход может быть не элегантным, но он сработал для меня.

  1. Убедитесь, что ваш php файл просто выводит то, что вы хотите в своем тело
  2. Добавить jquery к заголовку окна динамически
  3. Добавить любые внешние файлы сценариев в заголовок окна динамически
  4. используйте jQuery html в документе окна для вызова html () с загруженным контентом в теле, чтобы скрипты оценивались.

Например, в вашем успехе ajax:

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

    }

Удачи!

2 голосов
/ 30 ноября 2009

Убедитесь, что оно есть в пределах <head> или <body> HTML-страницы. Кроме того, я бы дважды проверил путь к файлу .js. Вы можете сделать это, вставив "pageControl.js" в корень вашего веб-адреса.

1 голос
/ 12 ноября 2011

Вы пробовали использовать jquery $("#target_div").load(...) Это также выполняет JS внутри вывода ...

Прочтите этот документ, чтобы узнать, как его использовать:

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

1 голос
/ 10 ноября 2011

Вы можете динамически загрузить скрипт, создав элемент и добавив его к заголовку или другому элементу:

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();
1 голос
/ 08 ноября 2011

На что обратить внимание:

  • Используйте Firebug (вкладка NET), чтобы проверить, загружен ли файл js со статусом 200. Также проверьте вкладку «Консоль» на наличие ошибок JavaScript.
  • Используете ли вы 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>, чтобы он загружался первым.

Это все, что я мог придумать.

0 голосов
/ 12 ноября 2011

Что, вероятно, происходит, вы повторяете строку через обратный вызов ajax, а не вставляете элемент. Внешние сценарии требуют второго вызова GET для загрузки их содержимого, чего не происходит - только первый вызов произошел. Таким образом, когда первый вызов включает встроенный код, DOM не должен делать дополнительный запрос GET для извлечения содержимого. Если DOM не видит сценарий, DOM не выполнит его, что означает, что это просто какой-то случайный тег.

Есть очень быстрый способ выяснить это. В Chrome (или Firefox с установленным плагином Firebug) проверьте выпадающий список console> scripts, чтобы увидеть все загруженные сценарии. Если его нет в списке, он не загружается, а тег сценария, который вы видите в разметке, в ином случае инертен.

Поскольку PHP, вероятно, всего лишь строка, вы можете создать ее как объект PHP DOM и вставить ее правильно (хотя это может быть трудоемким). Вместо этого, возможно поместите его в самый конец страницы, непосредственно перед закрывающими тегами тела. (В любом случае это предпочтительная позиция для js - dead last, после того, как все другие элементы на странице загружены доступны для DOM.)

HTH:)

0 голосов
/ 11 ноября 2011

Для меня это звучит так, как будто вы ожидаете, что выгруженный скрипт будет работать.

Попробуйте посмотреть здесь: http://ensure.codeplex.com/SourceControl/changeset/view/9070#201379

Это немного javascript, который обеспечивает правильную загрузку скрипта перед попыткой доступа. Вы можете использовать это либо как отложенную загрузку (загрузка файлов javascript только при необходимости), либо, как я понимаю вашу проблему, загрузку сценария на основе результата вызовов ajax.

...