Почему мой <script> tag work from php file?(Здесь тоже задействован jQuery)

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

Вопрос

Вот чего я пытаюсь добиться.У меня есть форма, которая использует 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 непосредственно в PHPfile, вместо того чтобы использовать тег script с src, я смогу заставить его работать.

Есть ли что-то, чего мне здесь не хватает в отношении разрешения области видимости между вызовом file, 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-файл в head с javascript, используемым в новом окне.Я пытаюсь включить это следующим образом

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

Изменены имена папок path, чтобы защитить невинных :)

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

<Ол>
  • Убедитесь, что ваш php файл просто выводит то, что вы хотите, в свой тело
  • Динамически добавлять jquery в заголовок окна
  • Добавить любые внешние файлы сценариев в заголовок окна динамически
  • используйте 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();
    
        }
    

    Удачи!

    Другие советы

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

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

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

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

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

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

    • Используйте 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> так, чтобы он загружался первым.

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

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

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

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

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

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

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

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

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

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

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

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

    HTH:)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top