簡體   English   中英

為什么不是我的<script> tag work from php file? (jQuery involved here too)

[英]Why doesn't my <script> tag work from php file? (jQuery involved here too)

這是我想要完成的。 我有一個使用jQuery對PHP文件進行AJAX調用的表單。 PHP文件與數據庫交互,然后創建頁面內容以作為AJAX響應返回; 即,此頁面內容將寫入$.ajax調用的成功函數中的新窗口。 作為PHP文件返回的頁面內容的一部分,我有一個簡單的HTML腳本標記,其中包含一個JavaScript文件。 特別:

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

這不是在PHP中回應(雖然我已經嘗試過),它只是html。 pageControl.js與生成內容的php文件位於同一目錄中。

無論我嘗試什么,我似乎都無法獲得包含的pageControl.js文件,或者在為響應AJAX調用成功而創建的新窗口中工作。 我最終得到像“預期的對象”或未定義的變量之類的錯誤,這讓我相信文件沒有包含在內。 如果我將JavaScript直接復制到PHP文件中,而不是將腳本標記與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 

此代碼對PHP文件( process_report_request.php )執行AJAX調用,該文件為新窗口創建頁面內容。 此內容取自數據庫和HTML。 在PHP文件中,我想在新窗口中使用javascript包含另一個javascript文件。 我想把它包括如下

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

更改路徑文件夾名稱以保護無辜:)

pageControl.js文件實際上與jQuery代碼文件和php文件位於同一文件夾中,但我正在嘗試完整路徑只是為了安全。 我也可以使用瀏覽器中的URL訪問js文件,我可以使用腳本src標記將其成功包含在靜態html測試頁面中。

在javascript文件包含在php文件中之后,我調用了它的一個函數,如下所示(來自php的echo):

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

因此,一旦php文件將所有頁面內容發送回AJAX調用,則打開新窗口,並通過上面的jQuery代碼將返回的內容寫入其中。

當我運行頁面時, writePageControls行是我收到錯誤“Error:Object expected”的地方。 但是,由於JavaScript在靜態HTML頁面中工作正常,並且在PHP文件中包含“內聯”時,它使我認為這是某種路徑問題。

同樣,無論我嘗試什么,我對pageControls.js文件中的函數的調用都不起作用。 如果我將pageControl.js文件的內容放在腳本標記之間的php文件中並且不做任何其他更改,它會按預期工作。

根據你們有些人已經說過的話,我想知道新打開的窗口的路徑分辨率是否不正確。 但我不明白為什么因為我正在使用完整的路徑。 另外,為了使問題更加混亂,我的鏈接樣式表在PHP文件中運行得很好。

抱歉這是多長時間,但如果有人有時間進一步研究這個問題,我將非常感激。 我很難過。 當涉及到很多這方面的時候我是新手 ,所以如果有更好的方法來做到這一點並避免這個問題,我全都是耳朵(或者我認為是眼睛......)

它可能不是你認為它想要抓住你的javascript文件。

嘗試像這樣的服務器相對格式:

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

如果仍然無效,請確認您可以將腳本文件的URL鍵入瀏覽器並下載。

確保您在HTML頁面的<head><body>具有該值。 另外,我會仔細檢查.js文件的路徑。 你可以通過在你的網址的根目錄粘貼“pageControl.js”來做到這一點。

我也遇到過類似問題的問題,這真是令人頭疼。 以下方法可能並不優雅,但它對我有用。

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

    }

祝好運!

要尋找的東西:

  • 使用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>之后,以便首先加載。

這是我能想到的。

您可以通過創建元素動態加載腳本,然后將其附加到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/changeset/view/9070#201379

這是一些javascript,可確保在嘗試訪問之前正確加載腳本。 你可以使用它作為延遲加載(僅在需要時加載javascript文件),或者,當我解釋你的問題時,根據ajax調用的結果加載腳本。

可能發生的是,您通過ajax回調回顯字符串,而不是插入元素。 外部腳本需要第二次GET調用才能加載其內容,這種情況不會發生 - 只有第一次調用才會發生。 因此,當第一個調用包含內聯代碼時,DOM不必另外發出GET請求來獲取內容。 如果DOM沒有看到腳本,DOM將不會執行它,這意味着它只是一些隨機標記。

找到一個非常快捷的方法。 在Chrome(或安裝了Firebug插件的Firefox)中,檢查控制台>腳本下拉列表以查看所有已加載的腳本。 如果未列出,則表示未加載,並且您在標記中看到的腳本標記是惰性的。

因為它可能只是PHP所關心的字符串,所以您可以將其創建為PHP DOM對象並正確插入(盡管這可能很費力)。 相反,也許可以將它放在頁面的最末端,就在關閉正文標簽之前。 (無論如何,這是js的首選位置 - 在頁面上的所有其他元素都已加載並且可供DOM使用之后,這是最后一個位置。)

HTH :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM