为什么我的 <script> tag work from php file?(jQuery的参与也在这里)
-
10-07-2019 - |
题
这里就是我试图完成的任务。我有一个形式,使用jQuery使阿贾克斯呼吁PHP文件。PHP文件的交互数据库,然后创建的网页内容返回的AJAX响应;即这一页面内容写入一个新的窗口成功的功能 $.ajax
呼叫。作为一部分的页面内容返回的PHP文件,我有一个简单HTML脚本标记,有一个JavaScript文件。具体而言:
<script type="text/javascript" src="pageControl.js"></script>
这不是回荡在php(虽然我已经试过了,),只html。的pageControl.js 是在同一个目录,作为我php文件,该文件产生的内容。
不管我怎么尝试,我似乎无法得到的 pageControl.js
文件包括或工作中产生的新的窗口,创造成功响应在阿贾克斯的电话。我端上的错误,如"对象"或变化不定,导致我认为该文件是不能包括在内。如果我复制JavaScript直接进入php文件,而不是使用脚本标记与src,我可以得到它的工作。
是不是有什么我在这里失踪有关范围的决议之间调用的文件,php,并延阿贾克斯?我想要包括javascript文件这样的未来,并希望了解我在做什么错误的。
你好再次:
我曾在这个问题,仍然没有运气。我要尝试,并澄清我在做什么,也许,这将带来一些东西进入脑海。我是包括有些代码的要求,帮助澄清事情一点。
这是序列:
- 用户选择的某些选项,并提交的点击按钮在的形式。
本形式按一下按钮是处理由。,看起来是这样的:
$(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 文件实际上是在同一文件夹中的文件。和php文件,但我在尝试全面的道路是安全的。 我还能够访问js文件使用的网址浏览器和我可以成功地包括它在一个html静态测试页使用脚本来源的标记。
后javascript文件包含在php文件,我们呼吁它的一个职能如下(从php echo):
echo '<script type="text/javascript" language="javascript">writePageControls();</script>';
因此,一旦php文件发送所有的页面内容回到阿贾克斯打电话,然后新的窗口打开,并返回的内容是书面来文。上面。
的 writePageControls
线是我的错误"的错误:目预期"当我运行的网页。 然而,由于JavaScript工作现在这两个HTML静态网页和当包括"内联"在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"在你的网址。
寻找的东西:
- 使用萤火虫(净tab)检查,如果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();
对我来说这听起来像你期待一个卸载脚本到工作。
尝试把一个看看这里: http://ensure.codeplex.com/SourceControl/changeset/view/9070#201379
这是一位javascript,确保脚本是装载之前,访问是尝试。你可以使用这个或者懒惰的负载量(装载javascript文件只在需要时),或者,正如我解释你的问题,载入一个脚本基于结果的阿贾克斯的电话。
怎么可能发生的情况是,你在回应一个串通过的ajax回调,不插入一个元素。外脚本需要第二获得通话载的内容,这是不会发生-只有第一个电话发生的。因此,当第一呼吁包括联的代码,该DOM没有作出额外获得请求,以获取的内容。如果DOM没有看到脚本,DOM不执行它,这意味着它只是一些随机的标签。
有一个非常快速的方式找出来。在铬(或火狐与萤火的插件安装),检查控制台>脚本拉看到所有的装脚本。如果它没有列出,这是没有装载和脚本标记你看到的标记是否是惰性的。
由于这可能只是一串尽PHP关心,你能创造它作为PHP DOM目,并插入正常(尽管这可能是艰苦).相反,也许 把它结束时的一页,刚刚结束前体标签。 (这是首选的位置js无论如何死去之后,所有其他元素在网页上载有并提供给DOM。)
禾田:)