我有一堆信息页面。目前我对每个不同的页面/主题进行了对话,但我想减少它们以适应5个主题。目前我有这个脚本(和实际链接上的类似),它检查哈希标记并相应地带来正确的信息页面+执行为页面带来对话的功能:
$(document).ready(function() {
var hash = window.location.hash.substr(7);
var locs = ["koti", "espoonk", "luonto", "tyo", "kulttuuri", "kalajarvi", "dalby", "oittaa", "mgolf", "smeds", "marketanpuisto", "hognas", "pirttimaki", "ekumeenink", "kaisankoti", "solvalla", "velskola", "korpilampi", "nuuksio", "majalampi", "juvanmalmi", "rinnekoti", "hognasa", "pellaksenmaki", "royla", "ketunkorpi", "kulloonmaki", "gobbacka", "kalliomaki", "nepperi", "viiskorpi", "antinmaki", "niipperinn", "metsamaa", "odilampi", "lakisto", "lahnus", "koskelonsolmu", "isannansolmu", "auroranportti", "juvansolmu"];
if(navigator.appName == "Microsoft Internet Explorer") {
if ($.inArray(hash, locs) != -1) {
window.location = "indexie.html#kohde-" + hash;
}
else {
window.location = "indexie.html"
}
}
else if ($.inArray(hash, locs) != -1) {
var toLoad = 'info/'+hash+'.html';
$('#info').load(toLoad);
changeTopic(hash);
$('#topicid').val(hash);
}
else {
$('#info').load('info/help.html');
}
});
正如您所看到的,我目前在locs下拥有所有不同的主题,但我不希望这种不同的对话继续进行。 changeTopic(hash)
用于通过在查询字符串xmlhttp.open("POST", "gettopic.php?t="+topic,true);
虽然gettopic.php包含这些行$t=$_GET["t"];
$inf = "SELECT * FROM comments WHERE page = '".$t."' ORDER BY time ASC";
在共同主题下排序不同页面的哪种方式最有效?我猜我可以做5个不同的数组并检查哈希是否属于其中任何一个有5个单独的else if
语句,但这看起来很笨拙。有没有办法将这些不同的页面聚集在gettopic.php中?
//编辑
所以我可以
var hash = window.location.hash.substr(7);
var topic1 = ["loc1", "loc2", "loc3"];
var topic2 = ["loc4", "loc5", "loc6"];
var topic3 = ["loc7", "loc8", "loc9"];
但是这会让我分别检查每一个(有5个而不是3个)
if ($.inArray(hash, topic1) != -1) {
var toLoad = 'info/'+hash+'.html';
$('#info').load(toLoad);
changeTopic(topic1);
$('#topicid').val(topic1);
}
else if ($.inArray(hash, topic2) != -1) {
var toLoad = 'info/'+hash+'.html';
$('#info').load(toLoad);
changeTopic(topic2);
$('#topicid').val(topic2);
}
else if ($.inArray(hash, topic3) != -1) {
var toLoad = 'info/'+hash+'.html';
$('#info').load(toLoad);
changeTopic(topic3);
$('#topicid').val(topic3);
}
我想要的是一种更平滑的方法来检查散列所属的数组,然后只运行一个运行changeTopic(theArrayHashIsIn)
的单个脚本
答案 0 :(得分:1)
好吧,我看到的一个非常引人注目的事情......并且不要将此视为侮辱,但请确保在使用该查询字符串之前逃脱$ t!我们不需要另外在互联网上运行的伟哥网站。
无论如何,试试这个...我认为它可能更符合您的需求。请记住,“真正的”价值可以是任何东西......我只是把'真实'投入了踢。
var tree = {
topic1: {
conversation1: true,
conversation2: true
},
topic2: {
conversation3: true
}
}
var flatMap = {
conversation1: 'topic1',
conversation2: 'topic2',
conversation3: 'topic3'
}
现在,它可能适用于你..如果哈希是'conversation1',你可以通过flatMap进行检查..
var hash = window.location.hash.substr(7); //lets say this is "conversation1"
if(flatMap[hash]) {
//This is one of your conversations, and it'll give you "topic1" as the branch its under.
//as well as giving you the validation that this is indeed a conversation
}
或者,如果您想获得对分支的引用以便打开..
var branch = tree[flatMap[hash]]
那会让你成为一个对象,例如,
{
conversation1: true,
conversation2: true
}
或者,如果您想获得对存储在该位置的数据的引用..
var data = tree[flatMap[hash]][hash]; //This will just be 'true', because that's all we've stored.
有意义吗?
答案 1 :(得分:1)
除非我误解,否则您正在寻找一种将位置哈希(应该等于locs
中的值)映射到主题的方法。在JS中,您可以使用任何对象,数组索引运算符和字符串索引来实现此目的。类似地,PHP中的数组可以有字符串索引,因此您可以使用它们将字符串映射到任何内容。
PHP:
$loc_topics = array(
'koti' => 'topic1',
'espoonk' => 'topic2',
///...
);
if (isset($loc_topics[$hash])) {
$topic = $loc_topics[$hash];
...
} else {
...
}
JS:
var loc_topics = {
koti: 'topic1',
espoonk: 'topic2',
...
};
var topic = loc_topics[hash];
if (topic) {
var toLoad = 'info/'+hash+'.html';
$('#info').load(toLoad);
changeTopic(topic);
$('#topicid').val(topic);
} else {
/* unknown loc/hash */
$('#info').load('info/help.html');
}
如果您已在PHP中定义数组,则可以使用json_encode
生成相应的JS数据结构,因此您不会复制信息并遇到可能导致的问题。在这种情况下,您将创建一个生成JS脚本的PHP脚本:
var loc_topics = <?php echo json_encode($loc_topics) ?>;
...
如果您更改主题,位置或它们之间的关系,您还可以在数据库中将相同的信息存储在与位置和主题相关的表中,这样可以使事情更易于管理。
如果您有locs
和topics
表:
CREATE TABLE locs_topics (
loc INT UNSIGNED NOT NULL,
topic INT UNSIGNED NOT NULL,
INDEX (loc, topic),
INDEX (topic, loc),
FOREIGN KEY loc REFERENCES locs (id),
FOREIGN KEY topic REFERENCES topics (id)
) Engine=InnoDB;
要查询此表:
SELECT t.name
FROM locs AS l
LEFT JOIN locs_topics AS lt ON lt.loc = l.id
LEFT JOIN topics AS t ON t.id = lt.topic
WHERE l.name = ?
如果给定loc没有主题(但定义了loc),则返回NULL。如果没有loc,则返回0行。
如果没有locs
或topics
表(尽管这会导致不一致,例如,如果某行中的字段值存在拼写错误):
CREATE TABLE locs_topics (
loc VARCHAR(32) NOT NULL,
topic VARCHAR(32) NOT NULL,
INDEX (loc, topic),
INDEX (topic, loc)
) Engine=InnoDB;
查询更简单:
SELECT topic
FROM locs_topics
WHERE loc = ?
如果没有loc的主题,或者未定义loc,则返回0行。