我有一个PHP脚本(粘贴在下面)从URL列表中提取元数据,问题是它可能需要一段时间才能加载,用户永远不知道它何时完成(除非他们密切关注在他们的broswer标签中加载图标)
我已经在网上浏览了很长时间但找不到解决方案,我读过我可以使用Ajax,但我怎么能在这个脚本上使用它呢?
感谢您的帮助!
<script type="text/javascript">
function showContent(vThis)
{
// http://www.javascriptjunkie.com
// alert(vSibling.className + " " + vDef_Key);
vParent = vThis.parentNode;
vSibling = vParent.nextSibling;
while (vSibling.nodeType==3) { // Fix for Mozilla/FireFox Empty Space becomes a TextNode or Something
vSibling = vSibling.nextSibling;
};
if(vSibling.style.display == "none")
{
vThis.src="collapse.gif";
vThis.alt = "Hide Div";
vSibling.style.display = "block";
} else {
vSibling.style.display = "none";
vThis.src="expand.gif";
vThis.alt = "Show Div";
}
return;
}
</script>
<form method="POST" action=<?php echo "'".$_SERVER['PHP_SELF']."'";?> >
<textarea name="siteurl" rows="10" cols="50">
<?php //Check if the form has already been submitted and if this is the case, display the submitted content. If not, display 'http://'.
echo (isset($_POST['siteurl']))?htmlspecialchars($_POST['siteurl']):"http://";?>
</textarea><br>
<input type="submit" value="Submit">
</form>
</div>
<div id="nofloat"></div>
<div style="margin-top:5px;">
<h4><img src="expand.gif" alt="Show Div" border="0" style="margin-right:6px; margin- top:3px; margin-bottom:-3px; cursor:pointer;" onclick="showContent(this);" />Show me the script working!</h4>
<div style="margin-top:5px; display:none;">
<table class="metadata" id="metatable_1">
<?php
ini_set('display_errors', 0);
ini_set( 'default_charset', 'UTF-8' );
error_reporting(E_ALL);
//ini_set( "display_errors", 0);
function parseUrl($url){
//Trim whitespace of the url to ensure proper checking.
$url = trim($url);
//Check if a protocol is specified at the beginning of the url. If it's not, prepend 'http://'.
if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
$url = "http://" . $url;
}
//Check if '/' is present at the end of the url. If not, append '/'.
if (substr($url, -1)!=="/"){
$url .= "/";
}
//Return the processed url.
return $url;
}
//If the form was submitted
if(isset($_POST['siteurl'])){
//Put every new line as a new entry in the array
$urls = explode("\n",trim($_POST["siteurl"]));
//Iterate through urls
foreach ($urls as $url) {
//Parse the url to add 'http://' at the beginning or '/' at the end if not already there, to avoid errors with the get_meta_tags function
$url = parseUrl($url);
//Get the meta data for each url
$tags = get_meta_tags($url);
//Check to see if the description tag was present and adjust output accordingly
$tags = NULL;
$tags = get_meta_tags($url);
if($tags)
echo "<tr><td>$url</td><td>" .$tags['description']. "</td></tr>";
else
echo "<tr><td>$url</td><td>No Meta Description</td></tr>";
}
}
?>
</table>
</div>
<script type="text/javascript">
var exportTable1=new ExportHTMLTable('metatable_1');
</script>
<div>
<input type="button" onclick="exportTable1.exportToCSV()" value="Export to CSV"/>
<input type="button" onclick="exportTable1.exportToXML()" value="Export to XML"/>
</div>
</div>
答案 0 :(得分:5)
点子:
将php代码添加到不同的文件
显示加载图片
然后调用此函数
function Load()
{
var xmlhttp;
var url;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
//(optional)do something with response: xmlhttp.responseText
document.getElementById("area").innerHTML=xmlhttp.responseText;
document.getElementById("loadingimage").src = "afterloading.gif";
}
}
xmlhttp.open("GET","phpfile.php",true);
xmlhttp.send();
}
此函数会转到您的javascript位置,然后在文档完成加载后用jquery调用它或
<body onload="Load()">
并在身体里放置类似
的东西<img id="loadingimage" src="loading.gif"/>
<div id="area">...</div>
答案 1 :(得分:1)
提取完成工作的部分(<?php ini_set [...] ?>
),将其存储在单独的文件中(例如GetMetaData.php)并使其返回JSON或XML。
然后,您可以捕获提交事件,并使其以异步方式将用户输入的URL发布到GetMetaData脚本。当该调用返回时,您可以使用脚本返回的数据填充表。
答案 2 :(得分:0)
正如我在评论中提到的,这里基本上有两种选择。第一个依赖于javascript工作,第二个依赖于输出缓冲来给出关于正在发生的事情的“运行评论”,并且取决于脚本中是否有可以输出进度报告的敏感点。
AJAX方法只涉及获取繁重的代码并将其放在自己的PHP脚本中,该脚本可以通过AJAX进行调用。然后主页面只是一个加载屏幕和一个javascript,它调用通过AJAX完成工作的脚本。当AJAX脚本完成时,可以触发回调函数以将返回的结果格式化为HTML并将其显示在加载屏幕的位置。
另一种方法涉及在脚本的主循环中使用输出缓冲和刷新。
while ($task_not_complete)
{
do_some_more_work ();
echo ('<p>Something indicating how much progress has been made goes here</p>');
ob_flush ();
flush ();
}
这种方法不需要javascript,但它有自己的缺点。首先,根据在Web服务器或客户端与服务器之间可能存在的任何代理中设置缓冲的方式,它可能根本不起作用,并且在脚本完成之前根本不返回任何输出。其次,在服务器上的脚本完成并且浏览器收到结束</html>
标记之前,DOM树将无效。这意味着在执行的进程完成之前,页面使用的任何javascript都无法可靠地执行DOM操作。