您的代碼看起來像您試圖將Perl與HTML混合在一起,您將使用PHP。 這在Perl中不起作用。
我試着先修復你的Perl代碼。這將打印到您的文件句柄(我省略),但不會給你工作的JavaScript代碼。我沒有改變,因爲我不明白你想做什麼。稍後更多。
use strict;
use warnings;
# open of $indexfd filehandle goes here..
# print head of HTML page
print $indexfd <<HTML
<html>
<header>
<script type="text/javascript">
function hideit() {
var x1 = document.getElementsByTagName("ol").item(0);
var x = document.getElementsByTagName("ol");
for (var i = 0; i < x.length; i++)
x[i].style.display="none";
}
function showit() {
var x1 = document.getElementsByTagName("ol").item(0);
var x=document.getElementsByTagName("ol");
for (var i = 0; i < x.length; i++)
x[i].style.display="";
}
</script>
</header>
<body>
HTML
;
# If I see this correctly, %stats_data looks like this:
my %stats_data = (
'out1' => {
'key1' => 'val1',
'key2' => 'val2',
},
'out2' => {
'key1' => 'val1',
'key2' => 'val2',
},
);
my $out = 'out1'; # you need the $out from somewhere
# print buttons for each data thingy - you'll want to sort them probably
foreach my $key (sort keys %{$stats_data{$out}}) {
print $indexfd
qq~<input onclick="showit()" type="button" id="$key" value="showit"><br />~,
qq~<input onclick="hideit()" type="button" id="$key" value="hideit"><br/>~,
# Because $stats_data{$out} is a hash ref you need the -> operator here
qq~<ol id="$key"><li><b>$stats_data{$out}->{$key}</b></li></ol><br/>~;
}
print $indexfd qq~<p>more html...</p></body></html>~;
所以有幾件事值得一提。
print $indexfd ("<input onclick=\"showit()\" type=\"button\" id=\"<?perl echo $key; ?>\" value=\"showit\"><br><input onclick=\"hideit()\" type=\"button\" id=\"<?perl echo $key; ?>\" value=\"hideit\"><br><b><ol id=$key>$stats_data{$out}{$key}<ol id=$key> </b><br>");
在這相當長的代碼行,你用<?perl echo $key; ?>
它看起來像PHP和不工作。您也使用了<ol id=$key>
,因爲您使用雙引號"..."
。 Perl將「-delimited」字符串中的變量替換爲它們的值,不需要類似php的東西。爲了節省您在HTML代碼中轉義所有雙引號的努力,您可以使用qq
-Operator。更多相關信息請參見perlop。
我關於我的評論%stats_data
數據結構解釋。
有關打印大塊的HTML,我用HERE docs。
讓我們來談談你的JavaScript現在。
即使按鈕確實爲每個$key
創建,點擊其中一個,控制着所有的$stats_data{$out}{$key}
。
這是因爲您設計hideit()
和showit()
函數的方式。我並不是真正想要達到的目標。如果你看看我的%stats_data
,你會發現'out1'中有幾個鍵。這可以讓foreach循環爲每個鍵打印一組按鈕。這兩個按鈕都與它們的ID具有相同的密鑰,就像ol一樣。這是不正確的。一個id-attribute has to be unique。
此外,您的html中還存在一些基本問題,我可以自由修復。如果您打開一個<ol id="foo">
容器,則需要將其關閉,如</ol>
。由於<ol>
是塊級元素,因此不應將內聯元素<b>
置於其外部,而應放在元素的<li>
元素(我省略)中。最好還是隻給css``style =「font-weight:bold」分配給li項目,或者更好地賦予它們類。
我會對你試圖用JavaScript做什麼做最後的猜測。如果你有幾段文字,你想用按鈕隱藏它們,你可以像我這裏未經測試的代碼那樣做。
使用Javascript:
function toggle(id) {
if (document.getElementById(id).style.display == 'block') {
document.getElementById(id).style.display = 'none';
} else {
document.getElementById(id).style.display = 'block';
}
}
HTML:
<div>
<input type="button" name="toggle1" id="toggle1" onclick="toggle('p1')" />
<p id="p1">Lorem ipsum dolor set ... foo a lot of text 1.</p>
<input type="button" name="toggle2" id="toggle2" onclick="toggle('p2')" />
<p id="p2">Lorem ipsum dolor set ... foo a lot of text 2.</p>
</div>
在這種情況下,功能檢查該段是否被顯示或不顯示。顯示值需要設置爲'none'或'block',因爲p元素是塊級元素。
如果您需要任何幫助,請嘗試發佈有關您在腳本中使用的數據的更多特定信息。
編輯: 在下面的代碼中,我改變了JS功能,以一個id(鍵)作爲參數。他們只顯示或隱藏與此密鑰關聯的列表。我改變了按鈕的ID,所以它們不一樣。我還在每一對按鈕和列表中添加了一個div,使其更清晰地表明屬於哪裏。
use strict;
use warnings;
# open of $indexfd filehandle goes here..
my $indexfd;
# print head of HTML page
print $indexfd <<HTML
<html>
<header>
<script type="text/javascript">
function hideit(key) {
document.getElementById(key).style.display = "none";
}
function showit(key) {
document.getElementById(key).style.display = "";
}
</script>
</header>
<body>
HTML
;
# If I see this correctly, %stats_data looks like this:
my %stats_data = (
'out1' => {
'key1' => 'val1',
'key2' => 'val2',
},
'out2' => {
'key1' => 'val1',
'key2' => 'val2',
},
);
my $out = 'out1'; # you need the $out from somewhere
foreach my $key (sort keys %{$stats_data{$out}}) {
print $indexfd
qq~<div id="div_$key">\n~, # Add a div around the $key-elements
qq~<input onclick="showit('$key')" type="button" id="btn_show_$key" value="showit">\n~,
qq~<input onclick="hideit('$key')" type="button" id="btn_show_$key" value="hideit"><br/>\n~,
qq~<ol id="$key"><li><b>$stats_data{$out}->{$key}</b></li></ol>\n~,
qq~</div>\n~;
}
print $indexfd qq~<p>more html...</p></body></html>~;
這是早上有點早,但我不明白你的代碼。你是否將perl代碼嵌入到常規的html文件中?你檢查了結果,以確保它看起來像有效的HTML和JavaScript? – flesk 2012-04-25 05:43:10
我想以一種乾淨的方式顯示我的模擬結果,因此創建一個html文檔。由於結果以不同類型的文件形式分佈在不同的目錄中。它涉及解析來自文件等的信息,所以我正在編寫一個perl腳本來解析文件中的這些信息並創建一個html。我正在循環打印每個圖像的信息。 – torauser1354951 2012-04-25 18:23:19